diff --git a/.github/workflows/cmake-all.yml b/.github/workflows/cmake-all.yml index bfe53b55a0f..e619a597cf3 100644 --- a/.github/workflows/cmake-all.yml +++ b/.github/workflows/cmake-all.yml @@ -1,6 +1,6 @@ name: CMake all CGAL -on: [push] +on: [push, pull_request] jobs: build: @@ -8,9 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - with: - fetch-depth: 0 + - uses: actions/checkout@v2.0.0 - name: install dependencies run: sudo apt-get install -y libboost-dev libboost-program-options-dev libmpfr-dev libeigen3-dev - name: configure all diff --git a/.travis.yml b/.travis.yml index 80677c4c030..1fbffbcaa3e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,11 +47,11 @@ env: - PACKAGE='Stream_support Subdivision_method_3 Surface_mesh ' - PACKAGE='Surface_mesh_approximation Surface_mesh_deformation Surface_mesh_parameterization ' - PACKAGE='Surface_mesh_segmentation Surface_mesh_shortest_path Surface_mesh_simplification ' - - PACKAGE='Surface_mesh_skeletonization Surface_mesher Surface_sweep_2 ' - - PACKAGE='TDS_2 TDS_3 Testsuite ' - - PACKAGE='Three Triangulation Triangulation_2 ' - - PACKAGE='Triangulation_3 Union_find Visibility_2 ' - - PACKAGE='Voronoi_diagram_2 wininst ' + - PACKAGE='Surface_mesh_skeletonization Surface_mesh_topology Surface_mesher ' + - PACKAGE='Surface_sweep_2 TDS_2 TDS_3 ' + - PACKAGE='Testsuite Three Triangulation ' + - PACKAGE='Triangulation_2 Triangulation_3 Union_find ' + - PACKAGE='Visibility_2 Voronoi_diagram_2 wininst ' compiler: clang install: - echo "$PWD" diff --git a/.travis/packages.txt b/.travis/packages.txt index 8bcfe911043..731c19e675c 100644 --- a/.travis/packages.txt +++ b/.travis/packages.txt @@ -122,6 +122,7 @@ Surface_mesh_segmentation Surface_mesh_shortest_path Surface_mesh_simplification Surface_mesh_skeletonization +Surface_mesh_topology Surface_mesher Surface_sweep_2 TDS_2 diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h index 613723bdef3..a6348816d31 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h @@ -75,7 +75,7 @@ using Intersection_and_primitive_id = unspecified_type; /// \name Splitting /// During the construction of the AABB tree, the primitives are -/// splitted according to some comparison functions related to the longest axis: +/// split according to some comparison functions related to the longest axis: /// @{ /*! diff --git a/Apollonius_graph_2/include/CGAL/Hyperbola_segment_2.h b/Apollonius_graph_2/include/CGAL/Hyperbola_segment_2.h index 318a7d0643b..0a8d0357fb6 100644 --- a/Apollonius_graph_2/include/CGAL/Hyperbola_segment_2.h +++ b/Apollonius_graph_2/include/CGAL/Hyperbola_segment_2.h @@ -83,6 +83,10 @@ public: this->p2 = p2; } + int compute_k(const FT tt) const { + return int(CGAL::to_double(CGAL::sqrt(tt / this->STEP))); + } + void generate_points(std::vector& p) const { if ( CGAL::is_zero(this->r) ) { @@ -91,76 +95,70 @@ public: return; } - - // FT STEP = W.width() / 100.0; - FT s0, s1; s0 = t(p1); s1 = t(p2); - if (CGAL::compare(s0, s1) == LARGER) { + if (CGAL::compare(s0, s1) == LARGER) std::swap(s0, s1); - } p.clear(); - if ( !(CGAL::is_positive(s0)) && - !(CGAL::is_negative(s1)) ) { - FT tt; - int k; + if ( !(CGAL::is_positive(s0)) && !(CGAL::is_negative(s1)) ) + { + FT tt = FT(-this->STEP); + int k = -1; p.push_back( this->o ); - k = 1; - tt = FT(-this->STEP); - while ( CGAL::compare(tt, s0) == LARGER ) { - p.insert( p.begin(), f(tt) ); - k--; - tt = -FT(k * k) * this->STEP; + + while ( CGAL::compare(tt, s0) == LARGER ) + { + p.insert( p.begin(), f(tt) ); + --k; + tt = - FT(k * k) * this->STEP; } + p.insert( p.begin(), f(s0) ); k = 1; tt = FT(this->STEP); - while ( CGAL::compare(tt, s1) == SMALLER ) { - p.push_back( f(tt) ); - k++; - tt = FT(k * k) * this->STEP; + while ( CGAL::compare(tt, s1) == SMALLER ) + { + p.push_back( f(tt) ); + ++k; + tt = FT(k * k) * this->STEP; } p.push_back( f(s1) ); - } else if ( !(CGAL::is_negative(s0)) && - !(CGAL::is_negative(s1)) ) { - FT tt; - int k; + } + else if ( !(CGAL::is_negative(s0)) && !(CGAL::is_negative(s1)) ) + { + FT tt = s0; + int k = - compute_k(-tt); - - p.push_back( f(s0) ); - - tt = s0; - k = int(CGAL::to_double(CGAL::sqrt(tt / this->STEP))); - - while ( CGAL::compare(tt, s1) == SMALLER ) { - if ( CGAL::compare(tt, s0) != SMALLER ) - p.push_back( f(tt) ); - k++; - tt = FT(k * k) * this->STEP; + do + { + p.push_back( f(tt) ); + ++k; + tt = FT(k * k) * this->STEP; } - p.push_back( f(s1) ); - } else { - FT tt; - int k; + while ( CGAL::compare(tt, s0) == LARGER && CGAL::compare(tt, s1) == SMALLER ); p.push_back( f(s1) ); + } + else + { + FT tt = s1; + int k = compute_k(tt); - tt = s1; - k = int(CGAL::to_double(-CGAL::sqrt(-tt / this->STEP))); - - while ( CGAL::compare(tt, s0) == LARGER ) { - if ( CGAL::compare(tt, s1) != LARGER ) - p.push_back( f(tt) ); - k--; - tt = -FT(k * k) * this->STEP; + do + { + p.push_back( f(tt) ); + --k; + tt = - FT(k * k) * this->STEP; } + while ( CGAL::compare(tt, s0) == LARGER && CGAL::compare(tt, s1) == SMALLER ); + p.push_back( f(s0) ); } } diff --git a/Apollonius_graph_2/include/CGAL/Parabola_segment_2.h b/Apollonius_graph_2/include/CGAL/Parabola_segment_2.h index 52cbc6c72de..b44cc83461e 100644 --- a/Apollonius_graph_2/include/CGAL/Parabola_segment_2.h +++ b/Apollonius_graph_2/include/CGAL/Parabola_segment_2.h @@ -62,85 +62,101 @@ public: this->p2 = p2; } - int compute_k(const FT& tt) const { - return int(CGAL::sqrt(CGAL::to_double(tt) / 2)); + int compute_k(const FT tt, const FT STEP) const { + return int(CGAL::to_double(CGAL::sqrt(tt / STEP))); } + // s0 and s1 define a desired drawing "range" void generate_points(std::vector& p, - const FT STEP = FT(2)) const + const FT STEP, + FT s0, FT s1) const { - FT s0, s1; - - s0 = t(p1); - s1 = t(p2); - - if (CGAL::compare(s0, s1) == LARGER) { - std::swap(s0, s1); - } + CGAL_precondition(STEP > 0); + CGAL_precondition(s0 < s1); p.clear(); - if ( !(CGAL::is_positive(s0)) && - !(CGAL::is_negative(s1)) ) { - FT tt; - int k; + if (CGAL::compare(s0, s1) == LARGER) + std::swap(s0, s1); + + // This is a parabola segment that exists between only between p1 and p2 so we gotta crop + // the desired range to actually fit the parabola segment + FT tp1 = t(p1), tp2 = t(p2); + + if (CGAL::compare(tp1, tp2) == LARGER) + std::swap(tp1, tp2); + + if(tp2 < s0 || s1 < tp1) // nothing to draw because the ranges are completely disjoint + return; + + s0 = (std::max)(s0, tp1); + s1 = (std::min)(s1, tp2); + + if ( !(CGAL::is_positive(s0)) && !(CGAL::is_negative(s1)) ) + { + FT tt = - STEP; + int k = -1; p.push_back( this->o ); - k = -1; - tt = - STEP; - while ( CGAL::compare(tt, s0) == LARGER ) { - p.insert( p.begin(), f(tt) ); - k--; - tt = -FT(k * k) * STEP; + // no need to check tt < s1 since we have tt < 0, s1 >= 0 and tt is moving towards -inf + while ( CGAL::compare(tt, s0) == LARGER ) + { + p.insert( p.begin(), f(tt) ); + --k; + tt = - FT(k * k) * STEP; } p.insert( p.begin(), f(s0) ); k = 1; tt = STEP; - while ( CGAL::compare(tt, s1) == SMALLER ) { - p.push_back( f(tt) ); - k++; - tt = FT(k * k) * STEP; + + // no need to check tt > s0 since we have tt > 0, s0 <= 0 and tt is moving towards +inf + while ( CGAL::compare(tt, s1) == SMALLER ) + { + p.push_back( f(tt) ); + ++k; + tt = FT(k * k) * STEP; } p.push_back( f(s1) ); - } else if ( !(CGAL::is_negative(s0)) && - !(CGAL::is_negative(s1)) ) { - FT tt; - int k; + } + else if ( !(CGAL::is_negative(s0)) && !(CGAL::is_negative(s1)) ) + { + FT tt = s0; + int k = compute_k(tt, STEP); - - p.push_back( f(s0) ); - - tt = s0; - k = compute_k(tt); - - while ( CGAL::compare(tt, s1) == SMALLER ) { - if ( CGAL::compare(tt, s0) != SMALLER ) - p.push_back( f(tt) ); - k++; - tt = FT(k * k) * STEP; + do + { + p.push_back( f(tt) ); + ++k; + tt = FT(k * k) * STEP; } - p.push_back( f(s1) ); - } else { - FT tt; - int k; + while ( CGAL::compare(tt, s0) == LARGER && CGAL::compare(tt, s1) == SMALLER ); p.push_back( f(s1) ); + } + else + { + FT tt = s1; + int k = - compute_k(-tt, STEP); - tt = s1; - k = -compute_k(-tt); - - while ( CGAL::compare(tt, s0) == LARGER ) { - if ( CGAL::compare(tt, s1) != LARGER ) - p.push_back( f(tt) ); - k--; - tt = -FT(k * k) * STEP; + do + { + p.push_back( f(tt) ); + --k; + tt = - FT(k * k) * STEP; } + while ( CGAL::compare(tt, s0) == LARGER && CGAL::compare(tt, s1) == SMALLER ); + p.push_back( f(s0) ); } } + void generate_points(std::vector& p, + const FT STEP = FT(2)) const + { + return generate_points(p, STEP, t(p1), t(p2)); + } template< class Stream > void draw(Stream& W) const diff --git a/BGL/include/CGAL/boost/graph/named_params_helper.h b/BGL/include/CGAL/boost/graph/named_params_helper.h index 47191997c31..4c432a311c6 100644 --- a/BGL/include/CGAL/boost/graph/named_params_helper.h +++ b/BGL/include/CGAL/boost/graph/named_params_helper.h @@ -112,7 +112,8 @@ namespace CGAL { typedef typename boost::property_traits::value_type type; }; - template + template > class GetVertexPointMap { typedef typename property_map_selector::const_type diff --git a/BGL/include/CGAL/boost/graph/parameters_interface.h b/BGL/include/CGAL/boost/graph/parameters_interface.h index 87db07d59ad..ebdce042e75 100644 --- a/BGL/include/CGAL/boost/graph/parameters_interface.h +++ b/BGL/include/CGAL/boost/graph/parameters_interface.h @@ -82,6 +82,9 @@ CGAL_add_named_parameter(use_angle_smoothing_t, use_angle_smoothing, use_angle_s CGAL_add_named_parameter(use_area_smoothing_t, use_area_smoothing, use_area_smoothing) CGAL_add_named_parameter(use_Delaunay_flips_t, use_Delaunay_flips, use_Delaunay_flips) CGAL_add_named_parameter(do_project_t, do_project, do_project) +CGAL_add_named_parameter(area_threshold_t, area_threshold, area_threshold) +CGAL_add_named_parameter(volume_threshold_t, volume_threshold, volume_threshold) +CGAL_add_named_parameter(dry_run_t, dry_run, dry_run) // List of named parameters that we use in the package 'Surface Mesh Simplification' CGAL_add_named_parameter(get_cost_policy_t, get_cost_policy, get_cost) diff --git a/BGL/include/CGAL/boost/graph/selection.h b/BGL/include/CGAL/boost/graph/selection.h index e023e68ca44..769561cd705 100644 --- a/BGL/include/CGAL/boost/graph/selection.h +++ b/BGL/include/CGAL/boost/graph/selection.h @@ -578,7 +578,7 @@ void expand_face_selection_for_removal(const FaceRange& faces_to_be_deleted, next_around_vertex = opposite( next(hd, tm), tm); if (hd==start) break; } - if ( get(is_selected, face(next_around_vertex, tm) ) ) continue; //all incident faces will be removed + if ( is_border(next_around_vertex,tm) || get(is_selected, face(next_around_vertex, tm) ) ) continue; //all incident faces will be removed while( true ) { @@ -600,7 +600,7 @@ void expand_face_selection_for_removal(const FaceRange& faces_to_be_deleted, break; next_around_vertex = opposite( next(next_around_vertex, tm), tm); } - while( get(is_selected, face(next_around_vertex, tm) ) ); + while(is_border(next_around_vertex,tm) || get(is_selected, face(next_around_vertex, tm) ) ); if (next_around_vertex==start) break; diff --git a/BGL/test/BGL/test_cgal_bgl_named_params.cpp b/BGL/test/BGL/test_cgal_bgl_named_params.cpp index 70b757b4af0..c3a577f20e3 100644 --- a/BGL/test/BGL/test_cgal_bgl_named_params.cpp +++ b/BGL/test/BGL/test_cgal_bgl_named_params.cpp @@ -91,6 +91,9 @@ void test(const NamedParameters& np) assert(get_parameter(np, CGAL::internal_np::use_area_smoothing).v == 54); assert(get_parameter(np, CGAL::internal_np::use_Delaunay_flips).v == 55); assert(get_parameter(np, CGAL::internal_np::use_safety_constraints).v == 56); + assert(get_parameter(np, CGAL::internal_np::area_threshold).v == 57); + assert(get_parameter(np, CGAL::internal_np::volume_threshold).v == 58); + assert(get_parameter(np, CGAL::internal_np::dry_run).v == 59); // Named parameters that we use in the package 'Surface Mesh Simplification' assert(get_parameter(np, CGAL::internal_np::get_cost_policy).v == 34); @@ -175,6 +178,9 @@ void test(const NamedParameters& np) check_same_type<54>(get_parameter(np, CGAL::internal_np::use_area_smoothing)); check_same_type<55>(get_parameter(np, CGAL::internal_np::use_Delaunay_flips)); check_same_type<56>(get_parameter(np, CGAL::internal_np::use_safety_constraints)); + check_same_type<57>(get_parameter(np, CGAL::internal_np::area_threshold)); + check_same_type<58>(get_parameter(np, CGAL::internal_np::volume_threshold)); + check_same_type<59>(get_parameter(np, CGAL::internal_np::dry_run)); // Named parameters that we use in the package 'Surface Mesh Simplification' check_same_type<34>(get_parameter(np, CGAL::internal_np::get_cost_policy)); @@ -265,6 +271,9 @@ int main() .use_area_smoothing(A<54>(54)) .use_Delaunay_flips(A<55>(55)) .use_safety_constraints(A<56>(56)) + .area_threshold(A<57>(57)) + .volume_threshold(A<58>(58)) + .dry_run(A<59>(59)) ); return EXIT_SUCCESS; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 42d5a12ca76..1551bff9f46 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -41,6 +41,9 @@ #include #include #include +#include +#include + #include #if defined( __INTEL_COMPILER ) @@ -55,6 +58,16 @@ _Pragma("GCC diagnostic ignored \"-Warray-bounds\"") #endif namespace CGAL { + // functions to allow the call to next/opposite by ADL + template + auto CM_ADL_next(Desc&& d, G&& g) { + return next(std::forward(d), std::forward(g)); + } + + template + auto CM_ADL_opposite(Desc&& d, G&& g) { + return opposite(std::forward(d), std::forward(g)); + } /** @file Combinatorial_map.h * Definition of generic dD Combinatorial map. @@ -199,18 +212,27 @@ namespace CGAL { CGAL_assertion(number_of_darts()==0); } - /** Copy the given combinatorial map into *this. + /** Copy the given combinatorial map 'amap' into *this. * Note that both CMap can have different dimensions and/or non void attributes. * @param amap the combinatorial map to copy. * @post *this is valid. */ - template - void copy(const CMap2& amap, const Converters& converters, + void copy(const Combinatorial_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, const PointConverter& pointconverter, - boost::unordered_map* dart_mapping=nullptr) + boost::unordered_map + :: + Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { + typedef Combinatorial_map_base CMap2; this->clear(); this->mnb_used_marks = amap.mnb_used_marks; @@ -232,81 +254,113 @@ namespace CGAL { // Create an mapping between darts of the two maps (originals->copies). // (here we cannot use CGAL::Unique_hash_map because it does not provide // iterators... - boost::unordered_map local_dartmap; - if (dart_mapping==nullptr) - { dart_mapping=&local_dartmap; } - + boost::unordered_map + local_dartmap; + if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map + { origin_to_copy=&local_dartmap; } + + Dart_handle new_dart; for (typename CMap2::Dart_const_range::const_iterator it=amap.darts().begin(), itend=amap.darts().end(); it!=itend; ++it) { - (*dart_mapping)[it]=mdarts.emplace(); - init_dart((*dart_mapping)[it], amap.get_marks(it)); - internal::Copy_dart_info_functor::run - (amap, static_cast(*this), it, (*dart_mapping)[it], - dartinfoconverter); + new_dart=mdarts.emplace(); + init_dart(new_dart, amap.get_marks(it)); + + (*origin_to_copy)[it]=new_dart; + if (copy_to_origin!=NULL) { (*copy_to_origin)[new_dart]=it; } + + internal::Copy_dart_info_functor::run + (static_cast(amap), static_cast(*this), + it, new_dart, dartinfoconverter); } unsigned int min_dim=(dimension - ::iterator dartmap_iter, dartmap_iter_end=dart_mapping->end(); - for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end; + ::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end(); + for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end; ++dartmap_iter) { for (unsigned int i=0; i<=min_dim; i++) { if (!amap.is_free(dartmap_iter->first,i) && - (dartmap_iter->first)<(amap.beta(dartmap_iter->first,i))) + is_free(dartmap_iter->second,i)) { basic_link_beta(dartmap_iter->second, - (*dart_mapping)[amap.beta(dartmap_iter->first,i)], i); + (*origin_to_copy)[amap.beta(dartmap_iter->first,i)], i); } } } /** Copy attributes */ - for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end; + for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end; ++dartmap_iter) { Helper::template Foreach_enabled_attributes - < internal::Copy_attributes_functor >:: - run(amap, static_cast(*this), + run(static_cast(amap), static_cast(*this), dartmap_iter->first, dartmap_iter->second, converters, pointconverter); } - CGAL_assertion (is_valid () == 1); + CGAL_assertion (is_valid()); } - template - void copy(const CMap2& amap, - boost::unordered_map* dart_mapping=nullptr) + template + void copy(const Combinatorial_map_base& amap, + boost::unordered_map + ::Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { - std::tuple<> converters; - Default_converter_dart_info dartinfoconverter; - Default_converter_cmap_0attributes_with_point pointconverter; - copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); + CGAL::cpp11::tuple<> converters; + Default_converter_dart_info dartinfoconverter; + Default_converter_cmap_0attributes_with_point pointconverter; + copy(amap, converters, dartinfoconverter, pointconverter, + origin_to_copy, copy_to_origin); } - template - void copy(const CMap2& amap, const Converters& converters, - boost::unordered_map* dart_mapping=nullptr) + template + void copy(const Combinatorial_map_base& amap, + const Converters& converters, + boost::unordered_map + ::Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { - Default_converter_cmap_0attributes_with_point pointconverter; - Default_converter_dart_info dartinfoconverter; - copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); + Default_converter_cmap_0attributes_with_point pointconverter; + Default_converter_dart_info dartinfoconverter; + copy(amap, converters, dartinfoconverter, pointconverter, + origin_to_copy, copy_to_origin); } - template - void copy(const CMap2& amap, const Converters& converters, + template + void copy(const Combinatorial_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, - boost::unordered_map* dart_mapping=nullptr) + boost::unordered_map + ::Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { - Default_converter_cmap_0attributes_with_point pointconverter; - copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); + Default_converter_cmap_0attributes_with_point pointconverter; + copy(amap, converters, dartinfoconverter, pointconverter, + origin_to_copy, copy_to_origin); } // Copy constructor from a map having exactly the same type. @@ -314,25 +368,37 @@ namespace CGAL { { copy(amap); } // "Copy constructor" from a map having different type. - template - Combinatorial_map_base(const CMap2& amap) + template + Combinatorial_map_base(const Combinatorial_map_base& amap) { copy(amap); } // "Copy constructor" from a map having different type. - template - Combinatorial_map_base(const CMap2& amap, Converters& converters) + template + Combinatorial_map_base(const Combinatorial_map_base& amap, + const Converters& converters) { copy(amap, converters); } // "Copy constructor" from a map having different type. - template - Combinatorial_map_base(const CMap2& amap, Converters& converters, + template + Combinatorial_map_base(const Combinatorial_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter) { copy(amap, converters, dartinfoconverter); } // "Copy constructor" from a map having different type. - template - Combinatorial_map_base(const CMap2& amap, Converters& converters, + template + Combinatorial_map_base(const Combinatorial_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, const PointConverter& pointconverter) { copy(amap, converters, dartinfoconverter, pointconverter); } @@ -385,6 +451,62 @@ namespace CGAL { } } + /** Import the given hds which should be a model of an halfedge graph. */ + template + void import_from_halfedge_graph(const HEG& heg, + boost::unordered_map + ::halfedge_descriptor, + Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::halfedge_descriptor>* + copy_to_origin=NULL) + + { + // Create an mapping between darts of the two maps (originals->copies). + // (here we cannot use CGAL::Unique_hash_map because it does not provide + // iterators... + boost::unordered_map + ::halfedge_descriptor, + Dart_handle> local_dartmap; + if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map + { origin_to_copy=&local_dartmap; } + + Dart_handle new_dart; + for (typename boost::graph_traits::halfedge_iterator + it=halfedges(heg).begin(), itend=halfedges(heg).end(); + it!=itend; ++it) + { + if (!CGAL::is_border(*it, heg)) + { + new_dart=mdarts.emplace(); + (*origin_to_copy)[*it]=new_dart; + if (copy_to_origin!=NULL) { (*copy_to_origin)[new_dart]=*it; } + } + } + + typename boost::unordered_map + ::halfedge_descriptor, + Dart_handle>::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end(); + for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end; + ++dartmap_iter) + { + basic_link_beta(dartmap_iter->second, + (*origin_to_copy)[CM_ADL_next(dartmap_iter->first, heg)], + 1); + + if (!CGAL::is_border(CM_ADL_opposite(dartmap_iter->first, heg), heg) && + (dartmap_iter->first)first, heg)) + { + basic_link_beta(dartmap_iter->second, + (*origin_to_copy) + [CM_ADL_opposite(dartmap_iter->first, heg)], 2); + } + } + + CGAL_assertion (is_valid()); + } + /** Clear the combinatorial map. Remove all darts and all attributes. * Note that reserved marks are not free. */ @@ -498,6 +620,16 @@ namespace CGAL { { return mdarts.iterator_to(adart); } Dart_const_handle dart_handle(const Dart& adart) const { return mdarts.iterator_to(adart); } + Dart_handle dart_handle(size_type i) + { + CGAL_assertion(darts().is_used(i)); + return mdarts.iterator_to(darts()[i]); + } + Dart_const_handle dart_handle(size_type i) const + { + CGAL_assertion(darts().is_used(i)); + return mdarts.iterator_to(darts()[i]); + } /** Return the highest dimension for which dh is not free. * @param dh a dart handle @@ -673,6 +805,11 @@ namespace CGAL { Dart_const_handle next(Dart_const_handle ADart) const { return this->template beta<1>(ADart); } + Dart_handle opposite2(Dart_handle ADart) + { return this->template beta<2>(ADart); } + Dart_const_handle opposite2(Dart_const_handle ADart) const + { return this->template beta<2>(ADart); } + template Dart_handle opposite(Dart_handle ADart) { return this->template beta(ADart); } @@ -950,6 +1087,27 @@ namespace CGAL { mnb_times_reserved_marks[amark]=0; } + template + bool belong_to_same_cell(Dart_const_handle adart1, + Dart_const_handle adart2) const + { return CGAL::belong_to_same_cell(*this, adart1, adart2); } + + template + bool is_whole_cell_unmarked(Dart_const_handle adart, size_type amark) const + { return CGAL::is_whole_cell_unmarked(*this, adart, amark); } + + template + bool is_whole_cell_marked(Dart_const_handle adart, size_type amark) const + { return CGAL::is_whole_cell_marked(*this, adart, amark); } + + template + size_type mark_cell(Dart_const_handle adart, size_type amark) const + { return CGAL::mark_cell(*this, adart, amark); } + + template + size_type unmark_cell(Dart_const_handle adart, size_type amark) const + { return CGAL::unmark_cell(*this, adart, amark); } + /** Test if this map is without boundary for a given dimension. * @param i the dimension. * @return true iff all the darts are not i-free. @@ -2300,6 +2458,30 @@ namespace CGAL { run(*this, adart, amark); } + /// Keep the biggest connected component. + /// @return the size (in number of darts) of the biggest cc. + std::size_t keep_biggest_connected_component() + { + std::map ccs; + + size_type treated=get_new_mark(); + for (auto it=darts().begin(), itend=darts().end(); it!=itend; ++it) + { + if (!is_marked(it, treated)) + { ccs[mark_cell(it, treated)]=it; } + } + + if (ccs.size()>1) + { // Here all darts are marked + this->template unmark_cell(ccs.rbegin()->second, treated); // Unmark the biggest cc + erase_marked_darts(treated); + } + + free_mark(treated); + + return ccs.rbegin()->first; + } + /** Count the marked cells (at least one marked dart). * @param amark the mark to consider. * @param avector containing the dimensions of the cells to count. @@ -2433,6 +2615,64 @@ namespace CGAL { } public: + + /// @return the positive turn between the two given darts. + // @pre beta1(d1) and d2 must belong to the same vertex. + std::size_t positive_turn(Dart_const_handle d1, Dart_const_handle d2) const + { + CGAL_assertion((!this->template is_free<1>(d1))); + /* CGAL_assertion((belong_to_same_cell<0>(this->template beta<1>(d1), + d2))); */ + + if (d2==beta<2>(d1)) { return 0; } + + Dart_const_handle dd1=d1; + std::size_t res=1; + while (beta<1>(dd1)!=d2) + { + if (this->template is_free<2>(beta<1>(dd1))) + { return std::numeric_limits::max(); } + + ++res; + dd1=beta<1, 2>(dd1); + + CGAL_assertion(!this->template is_free<1>(dd1)); + CGAL_assertion(beta<1>(dd1)==d2 || dd1!=d1); + } + return res; + } + + /// @return the negative turn between the two given darts. + // @pre beta1(d1) and d2 must belong to the same vertex. + std::size_t negative_turn(Dart_const_handle d1, Dart_const_handle d2) const + { + CGAL_assertion((!this->template is_free<1>(d1))); + /* CGAL_assertion((belong_to_same_cell<0>(this->template beta<1>(d1), + d2))); */ + + if (d2==beta<2>(d1)) { return 0; } + + if (this->template is_free<2>(d1) || this->template is_free<2>(d2)) + { return std::numeric_limits::max(); } + + d1=beta<2>(d1); + d2=beta<2>(d2); + Dart_const_handle dd1=d1; + std::size_t res=1; + while (beta<0>(dd1)!=d2) + { + if (this->template is_free<2>(beta<0>(dd1))) + { return std::numeric_limits::max(); } + + ++res; + dd1=beta<0, 2>(dd1); + + CGAL_assertion(!this->template is_free<0>(dd1)); + CGAL_assertion(beta<0>(dd1)==d2 || dd1!=d1); + } + return res; + } + /** Erase marked darts from the map. * Marked darts are unlinked before to be removed, thus surviving darts * are correctly linked, but the map is not necessarily valid depending @@ -3513,12 +3753,12 @@ namespace CGAL { !is_face_combinatorial_polygon(d4, 3) ) return false; // TODO do better with marks (?). - if ( belong_to_same_cell(*this, d1, d2) || - belong_to_same_cell(*this, d1, d3) || - belong_to_same_cell(*this, d1, d4) || - belong_to_same_cell(*this, d2, d3) || - belong_to_same_cell(*this, d2, d4) || - belong_to_same_cell(*this, d3, d4) ) return false; + if ( belong_to_same_cell<2,1>(d1, d2) || + belong_to_same_cell<2,1>(d1, d3) || + belong_to_same_cell<2,1>(d1, d4) || + belong_to_same_cell<2,1>(d2, d3) || + belong_to_same_cell<2,1>(d2, d4) || + belong_to_same_cell<2,1>(d3, d4) ) return false; if ( beta(d1,1,2)!=beta(d3,0) || beta(d4,0,2)!=beta(d3,1) || @@ -3611,21 +3851,21 @@ namespace CGAL { !is_face_combinatorial_polygon(d6, 4) ) return false; // TODO do better with marks. - if ( belong_to_same_cell(*this, d1, d2) || - belong_to_same_cell(*this, d1, d3) || - belong_to_same_cell(*this, d1, d4) || - belong_to_same_cell(*this, d1, d5) || - belong_to_same_cell(*this, d1, d6) || - belong_to_same_cell(*this, d2, d3) || - belong_to_same_cell(*this, d2, d4) || - belong_to_same_cell(*this, d2, d5) || - belong_to_same_cell(*this, d2, d6) || - belong_to_same_cell(*this, d3, d4) || - belong_to_same_cell(*this, d3, d5) || - belong_to_same_cell(*this, d3, d6) || - belong_to_same_cell(*this, d4, d5) || - belong_to_same_cell(*this, d4, d6) || - belong_to_same_cell(*this, d5, d6) ) + if ( belong_to_same_cell<2,1>(d1, d2) || + belong_to_same_cell<2,1>(d1, d3) || + belong_to_same_cell<2,1>(d1, d4) || + belong_to_same_cell<2,1>(d1, d5) || + belong_to_same_cell<2,1>(d1, d6) || + belong_to_same_cell<2,1>(d2, d3) || + belong_to_same_cell<2,1>(d2, d4) || + belong_to_same_cell<2,1>(d2, d5) || + belong_to_same_cell<2,1>(d2, d6) || + belong_to_same_cell<2,1>(d3, d4) || + belong_to_same_cell<2,1>(d3, d5) || + belong_to_same_cell<2,1>(d3, d6) || + belong_to_same_cell<2,1>(d4, d5) || + belong_to_same_cell<2,1>(d4, d6) || + belong_to_same_cell<2,1>(d5, d6) ) return false; if ( beta(d1,2) !=beta(d4,1,1) || @@ -3781,7 +4021,7 @@ namespace CGAL { return this->template beta<1>(adart); } - /** Insert a vertex in the given 2-cell which is splitted in triangles, + /** Insert a vertex in the given 2-cell which is split in triangles, * once for each inital edge of the facet. * @param adart a dart of the facet to triangulate. * @param update_attributes a boolean to update the enabled attributes @@ -4213,7 +4453,7 @@ namespace CGAL { if ( od==null_handle ) return false; // of and *it must belong to the same vertex of the same volume - if ( !belong_to_same_cell(*this, od, *it) ) + if ( !belong_to_same_cell<0, 2>(od, *it) ) return false; } prec = *it; @@ -4223,7 +4463,7 @@ namespace CGAL { od = other_extremity(prec); if ( od==null_handle ) return false; - if (!belong_to_same_cell(*this, od, *afirst)) + if (!belong_to_same_cell<0, 2>(od, *afirst)) return false; return true; @@ -4437,24 +4677,33 @@ namespace CGAL { Combinatorial_map(const Self & amap) : Base(amap) {} - template < class CMap > - Combinatorial_map(const CMap & amap) : Base(amap) + template + Combinatorial_map(const Combinatorial_map_base& + amap) : Base(amap) {} - template < class CMap, typename Converters > - Combinatorial_map(const CMap & amap, const Converters& converters) : + template + Combinatorial_map(const Combinatorial_map_base& + amap, const Converters& converters) : Base(amap, converters) {} - template < class CMap, typename Converters, typename DartInfoConverter > - Combinatorial_map(const CMap & amap, const Converters& converters, + template + Combinatorial_map(const Combinatorial_map_base& + amap, const Converters& converters, const DartInfoConverter& dartinfoconverter) : Base(amap, converters, dartinfoconverter) {} - template < class CMap, typename Converters, typename DartInfoConverter, - typename PointConverter > - Combinatorial_map(const CMap & amap, const Converters& converters, + template + Combinatorial_map(const Combinatorial_map_base& + amap, const Converters& converters, const DartInfoConverter& dartinfoconverter, const PointConverter& pointconverter) : Base(amap, converters, dartinfoconverter, pointconverter) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h index 2a0a2018d02..2c289df31bc 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h @@ -194,7 +194,7 @@ namespace CGAL typename Map::size_type amark) { return CGAL::is_whole_orbit_unmarked::iterator> + typename Map::template Dart_of_cell_range::const_iterator> (amap, adart, amark); } diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h b/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h index 74fa659825a..fa2bee50c3e 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_insertions.h @@ -39,7 +39,7 @@ insert_cell_0_in_cell_1( CMap& amap, typename CMap::Dart_handle adart, return amap.insert_cell_0_in_cell_1(adart, ah, update_attributes); } -/** Insert a vertex in the given 2-cell which is splitted in triangles, +/** Insert a vertex in the given 2-cell which is split in triangles, * once for each inital edge of the facet. * @param amap the used combinatorial map. * @param adart a dart of the facet to triangulate. diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h index 0aed0028bea..b0f2943c707 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h @@ -106,7 +106,7 @@ namespace CGAL { { return ( ((*this==mmap->null_handle) && (aiterator==mmap->null_handle)) || (mfirst_dart == aiterator.mfirst_dart && - static_cast(*this)== + static_cast(*this)== static_cast(aiterator)) ); } diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h index 8158718153d..70ab1e3b1dd 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h @@ -127,6 +127,8 @@ namespace CGAL { CGAL_assertion(i <= dimension); return dh->mf[i]==null_dart_handle; } + bool is_perforated(Dart_const_handle /*dh*/) const + { return false; } /// Set simultaneously all the marks of this dart to a given value. void set_dart_marks(Dart_const_handle ADart, diff --git a/Combinatorial_map/include/CGAL/Face_graph_wrapper.h b/Combinatorial_map/include/CGAL/Face_graph_wrapper.h new file mode 100644 index 00000000000..a0915e45758 --- /dev/null +++ b/Combinatorial_map/include/CGAL/Face_graph_wrapper.h @@ -0,0 +1,941 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_FACE_GRAPH_WRAPPER_H +#define CGAL_FACE_GRAPH_WRAPPER_H 1 + +#include +#include +#include +#include +#include +#include + +namespace CGAL +{ + // Forward declarations of all classes model of Face_graph + template + class Combinatorial_map_base; + + template + class Generalized_map_base; + + template + class Map, typename Refs, typename Storage> + class Linear_cell_complex_base; + + template + class Combinatorial_map; + + template + class Generalized_map; + + template + class Map, typename Storage> + class Linear_cell_complex_for_combinatorial_map; + + template + class Map, typename Storage> + class Linear_cell_complex_for_generalized_map; + + namespace Surface_mesh_topology + { + template + class Polygonal_schema_with_combinatorial_map; + + template + class Polygonal_schema_with_generalized_map; + } + +//////////////////////////////////////////////////////////////////////////////// +/** Class Face_graph_wrapper: to wrap any model of FaceGraph into a + * Combinatorial map. For now, only for const models, i.e. does not support + * modification operators. + */ +template +class Face_graph_wrapper +{ +public: + typedef HEG_ HEG; + typedef Face_graph_wrapper Self; + typedef std::size_t size_type; + + struct Dart_container + { + typedef typename boost::graph_traits::halfedge_iterator iterator; + typedef typename boost::graph_traits::halfedge_iterator const_iterator; // TODO ? + // typedef My_halfedge_iterator iterator; + // typedef My_halfedge_iterator const_iterator; // TODO ? + }; + + typedef typename boost::graph_traits::halfedge_descriptor Dart_handle; + typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; + + typedef Dart_handle Null_handle_type; + // typedef CGAL::Void* Null_handle_type; + static const Null_handle_type null_handle; //=Dart_handle(); + static const Null_handle_type null_dart_handle; //=Dart_handle(); + + /// Number of marks + static const size_type NB_MARKS = 32; + static const size_type INVALID_MARK = NB_MARKS; + + /// The dimension of the combinatorial map. + static const unsigned int dimension=2; + static const unsigned int ambient_dimension=3; + + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef boost::undirected_tag directed_category; + typedef boost::disallow_parallel_edge_tag edge_parallel_category; + + struct SM_graph_traversal_category : public virtual boost::bidirectional_graph_tag, + public virtual boost::vertex_list_graph_tag, + public virtual boost::edge_list_graph_tag + {}; + typedef SM_graph_traversal_category traversal_category; + + + Face_graph_wrapper(const HEG& f) : m_fg(f), + mdarts(*this), + m_nb_darts(0), + mnb_used_marks(0) + + { + mmask_marks.reset(); + + for (size_type i=0; i >(), m_fg); + for (typename Dart_range::const_iterator it(darts().begin()), + itend(darts().end()); it!=itend; ++it) + { put(m_all_marks, it, std::bitset()); } + } + + const HEG& get_fg() const + { return m_fg; } + + template + bool is_free(Dart_const_handle /* dh */) const + { return false; } // Not possible to have a free dart with an HEG. + bool is_free(Dart_const_handle /*dh*/, unsigned int /*i*/) const + { return false; } // Not possible to have a free dart with an HEG. + + bool is_perforated(Dart_const_handle dh) const + { return is_border(dh, m_fg); } + + Dart_const_handle get_beta(Dart_const_handle ADart, int B1) const + { + CGAL_assertion(B1>=0 && B1<=static_cast(dimension)); + if (B1==1) return Get_beta::value(m_fg, ADart); + if (B1==2) return Get_beta::value(m_fg, ADart); + return Get_beta::value(m_fg, ADart); + } + template + Dart_const_handle get_beta(Dart_const_handle ADart) const + { + CGAL_assertion(B1>=0 && B1<=static_cast(dimension)); + return Get_beta::value(m_fg, ADart); + } + + bool is_empty() const + { return number_of_darts()==0; } + + /* ?? bool is_dart_used(Dart_const_handle dh) const + { return true; ?? } */ + + int highest_nonfree_dimension(Dart_const_handle /* dh */) const + { return 2; } + + Dart_const_handle previous(Dart_const_handle ADart) const + { return get_beta<0>(ADart); } + Dart_const_handle next(Dart_const_handle ADart) const + { return get_beta<1>(ADart); } + Dart_const_handle opposite(Dart_const_handle dh) const + { return get_beta<2>(dh); } + Dart_const_handle opposite2(Dart_const_handle dh) const + { return get_beta<2>(dh); } + Dart_const_handle other_extremity(Dart_const_handle dh) const + { return get_beta<1>(dh); } + + template + Dart_const_handle opposite(Dart_const_handle ADart) const + { return this->template get_beta(ADart); } + Dart_const_handle other_orientation(Dart_const_handle ADart) const + { return ADart; } + + bool is_previous_exist(Dart_const_handle) const + { return true; } + bool is_next_exist(Dart_const_handle) const + { return true; } + template + bool is_opposite_exist(Dart_const_handle /* ADart */) const + { return true; } + + template + Dart_handle beta(Dart_handle ADart, Betas... betas) + { return CGAL::internal::Beta_functor:: + run(*this, ADart, betas...); } + template + Dart_const_handle beta(Dart_const_handle ADart, Betas... betas) const + { return CGAL::internal::Beta_functor:: + run(*this, ADart, betas...); } + template + Dart_handle beta(Dart_handle ADart) + { return CGAL::internal::Beta_functor_static:: + run(*this, ADart); } + template + Dart_const_handle beta(Dart_const_handle ADart) const + { return CGAL::internal::Beta_functor_static:: + run(*this, ADart); } + + size_type number_of_darts() const + { return m_nb_darts; } + + size_type number_of_halfedges() const + { return number_of_darts(); } + + size_type number_of_used_marks() const + { return mnb_used_marks; } + + bool is_reserved(size_type amark) const + { + CGAL_assertion(amark& >(get(m_all_marks, ADart)).set(amark, avalue); + } + + void flip_dart_mark(Dart_const_handle ADart, size_type amark) const + { set_dart_mark(ADart, amark, !get_dart_mark(ADart, amark)); } + + bool is_marked(Dart_const_handle adart, size_type amark) const + { + CGAL_assertion(is_reserved(amark)); + return get_dart_mark(adart, amark)!=mmask_marks[amark]; + } + + void set_mark_to(Dart_const_handle adart, size_type amark, + bool astate) const + { + CGAL_assertion(is_reserved(amark)); + + if (is_marked(adart, amark)!=astate) + { + if (astate) ++mnb_marked_darts[amark]; + else --mnb_marked_darts[amark]; + + flip_dart_mark(adart, amark); + } + } + + void mark(Dart_const_handle adart, size_type amark) const + { + CGAL_assertion(is_reserved(amark)); + + if (is_marked(adart, amark)) return; + + ++mnb_marked_darts[amark]; + flip_dart_mark(adart, amark); + } + + void unmark(Dart_const_handle adart, size_type amark) const + { + CGAL_assertion( adart!=this->null_dart_handle ); + CGAL_assertion( is_reserved(amark) ); + + if (!is_marked(adart, amark)) return; + + --mnb_marked_darts[amark]; + flip_dart_mark(adart, amark); + } + + void unmark_all(size_type amark) const + { + CGAL_assertion( is_reserved(amark) ); + + if ( is_whole_map_marked(amark) ) + { + negate_mark(amark); + } + else if ( !is_whole_map_unmarked(amark) ) + { + for (typename Dart_range::const_iterator it(darts().begin()), + itend(darts().end()); it!=itend; ++it) + unmark(*it, amark); + } + CGAL_assertion(is_whole_map_unmarked(amark)); + } + + void free_mark(size_type amark) const + { + CGAL_assertion( is_reserved(amark) ); + + if ( mnb_times_reserved_marks[amark]>1 ) + { + --mnb_times_reserved_marks[amark]; + return; + } + + unmark_all(amark); + + // 1) We remove amark from the array mused_marks_stack by + // replacing it with the last mark in this array. + mused_marks_stack[mindex_marks[amark]] = + mused_marks_stack[--mnb_used_marks]; + mindex_marks[mused_marks_stack[mnb_used_marks]] = + mindex_marks[amark]; + + // 2) We add amark in the array mfree_marks_stack and update its index. + mfree_marks_stack[ mnb_used_marks ]=amark; + mindex_marks[amark] = mnb_used_marks; + + mnb_times_reserved_marks[amark]=0; + } + + bool is_without_boundary(unsigned int i) const + { + CGAL_assertion(1<=i && i<=dimension); + if (i==1) return true; + + for ( typename Dart_range::const_iterator it(darts().begin()), + itend(darts().end()); it!=itend; ++it) + { if (is_perforated(it)) return false; } + return true; + } + + bool is_without_boundary() const + { return is_without_boundary(2); } + + //************************************************************************** + // Dart_of_cell_range + template + struct Dart_of_cell_range + { + typedef CGAL::FGW_cell_iterator iterator; + typedef CGAL::FGW_cell_iterator const_iterator; + Dart_of_cell_range(const Self &amap, Dart_handle adart) : mmap(amap), + m_initdart(adart), + msize(0) + {} + const_iterator begin() const { return const_iterator(mmap, m_initdart); } + const_iterator end() const { return const_iterator(mmap, m_initdart, mmap.null_handle); } + size_type size() const + { + if (msize==0) + { + for (const_iterator it=begin(), itend=end(); it!=itend; ++it) + { ++msize; } + } + return msize; + } + + bool empty() const + { return mmap.is_empty(); } + private: + const Self & mmap; + Dart_handle m_initdart; + mutable typename Self::size_type msize; + }; + //************************************************************************** + // Dart_of_cell_const_range + /* template + struct Dart_of_cell_const_range // TODO REMOVE ?? + {}; */ + //-------------------------------------------------------------------------- + template + Dart_of_cell_range darts_of_cell(Dart_handle adart) + { return Dart_of_cell_range(*this,adart); } + //-------------------------------------------------------------------------- + template + Dart_of_cell_range darts_of_cell(Dart_const_handle adart) const + { return Dart_of_cell_range(*this,adart); } // Before it was Dart_of_cell_const_range + //************************************************************************** + // Dart_range + struct Dart_range { + typedef CGAL::FGW_dart_iterator_basic_of_all iterator; + typedef CGAL::FGW_dart_iterator_basic_of_all const_iterator; + Dart_range(const Self &amap) : mmap(amap), msize(0) + {} + iterator begin() { return iterator(mmap); } + iterator end() { return iterator(mmap,mmap.null_handle); } + const_iterator begin() const { return const_iterator(mmap); } + const_iterator end() const { return const_iterator(mmap,mmap.null_handle); } + size_type size() const + { + if (msize==0) + { msize=halfedges(mmap.get_fg()).size(); } + return msize; + } + bool empty() const + { return mmap.is_empty(); } + + size_type capacity() const + { return num_halfedges(mmap.get_fg()); } + + bool is_used(size_type i) const + { + for (typename boost::template graph_traits::halfedge_iterator + it=halfedges(mmap.get_fg()).begin(), + itend=halfedges(mmap.get_fg()).end(); it!=itend; ++it) + { + if (i==0) { return !is_border(*it, mmap.get_fg()); } + --i; + } + return false; + } + + private: + const Self & mmap; + mutable typename Self::size_type msize; + }; + //************************************************************************** + // Dart_const_range // TODO REMOVE ? + /* struct Dart_const_range { + typedef CGAL::FGW_dart_iterator_basic_of_all const_iterator; + Dart_const_range(const Self &amap) : mmap(amap), msize(0) + {} + const_iterator begin() const { return const_iterator(mmap); } + const_iterator end() const { return const_iterator(mmap,mmap.null_handle); } + size_type size() const + { + if (msize==0) + { + for (const_iterator it=begin(), itend=end(); it!=itend; ++it) + { ++msize; } + } + return msize; + } + + bool empty() const + { return mmap.is_empty(); } + private: + const Self & mmap; + mutable typename Self::size_type msize; + };*/ + //************************************************************************** + Dart_range& darts() + { return mdarts; } + //-------------------------------------------------------------------------- + const Dart_range& darts() const + { return mdarts; } // Before it was Dart_const_range(*this) + //************************************************************************** + Dart_handle dart_handle(size_type i) + { + CGAL_assertion(darts().is_used(i)); + for (typename boost::template graph_traits::halfedge_iterator + it=halfedges(get_fg()).begin(), + itend=halfedges(get_fg()).end(); it!=itend; ++it) + { + if (i==0) { return *it; } + --i; + } + CGAL_assertion(false); + return Dart_handle(); + } + Dart_const_handle dart_handle(size_type i) const + { + CGAL_assertion(darts().is_used(i)); + for (typename boost::template graph_traits::halfedge_iterator + it=halfedges(get_fg()).begin(), + itend=halfedges(get_fg()).end(); it!=itend; ++it) + { + if (i==0) { return *it; } + --i; + } + CGAL_assertion(false); + return Dart_const_handle(); + } + + template + bool belong_to_same_cell(Dart_const_handle adart1, + Dart_const_handle adart2) const + { + for (typename Dart_of_cell_range::iterator it=darts_of_cell(adart1).begin(), + itend=darts_of_cell(adart1).end(); it!=itend; ++it) + { if (*it==adart2) { return true; } } + return false; + } + + template + bool is_whole_cell_unmarked(Dart_const_handle adart, size_type amark) const + { + for (typename Dart_of_cell_range::iterator it=darts_of_cell(adart).begin(), + itend=darts_of_cell(adart).end(); it!=itend; ++it) + { if (is_marked(*it, amark)) { return false; } } + return true; + } + + template + bool is_whole_cell_marked(Dart_const_handle adart, size_type amark) const + { + for (typename Dart_of_cell_range::iterator it=darts_of_cell(adart).begin(), + itend=darts_of_cell(adart).end(); it!=itend; ++it) + { if (!is_marked(*it, amark)) { return false; } } + return true; + } + + template + size_type mark_cell(Dart_const_handle adart, size_type amark) const + { + size_type res=0; + for (typename Dart_of_cell_range::iterator it=darts_of_cell(adart).begin(), + itend=darts_of_cell(adart).end(); it!=itend; ++it) + { mark(*it, amark); ++res; } + return res; +} + + size_type mark_cell(Dart_const_handle adart, unsigned int i, size_type amark) const + { + if (i==0) { return mark_cell<0>(adart, amark); } + else if (i==1) { return mark_cell<1>(adart, amark); } + else if (i==2) { return mark_cell<2>(adart, amark); } + return mark_cell<3>(adart, amark); + } + + template + size_type unmark_cell(Dart_const_handle adart, size_type amark) const + { + size_type res=0; + for (typename Dart_of_cell_range::iterator it=darts_of_cell(adart).begin(), + itend=darts_of_cell(adart).end(); it!=itend; ++it) + { unmark(*it, amark); ++res; } + return res; + } + + std::vector + count_marked_cells(size_type amark, const std::vector& acells) const + { + std::vector res(dimension+2); + std::vector marks(dimension+2); + + // Initialization of the result + for (unsigned int i=0; i tounmark; + for (unsigned int i=0; i0) + { + for (typename Dart_range::const_iterator it(darts().begin()), + itend(darts().end()); it!=itend; ++it) + { + for (unsigned int i=0; i + count_cells(const std::vector& acells) const + { + std::vector res; + size_type m=get_new_mark(); + negate_mark(m); // We mark all the cells. + + res=count_marked_cells(m, acells); + + negate_mark(m); // We unmark the cells + free_mark(m); + + return res; + } + + std::vector count_all_cells() const + { + std::vector dim(dimension+2); + + for ( unsigned int i=0; i<=dimension+1; ++i) + { dim[i]=i; } + + return count_cells(dim); + } + + std::ostream& display_characteristics(std::ostream & os) const + { + std::vector cells(dimension+2); + for ( unsigned int i=0; i<=dimension+1; ++i) + { cells[i]=i; } + + std::vector res=count_cells(cells); + + os<<"#Darts="< > >::const_type MarkPMap; + mutable MarkPMap m_all_marks; +}; + + /// null_handle + // template + // const typename Face_graph_wrapper::Null_handle_type + // Face_graph_wrapper::null_handle=nullptr; + template + const typename Face_graph_wrapper::Null_handle_type + Face_graph_wrapper::null_handle=typename Face_graph_wrapper::Dart_handle(); + + /// null_dart_handle + // template + // const typename Face_graph_wrapper::Null_handle_type + // Face_graph_wrapper::null_dart_handle=nullptr; + template + const typename Face_graph_wrapper::Null_handle_type + Face_graph_wrapper::null_dart_handle=typename Face_graph_wrapper::Dart_handle(); + + template + struct Get_map + { + typedef Face_graph_wrapper type; + typedef const Face_graph_wrapper storage_type; + Get_map(const HEG& heg): m_map(heg) {} + static const HEG& get_mesh(const storage_type& amap) + { return amap.get_fg(); } + + storage_type m_map; + }; + + template + struct Get_map, Map> + { + typedef Map type; + typedef const Map& storage_type; + Get_map(const Map& heg): m_map(heg) {} + static const Map& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + struct Get_map, Map> + { + typedef Map type; + typedef const Map& storage_type; + Get_map(const Map& heg): m_map(heg) {} + static const Map& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + class Map, typename Refs, typename Storage, class LCC> + struct Get_map, LCC> + { + typedef LCC type; + typedef const LCC& storage_type; + Get_map(const LCC& heg): m_map(heg) {} + static const LCC& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + struct Get_map, Map> + { + typedef Map type; + typedef const Map& storage_type; + Get_map(const Map& heg): m_map(heg) {} + static const Map& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + struct Get_map, Map> + { + typedef Map type; + typedef const Map& storage_type; + Get_map(const Map& heg): m_map(heg) {} + static const Map& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + struct Get_map, Map> + { + typedef Map type; + typedef const Map& storage_type; + Get_map(const Map& heg): m_map(heg) {} + static const Map& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + struct Get_map, Map> + { + typedef Map type; + typedef const Map& storage_type; + Get_map(const Map& heg): m_map(heg) {} + static const Map& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + class Map, typename Storage, class LCC> + struct Get_map, LCC> + { + typedef LCC type; + typedef const LCC& storage_type; + Get_map(const LCC& heg): m_map(heg) {} + static const LCC& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + class Map, typename Storage, class LCC> + struct Get_map, LCC> + { + typedef LCC type; + typedef const LCC& storage_type; + Get_map(const LCC& heg): m_map(heg) {} + static const LCC& get_mesh(storage_type& amap) + { return amap; } + storage_type m_map; + }; + + template + struct Get_traits + { + typedef Mesh_ Mesh; + typedef typename Mesh::Traits Kernel; + typedef typename Mesh::Point Point; + typedef typename Mesh::Vector Vector; + + template + static const Point& get_point(const Mesh& m, Dart_handle dh) + { return m.point(dh); } + }; + + template + struct Get_traits > + { + typedef CGAL::Surface_mesh

Mesh; + typedef typename CGAL::Kernel_traits

::Kernel Kernel; + typedef typename Kernel::Point_3 Point; + typedef typename Kernel::Vector_3 Vector; + + template + static const Point& get_point(const Mesh& m, Dart_handle dh) + { return m.point(m.source(dh)); } + }; + + template class T_HDS, + class Alloc> + struct Get_traits > + { + typedef CGAL::Polyhedron_3 Mesh; + typedef PolyhedronTraits_3 Kernel; + typedef typename Kernel::Point_3 Point; + typedef typename Kernel::Vector_3 Vector; + + template + static const Point& get_point(const Mesh& /*m*/, Dart_handle dh) + { return dh->opposite()->vertex()->point(); } + }; + +} // Namespace CGAL + +#endif // CGAL_FACE_GRAPH_WRAPPER_H // +// EOF // diff --git a/Combinatorial_map/include/CGAL/Functors_for_face_graph_wrapper.h b/Combinatorial_map/include/CGAL/Functors_for_face_graph_wrapper.h new file mode 100644 index 00000000000..9f4360d328c --- /dev/null +++ b/Combinatorial_map/include/CGAL/Functors_for_face_graph_wrapper.h @@ -0,0 +1,87 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_FUNCTORS_FOR_FACE_GRAPH_WRAPPER_H +#define CGAL_FUNCTORS_FOR_FACE_GRAPH_WRAPPER_H 1 + +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +/** This file contains the following functors for Face_graph_wrapper: + * Is_free:: + operator() (const HEG& heg, Dart_const_handle dh) + * Get_beta:: + operator() (const HEG& heg, Dart_const_handle dh) +*/ +//////////////////////////////////////////////////////////////////////////////// +namespace CGAL +{ +/// Is_free +//template +//struct Is_free +//{ +// typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; + +// static bool value(const HEG& /*heg*/, Dart_const_handle /*dh*/) +// { CGAL_static_assertion(i==0 || i==1); return false; } +//}; +//template +//struct Is_free +//{ +// typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; +// static bool value(const HEG& heg, Dart_const_handle dh) +// { return is_border(opposite(dh, heg), heg); } +//}; +//////////////////////////////////////////////////////////////////////////////// +/// Get_beta +template +struct Get_beta +{ + typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; + + static Dart_const_handle value(const HEG& /*heg*/, Dart_const_handle /*dh*/) + { /* CGAL_static_assertion(false);*/ + std::cout<<"ERROR Get_beta"< +struct Get_beta +{ + typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; + static Dart_const_handle value(const HEG& heg, Dart_const_handle dh) + { return prev(dh, heg); } +}; +template +struct Get_beta +{ + typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; + static Dart_const_handle value(const HEG& heg, Dart_const_handle dh) + { return next(dh, heg); } +}; +template +struct Get_beta +{ + typedef typename boost::graph_traits::halfedge_descriptor Dart_const_handle; + static Dart_const_handle value(const HEG& heg, Dart_const_handle dh) + { + //if (Is_free::value(heg, dh)) return Dart_const_handle(); + return opposite(dh, heg); + } +}; +//////////////////////////////////////////////////////////////////////////////// +} // namespace CGAL + +#endif // CGAL_FUNCTORS_FOR_FACE_GRAPH_WRAPPER_H // +// EOF // diff --git a/Combinatorial_map/include/CGAL/Iterators_for_face_graph_wrapper.h b/Combinatorial_map/include/CGAL/Iterators_for_face_graph_wrapper.h new file mode 100644 index 00000000000..d30d5889b22 --- /dev/null +++ b/Combinatorial_map/include/CGAL/Iterators_for_face_graph_wrapper.h @@ -0,0 +1,332 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_ITERATORS_FOR_FACE_GRAPH_WRAPPER_H +#define CGAL_ITERATORS_FOR_FACE_GRAPH_WRAPPER_H 1 + +#include +#include +#include + +namespace CGAL +{ + + //**************************************************************************** + /* Class CMap_dart_iterator_basic_of_all: to iterate onto all the + * darts of the face graph. + */ + template + class FGW_dart_iterator_basic_of_all + { + public: + typedef FGW_dart_iterator_basic_of_all Self; + + typedef Map_ Map; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::size_type size_type; + + public: + /// Main constructor. + FGW_dart_iterator_basic_of_all(const Map& amap): + mmap(amap), + m_it(halfedges(amap.get_fg()).begin()) + { + /*if (m_it!=halfedges(amap.get_fg()).end() && + is_border(*m_it, amap.get_fg())) + { operator++(0); } */ + } + + /// Constructor with a dart in parameter (for end iterator). + FGW_dart_iterator_basic_of_all(const Map& amap, Dart_handle /*adart*/): + mmap(amap), + m_it(halfedges(amap.get_fg()).end()) + {} + + FGW_dart_iterator_basic_of_all(const FGW_dart_iterator_basic_of_all& other): + mmap(other.mmap), + m_it(other.m_it) + {} + + operator Dart_handle() const + { return operator*(); } + + bool operator==(const Self& other) const + { return &mmap==&(other.mmap) && m_it==other.m_it; } + + bool operator!=(const Self& other) const + { return !(operator==(other)); } + + /// Prefix ++ operator. + Self& operator++() + { + CGAL_assertion(m_it!=halfedges(this->mmap.get_fg()).end()); + + //do + { + ++m_it; + } + /*while(m_it!=halfedges(this->mmap.get_fg()).end() && + is_border(*m_it, this->mmap.get_fg())); */ + + return *this; + } + + /// Postfix ++ operator. + Self operator++(int) + { Self res=*this; operator ++(); return res; } + + Dart_handle operator*() const + { + CGAL_assertion(m_it!=halfedges(this->mmap.get_fg()).end()); + return *m_it; + } + + protected: + const Map& mmap; + typename boost::graph_traits::halfedge_iterator m_it; + }; + +//////////////////////////////////////////////////////////////////////////////// + template + class FGW_basis_for_cell_iterator + { + public: + typedef FGW_basis_for_cell_iterator Self; + typedef Map_ Map; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::size_type size_type; + + /// Main constructor. + FGW_basis_for_cell_iterator(const Map& amap, Dart_handle adart): + mmap(amap), + m_firstdart(adart), + m_curdart(adart) + {} + + /// Constructor with two darts in parameter (for end iterator). + FGW_basis_for_cell_iterator(const Map& amap, Dart_handle adart, + Dart_handle /* d2 */): + mmap(amap), + m_firstdart(adart), + m_curdart(Dart_handle()) + {} + + bool operator==(const Self& other) const + { return &mmap==&(other.mmap) && m_firstdart==other.m_firstdart && + m_curdart==other.m_curdart; } + + bool operator!=(const Self& other) const + { return !(this->operator==(other)); } + + operator Dart_handle() const + { return operator*(); } + + Dart_handle operator*() const + { + CGAL_assertion(m_curdart!=Dart_handle()); + return m_curdart; + } + + protected: + const Map& mmap; + Dart_handle m_firstdart, m_curdart; + }; +//////////////////////////////////////////////////////////////////////////////// + template + class FGW_cell_iterator + {}; +//////////////////////////////////////////////////////////////////////////////// +/// Vertex iterator + template + class FGW_cell_iterator: public FGW_basis_for_cell_iterator // Vertex + { + public: + typedef FGW_cell_iterator Self; + typedef FGW_basis_for_cell_iterator Base; + typedef Map_ Map; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::size_type size_type; + + FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart), + m_second_way(false) + {} + + /// Constructor with two darts in parameter (for end iterator). + FGW_cell_iterator(const Map& amap, Dart_handle adart, + Dart_handle d2): Base(amap, adart, d2) + {} + + /// Prefix ++ operator. + Self& operator++() + { + if (!m_second_way) + { + if (this->mmap.template is_free<2>(this->m_curdart)) + { + m_second_way=true; + this->m_curdart=this->mmap.template beta<0>(this->m_firstdart); + if (this->mmap.template is_free<2>(this->m_curdart)) + { this->m_curdart=Dart_handle(); } + else { this->m_curdart=this->mmap.template beta<2>(this->m_curdart); } + } + else + { + this->m_curdart=this->mmap.template beta<2, 1>(this->m_curdart); + if (this->m_curdart==this->m_firstdart) + { this->m_curdart=Dart_handle(); } + } + } + else + { + this->m_curdart=this->mmap.template beta<0>(this->m_curdart); + if (this->mmap.template is_free<2>(this->m_curdart)) + { this->m_curdart=Dart_handle(); } + else { this->m_curdart=this->mmap.template beta<2>(this->m_curdart); } + } + + return *this; + } + + /// Postfix ++ operator. + Self operator++(int) + { Self res=*this; operator ++(); return res; } + +protected: + /// True if we already found a border dart, and thus turn in the second way + bool m_second_way; +}; +template +class FGW_cell_iterator: public FGW_basis_for_cell_iterator // Edge +{ + public: + typedef FGW_cell_iterator Self; + typedef FGW_basis_for_cell_iterator Base; + typedef Map_ Map; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::size_type size_type; + + FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart) + {} + + /// Constructor with two darts in parameter (for end iterator). + FGW_cell_iterator(const Map& amap, Dart_handle adart, + Dart_handle d2): Base(amap, adart, d2) + {} + + /// Prefix ++ operator. + Self& operator++() + { + if (this->m_curdart==this->m_firstdart) + { + if (this->mmap.template is_free<2>(this->m_curdart)) + { this->m_curdart=Dart_handle(); } + else { this->m_curdart=this->mmap.template beta<2>(this->m_curdart); } + } + else + { this->m_curdart=Dart_handle(); } + + return *this; + } + + /// Postfix ++ operator. + Self operator++(int) + { Self res=*this; operator ++(); return res; } +}; +template +class FGW_cell_iterator: public FGW_basis_for_cell_iterator // Face +{ +public: + typedef FGW_cell_iterator Self; + typedef FGW_basis_for_cell_iterator Base; + typedef Map_ Map; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::size_type size_type; + + FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart) + {} + + /// Constructor with two darts in parameter (for end iterator). + FGW_cell_iterator(const Map& amap, Dart_handle adart, + Dart_handle d2): Base(amap, adart, d2) + {} + + /// Prefix ++ operator. + Self& operator++() + { + this->m_curdart=this->mmap.template beta<1>(this->m_curdart); + if (this->m_curdart==this->m_firstdart) + { this->m_curdart=Dart_handle(); } + + return *this; + } + + /// Postfix ++ operator. + Self operator++(int) + { Self res=*this; operator ++(); return res; } +}; +template +class FGW_cell_iterator: public FGW_basis_for_cell_iterator // CC +{ +public: + typedef FGW_cell_iterator Self; + typedef FGW_basis_for_cell_iterator Base; + typedef Map_ Map; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::size_type size_type; + + FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart) + { m_mark=this->mmap.get_new_mark(); } + + /// Constructor with two darts in parameter (for end iterator). + FGW_cell_iterator(const Map& amap, Dart_handle adart, + Dart_handle d2): Base(amap, adart, d2) + { m_mark=this->mmap.get_new_mark(); } + + ~FGW_cell_iterator() + { this->mmap.free_mark(m_mark); } + + /// Prefix ++ operator. + Self& operator++() + { + if (!this->mmap.is_marked(this->mmap.template beta<1>(this->m_curdart), m_mark)) + { + m_to_treat.push(this->mmap.template beta<1>(this->m_curdart)); + this->mmap.mark(this->mmap.template beta<1>(this->m_curdart), m_mark); + } + if (!this->mmap.template is_free<2>(this->m_curdart) && + !this->mmap.is_marked(this->mmap.template beta<2>(this->m_curdart), m_mark)) + { + m_to_treat.push(this->mmap.template beta<2>(this->m_curdart)); + this->mmap.mark(this->mmap.template beta<2>(this->m_curdart), m_mark); + } + + if (m_to_treat.empty()) + { this->m_curdart=Dart_handle(); } + else + { this->m_curdart=m_to_treat.top(); m_to_treat.pop(); } + + return *this; + } + + /// Postfix ++ operator. + Self operator++(int) + { Self res=*this; operator ++(); return res; } + +protected: + typename Map_::size_type m_mark; + std::stack m_to_treat; +}; +//////////////////////////////////////////////////////////////////////////////// + +} // namespace CGAL + +#endif // CGAL_ITERATORS_FOR_FACE_GRAPH_WRAPPER_H // +// EOF // diff --git a/Combinatorial_map/package_info/Combinatorial_map/dependencies b/Combinatorial_map/package_info/Combinatorial_map/dependencies index 4078db76b93..eb4d232541d 100644 --- a/Combinatorial_map/package_info/Combinatorial_map/dependencies +++ b/Combinatorial_map/package_info/Combinatorial_map/dependencies @@ -1,5 +1,6 @@ Algebraic_foundations Arithmetic_kernel +BGL Cartesian_kernel Circulator Combinatorial_map @@ -17,5 +18,7 @@ Kernel_d Modular_arithmetic Number_types Profiling_tools +Property_map STL_Extension Stream_support +Random_numbers diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index 6beb2c68493..98a88794f8a 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -16,6 +16,11 @@ if ( CGAL_FOUND ) create_single_source_cgal_program( "${cppfile}" ) endforeach() + find_package( OpenMesh QUIET ) + if (TARGET OpenMesh::OpenMesh) + target_link_libraries(Combinatorial_map_copy_test PRIVATE OpenMesh::OpenMesh) + endif() + else() message(STATUS "This program requires the CGAL library, and will not be compiled.") diff --git a/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_copy_test.cpp b/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_copy_test.cpp index ce21c604ef9..27de63ed00d 100644 --- a/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_copy_test.cpp +++ b/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_copy_test.cpp @@ -1,6 +1,13 @@ #include #include #include "Combinatorial_map_test_iterators.h" +#include +#if CGAL_USE_OPENMESH +# include +# include +# include + typedef OpenMesh::TriMesh_ArrayKernelT OpenMesh_mesh; +#endif // CGAL_USE_OPENMESH #include #include @@ -152,6 +159,10 @@ typedef CGAL::Combinatorial_map<4, Map_dart_items_4> Map8; // info=char, int, int, int, int, double typedef CGAL::Combinatorial_map<4, Map_dart_max_items_4> Map9; +struct Traits { typedef int Point_2; typedef int Point_3; }; +typedef CGAL::HalfedgeDS_default HDS; + +//////////////////////////////////////////////////////////////////////////////// template::type> struct CreateAttributes @@ -579,6 +590,31 @@ bool testCopy() return true; } +bool testImportFromHalfedge() +{ + bool res=true; + + HDS hds; + CGAL::HalfedgeDS_decorator decorator(hds); + decorator.create_loop(); + decorator.create_segment(); + + Map1 map1; map1.import_from_halfedge_graph(hds); + Map2 map2; map2.import_from_halfedge_graph(hds); + Map3 map3; map3.import_from_halfedge_graph(hds); + +#if CGAL_USE_OPENMESH + { + // test the compilation, with an empty mesh + OpenMesh_mesh hds; + Map1 map1; map1.import_from_halfedge_graph(hds); + Map2 map2; map2.import_from_halfedge_graph(hds); + Map3 map3; map3.import_from_halfedge_graph(hds); + } +#endif // CGAL_USE_OPENMESH + return res; // TODO compare number of darts/cells +} + int main() { std::cout<<"Combinatorial map copy test (v1)."< #include +#include +#include +#include +#include +#include #include "Combinatorial_map_2_test.h" #include "Combinatorial_map_3_test.h" @@ -193,8 +198,64 @@ bool test_get_new_mark() return true; } +bool test_face_graph_wrapper() +{ + bool res=true; + + typedef CGAL::Surface_mesh::Point_3> SMesh; + SMesh m; + std::ifstream in1("data/head.off"); + if (in1.fail()) + { + std::cout<<"Error: impossible to open 'data/head.off'"<>m; + + CGAL::Face_graph_wrapper fgw1(m); + std::vector cells=fgw1.count_all_cells(); + if (cells[0]!=1487 || cells[1]!=4406 || cells[2]!=2921 || + fgw1.number_of_darts()!=8812) + { + std::cout<<"Error: incorrect number of cells in test_face_graph_wrapper " + <<"for Surface_mesh: " + < > Polyhedron; + Polyhedron p; + std::ifstream in2("data/head.off"); + if (in2.fail()) + { + std::cout<<"Error: impossible to open 'data/head.off'"<>p; + CGAL::Face_graph_wrapper fgw2(p); + cells=fgw2.count_all_cells(); + if (cells[0]!=1487 || cells[1]!=4406 || cells[2]!=2921 || + fgw2.number_of_darts()!=8812) + { + std::cout<<"Error: incorrect number of cells in test_face_graph_wrapper " + <<"for Polyhedron." + < - void copy(const GMap2& amap, const Converters& converters, + void copy(const Generalized_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, const PointConverter& pointconverter, - boost::unordered_map* dart_mapping=nullptr) + boost::unordered_map + :: + Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { + typedef Generalized_map_base GMap2; this->clear(); this->mnb_used_marks = amap.mnb_used_marks; @@ -207,107 +216,145 @@ namespace CGAL { // Create an mapping between darts of the two maps (originals->copies). // (here we cannot use CGAL::Unique_hash_map because it does not provide // iterators... - boost::unordered_map local_dartmap; - if (dart_mapping==nullptr) - { dart_mapping=&local_dartmap; } - + boost::unordered_map + local_dartmap; + if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map + { origin_to_copy=&local_dartmap; } + Dart_handle new_dart; for (typename GMap2::Dart_const_range::const_iterator it=amap.darts().begin(), itend=amap.darts().end(); it!=itend; ++it) { - (*dart_mapping)[it]=mdarts.emplace(); - init_dart((*dart_mapping)[it], amap.get_marks(it)); - internal::Copy_dart_info_functor:: - run(amap, static_cast(*this), it, (*dart_mapping)[it], - dartinfoconverter); + new_dart=mdarts.emplace(); + init_dart(new_dart, amap.get_marks(it)); + + (*origin_to_copy)[it]=new_dart; + if (copy_to_origin!=NULL) { (*copy_to_origin)[new_dart]=it; } + + internal::Copy_dart_info_functor:: + run(static_cast(amap), static_cast(*this), + it, new_dart, dartinfoconverter); } unsigned int min_dim=(dimension - ::iterator dartmap_iter, dartmap_iter_end=dart_mapping->end(); - for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end; + ::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end(); + for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end; ++dartmap_iter) { for (unsigned int i=0; i<=min_dim; i++) { if (!amap.is_free(dartmap_iter->first,i) && - (dartmap_iter->first)<(amap.alpha(dartmap_iter->first,i))) + is_free(dartmap_iter->second,i)) { basic_link_alpha(dartmap_iter->second, - (*dart_mapping)[amap.alpha(dartmap_iter->first,i)], i); + (*origin_to_copy)[amap.alpha(dartmap_iter->first,i)], i); } } } /** Copy attributes */ - for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end; + for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end; ++dartmap_iter) { Helper::template Foreach_enabled_attributes - < internal::Copy_attributes_functor >:: - run(amap, static_cast(*this), + run(static_cast(amap), static_cast(*this), dartmap_iter->first, dartmap_iter->second, converters, pointconverter); } - CGAL_assertion (is_valid () == 1); + CGAL_assertion(is_valid()); } - template - void copy(const GMap2& amap, - boost::unordered_map* dart_mapping=nullptr) + template + void copy(const Generalized_map_base& amap, + boost::unordered_map + :: + Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { - std::tuple<> converters; - Default_converter_dart_info dartinfoconverter; - Default_converter_cmap_0attributes_with_point pointconverter; - copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); + CGAL::cpp11::tuple<> converters; + Default_converter_dart_info dartinfoconverter; + Default_converter_cmap_0attributes_with_point pointconverter; + copy(amap, converters, dartinfoconverter, pointconverter, + origin_to_copy, copy_to_origin); } - template - void copy(const GMap2& amap, const Converters& converters, - boost::unordered_map* dart_mapping=nullptr) + template + void copy(const Generalized_map_base& amap, + const Converters& converters, + boost::unordered_map + :: + Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { - Default_converter_cmap_0attributes_with_point pointconverter; - Default_converter_dart_info dartinfoconverter; - copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); + Default_converter_cmap_0attributes_with_point pointconverter; + Default_converter_dart_info dartinfoconverter; + copy(amap, converters, dartinfoconverter, pointconverter, + origin_to_copy, copy_to_origin); } - template - void copy(const GMap2& amap, const Converters& converters, + template + void copy(const Generalized_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, - boost::unordered_map* dart_mapping=nullptr) + boost::unordered_map + :: + Dart_const_handle, Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::Dart_const_handle>* copy_to_origin=NULL) { - Default_converter_cmap_0attributes_with_point pointconverter; - copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); + Default_converter_cmap_0attributes_with_point pointconverter; + copy(amap, converters, dartinfoconverter, pointconverter, + origin_to_copy, copy_to_origin); } // Copy constructor from a map having exactly the same type. Generalized_map_base (const Self & amap) - { copy(amap); } - - // "Copy constructor" from a map having different type. - template - Generalized_map_base(const GMap2& amap) { copy(amap); } // "Copy constructor" from a map having different type. - template - Generalized_map_base(const GMap2& amap, Converters& converters) + template + Generalized_map_base(const Generalized_map_base& amap) + { copy(amap); } + + // "Copy constructor" from a map having different type. + template + Generalized_map_base(const Generalized_map_base& amap, + const Converters& converters) { copy(amap, converters); } // "Copy constructor" from a map having different type. - template - Generalized_map_base(const GMap2& amap, Converters& converters, + template + Generalized_map_base(const Generalized_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter) { copy(amap, converters, dartinfoconverter); } // "Copy constructor" from a map having different type. - template - Generalized_map_base(const GMap2& amap, Converters& converters, + Generalized_map_base(const Generalized_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, const PointConverter& pointconverter) { copy(amap, converters, dartinfoconverter, pointconverter); } @@ -579,6 +626,11 @@ namespace CGAL { Dart_const_handle next(Dart_const_handle ADart) const { return this->template alpha<0, 1>(ADart); } + Dart_handle opposite2(Dart_handle ADart) + { return this->template alpha<0, 2>(ADart); } + Dart_const_handle opposite2(Dart_const_handle ADart) const + { return this->template alpha<0, 2>(ADart); } + template Dart_handle opposite(Dart_handle ADart) { return this->template alpha<0, dim>(ADart); } @@ -849,6 +901,27 @@ namespace CGAL { mnb_times_reserved_marks[amark]=0; } + template + bool belong_to_same_cell(Dart_const_handle adart1, + Dart_const_handle adart2) const + { return CGAL::belong_to_same_cell(*this, adart1, adart2); } + + template + bool is_whole_cell_unmarked(Dart_const_handle adart, size_type amark) const + { return CGAL::is_whole_cell_unmarked(*this, adart, amark); } + + template + bool is_whole_cell_marked(Dart_const_handle adart, size_type amark) const + { return CGAL::is_whole_cell_marked(*this, adart, amark); } + + template + size_type mark_cell(Dart_const_handle adart, size_type amark) const + { return CGAL::mark_cell(*this, adart, amark); } + + template + size_type unmark_cell(Dart_const_handle adart, size_type amark) const + { return CGAL::unmark_cell(*this, adart, amark); } + /** Test if this map is without boundary for a given dimension. * @param i the dimension. * @return true iff all the darts are not i-free. @@ -1647,6 +1720,61 @@ namespace CGAL { } public: + /// @return the positive turn between the two given darts. + // @pre next(d1) and d2 must belong to the same vertex. + std::size_t positive_turn(Dart_const_handle d1, Dart_const_handle d2) const + { + CGAL_assertion((!this->template is_free<1>(d1))); + /* CGAL_assertion((belong_to_same_cell<0>(this->next(d1), d2))); */ + + if (d2==opposite2(d1)) { return 0; } + + Dart_const_handle dd1=d1; + std::size_t res=1; + while (next(dd1)!=d2) + { + if (this->template is_free<2>(next(dd1))) + { return std::numeric_limits::max(); } + + ++res; + dd1=opposite2(next(dd1)); + + CGAL_assertion(!this->template is_free<1>(dd1)); + CGAL_assertion(next(dd1)==d2 || dd1!=d1); + } + return res; + } + + /// @return the negative turn between the two given darts. + // @pre next(d1) and d2 must belong to the same vertex. + std::size_t negative_turn(Dart_const_handle d1, Dart_const_handle d2) const + { + CGAL_assertion((!this->template is_free<1>(d1))); + /* CGAL_assertion((belong_to_same_cell<0>(this->next(d1), d2))); */ + + if (d2==opposite2(d1)) { return 0; } + + if (this->template is_free<2>(d1) || this->template is_free<2>(d2)) + { return std::numeric_limits::max(); } + + d1=opposite2(d1); + d2=opposite2(d2); + Dart_const_handle dd1=d1; + std::size_t res=1; + while (previous(dd1)!=d2) + { + if (this->template is_free<2>(previous(dd1))) + { return std::numeric_limits::max(); } + + ++res; + dd1=opposite2(previous(dd1)); + + CGAL_assertion(!this->template is_free<0>(dd1)); + CGAL_assertion(previous(dd1)==d2 || dd1!=d1); + } + return res; + } + /** Erase marked darts from the map. * Marked darts are unlinked before to be removed, thus surviving darts * are correctly linked, but the map is not necessarily valid depending @@ -1666,7 +1794,7 @@ namespace CGAL { if (is_marked(d, amark)) { for ( i = 0; i <= dimension; ++i) - { if (!is_free(d, i)) unlink_beta(d, i); } + { if (!is_free(d, i)) topo_unsew(d, i); } erase_dart(d); ++res; } } @@ -2766,12 +2894,12 @@ namespace CGAL { !is_face_combinatorial_polygon(d4, 3) ) return false; // TODO do better with marks (?). - if ( belong_to_same_cell(*this, d1, d2) || - belong_to_same_cell(*this, d1, d3) || - belong_to_same_cell(*this, d1, d4) || - belong_to_same_cell(*this, d2, d3) || - belong_to_same_cell(*this, d2, d4) || - belong_to_same_cell(*this, d3, d4) ) return false; + if ( belong_to_same_cell<2,1>(d1, d2) || + belong_to_same_cell<2,1>(d1, d3) || + belong_to_same_cell<2,1>(d1, d4) || + belong_to_same_cell<2,1>(d2, d3) || + belong_to_same_cell<2,1>(d2, d4) || + belong_to_same_cell<2,1>(d3, d4) ) return false; if ( alpha(d1, 0,1,2)!=alpha(d3,1) || alpha(d4, 1,2)!=alpha(d3,0,1) || @@ -2847,21 +2975,21 @@ namespace CGAL { !is_face_combinatorial_polygon(d6, 4) ) return false; // TODO do better with marks. - if ( belong_to_same_cell(*this, d1, d2) || - belong_to_same_cell(*this, d1, d3) || - belong_to_same_cell(*this, d1, d4) || - belong_to_same_cell(*this, d1, d5) || - belong_to_same_cell(*this, d1, d6) || - belong_to_same_cell(*this, d2, d3) || - belong_to_same_cell(*this, d2, d4) || - belong_to_same_cell(*this, d2, d5) || - belong_to_same_cell(*this, d2, d6) || - belong_to_same_cell(*this, d3, d4) || - belong_to_same_cell(*this, d3, d5) || - belong_to_same_cell(*this, d3, d6) || - belong_to_same_cell(*this, d4, d5) || - belong_to_same_cell(*this, d4, d6) || - belong_to_same_cell(*this, d5, d6) ) + if ( belong_to_same_cell<2,1>(d1, d2) || + belong_to_same_cell<2,1>(d1, d3) || + belong_to_same_cell<2,1>(d1, d4) || + belong_to_same_cell<2,1>(d1, d5) || + belong_to_same_cell<2,1>(d1, d6) || + belong_to_same_cell<2,1>(d2, d3) || + belong_to_same_cell<2,1>(d2, d4) || + belong_to_same_cell<2,1>(d2, d5) || + belong_to_same_cell<2,1>(d2, d6) || + belong_to_same_cell<2,1>(d3, d4) || + belong_to_same_cell<2,1>(d3, d5) || + belong_to_same_cell<2,1>(d3, d6) || + belong_to_same_cell<2,1>(d4, d5) || + belong_to_same_cell<2,1>(d4, d6) || + belong_to_same_cell<2,1>(d5, d6) ) return false; if ( alpha(d1,2) !=alpha(d4,1,0,1) || @@ -3020,7 +3148,7 @@ namespace CGAL { return alpha<0, 1>(adart); } - /** Insert a vertex in the given 2-cell which is splitted in triangles, + /** Insert a vertex in the given 2-cell which is split in triangles, * once for each inital edge of the facet. * @param adart a dart of the facet to triangulate. * @return A dart incident to the new vertex. @@ -3341,14 +3469,14 @@ namespace CGAL { if (prec!=null_handle) { // prec and *it must belong to the same vertex of the same volume - if ( !CGAL::belong_to_same_cell(*this, prec, *it) ) + if ( !belong_to_same_cell<0, 2>(prec, *it) ) return false; } prec = this->template alpha<0>(*it); } // The path must be closed. - if (!CGAL::belong_to_same_cell(*this, prec, *afirst)) + if (!belong_to_same_cell<0, 2>(prec, *afirst)) return false; return true; @@ -3589,24 +3717,34 @@ namespace CGAL { Generalized_map(const Self & amap) : Base(amap) {} - template < class Gmap > - Generalized_map(const Gmap & amap) : Base(amap) + template + Generalized_map(const Generalized_map_base& amap) : + Base(amap) {} - template < class Gmap, typename Converters > - Generalized_map(const Gmap & amap, const Converters& converters) : + template + Generalized_map(const Generalized_map_base& amap, + const Converters& converters) : Base(amap, converters) {} - template < class Gmap, typename Converters, typename DartInfoConverter > - Generalized_map(const Gmap & amap, const Converters& converters, + template + Generalized_map(const Generalized_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter) : Base(amap, converters, dartinfoconverter) {} - template < class Gmap, typename Converters, typename DartInfoConverter, - typename PointConverter > - Generalized_map(const Gmap & amap, const Converters& converters, + template + Generalized_map(const Generalized_map_base& amap, + const Converters& converters, const DartInfoConverter& dartinfoconverter, const PointConverter& pointconverter) : Base(amap, converters, dartinfoconverter, pointconverter) diff --git a/Generalized_map/include/CGAL/Generalized_map_storages.h b/Generalized_map/include/CGAL/Generalized_map_storages.h index 134a267d7a4..2e27d2acdb6 100644 --- a/Generalized_map/include/CGAL/Generalized_map_storages.h +++ b/Generalized_map/include/CGAL/Generalized_map_storages.h @@ -123,6 +123,8 @@ namespace CGAL { CGAL_assertion(i <= dimension); return dh->mf[i]==dh; } + bool is_perforated(Dart_const_handle /*dh*/) const + { return false; } /// Set simultaneously all the marks of this dart to a given value. void set_dart_marks(Dart_const_handle ADart, diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/GraphicsView/include/CGAL/Buffer_for_vao.h index e6f7cb8e341..c70d4a920a2 100644 --- a/GraphicsView/include/CGAL/Buffer_for_vao.h +++ b/GraphicsView/include/CGAL/Buffer_for_vao.h @@ -406,8 +406,8 @@ public: if (m_points_of_face.size()<3) { - std::cerr<<"PB: you try to triangulate a face with "<key()==::Qt::Key_U) && (modifiers==::Qt::NoButton)) + { + if (is_two_dimensional()) + { + displayMessage(QString("Move camera direction upside down.")); + /* CGAL::qglviewer::Vec cur=camera()->viewDirection(); + double cx=cur.x, cy=cur.y, cz=cur.z; + if (has_zero_x()) { cx=-cx; } + else if (has_zero_y()) { cy=-cy; } + else { cz=-cz; } + double cx=0., cy=0., cz=0.; + if (has_zero_x()) { cx=(cur.x<0?-1.:1); } + else if (has_zero_y()) { cy=(cur.y<0?-1.:1); } + else { cz=(cur.z<0?-1.:1); }*/ + + camera()->setUpVector(-camera()->upVector()); + //camera()->frame()->setConstraint(NULL); + // camera()->setViewDirection(CGAL::qglviewer::Vec(-cx,-cy,-cz)); + //constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(cx, cy, cz)); + //camera()->frame()->setConstraint(&constraint); + //update(); + redraw(); + } + } else if ((e->key()==::Qt::Key_T) && (modifiers==::Qt::NoButton)) { m_draw_text=!m_draw_text; diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h index dd02f4170da..5fcd56a002c 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h @@ -195,7 +195,6 @@ void DemosMainWindow::setUseAntialiasing(bool checked) { view->setRenderHint(QPainter::Antialiasing, checked); - view->setRenderHint(QPainter::HighQualityAntialiasing, checked); statusBar()->showMessage(tr("Antialiasing %1activated").arg(checked?"":"de-"), 1000); diff --git a/GraphicsView/include/CGAL/Qt/manipulatedFrame.h b/GraphicsView/include/CGAL/Qt/manipulatedFrame.h index 5cac20e055f..bbef82923c0 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedFrame.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedFrame.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace CGAL{ namespace qglviewer { @@ -348,7 +349,7 @@ private: qreal zoomSensitivity_; // Mouse speed and spinning - QTime last_move_time; + QElapsedTimer last_move_time; qreal mouseSpeed_; int delay_; bool isSpinning_; diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 605bba35dc4..feddd6e72b2 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -1038,7 +1038,7 @@ protected: int animationTimerId_; // F P S d i s p l a y - QTime fpsTime_; + QElapsedTimer fpsTime_; unsigned int fpsCounter_; QString fpsString_; qreal f_p_s_; diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index f0e9a5b5334..8b2cad8f9a1 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -46,6 +46,7 @@ #include #include #include +#include namespace CGAL{ // Static private variable @@ -2244,7 +2245,7 @@ void CGAL::QGLViewer::keyPressEvent(QKeyEvent *e) { unsigned int index = pathIndex_[::Qt::Key(key)]; // not safe, but try to double press on two viewers at the same time ! - static QTime doublePress; + static QElapsedTimer doublePress; if (modifiers == playPathKeyboardModifiers()) { int elapsed = doublePress.restart(); diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 012dbdf1a9b..736a64839c6 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -1,17 +1,31 @@ Release History =============== -Release 5.1 +[Release 5.1] (https://github.com/CGAL/cgal/releases/tag/releases%2FCGAL-5.1) ----------- Release date: June 2020 +### Surface Mesh Topology (new package) + + - This package allows to compute some topological invariants of + surfaces. For now, it is possible to test if two (closed) curves + on a combinatorial surface are homotopic. The user can choose + between free homotopy and homotopy with fixed endpoints. + A contractibility test is also provided. + ### 3D Fast Intersection and Distance Computation - **Breaking change**: the internal search tree is now lazily constructed. To disable it, one must call the new function `do_not_accelerate_distance_queries()` before the first distance query. ### Polygon Mesh Processing +- Introduced a new function, `CGAL::Polygon_mesh_processing::remove_connected_components_of_negligible_size()`, + which can be used to remove connected components whose area or volume is under a certain threshold. + Area and volume thresholds are either specified by the user or deduced from the bounding box of the mesh. +- Added a new named parameter for `keep_large_connected_components()` and `remove_connected_components_of_negligible_size` + that can be used to perform a dry run of the operation, meaning that the function will return the number of connected + components that would be removed with the specified threshold, but without actually removing them. - The function `CGAL::Polygon_mesh_processing::stitch_borders()` now returns the number of halfedge pairs that were stitched. diff --git a/Installation/cmake/modules/CGALConfig_install.cmake.in b/Installation/cmake/modules/CGALConfig_install.cmake.in index 873fa8c6a9e..cb51524dcfa 100644 --- a/Installation/cmake/modules/CGALConfig_install.cmake.in +++ b/Installation/cmake/modules/CGALConfig_install.cmake.in @@ -55,7 +55,7 @@ set(CGAL_ImageIO_USE_ZLIB "@CGAL_ImageIO_USE_ZLIB@" ) set(CGAL_VERSION "${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}.${CGAL_BUGFIX_VERSION}") set(CGAL_USE_FILE "${CGAL_MODULES_DIR}/UseCGAL.cmake" ) -set(CGAL_GRAPHICSVIEW_PACKAGE_DIR "${CGAL_INCLUDE_DIRS}/CGAL/" CACHE INTERNAL "Directory containing the GraphicsView package") +set(CGAL_GRAPHICSVIEW_PACKAGE_DIR "${CGAL_INSTALL_PREFIX}" CACHE INTERNAL "Directory containing the GraphicsView package") if ( CGAL_FIND_REQUIRED ) set( CHECK_CGAL_COMPONENT_MSG_ON_ERROR TRUE ) diff --git a/Installation/cmake/modules/FindGLPK.cmake b/Installation/cmake/modules/FindGLPK.cmake index b2e6f4476c5..9e060acf81d 100644 --- a/Installation/cmake/modules/FindGLPK.cmake +++ b/Installation/cmake/modules/FindGLPK.cmake @@ -15,7 +15,7 @@ if (NOT GLPK_FOUND) ) find_library(GLPK_LIBRARIES - NAMES libglpk + NAMES libglpk glpk PATHS ENV LD_LIBRARY_PATH ENV LIBRARY_PATH /usr/local/lib diff --git a/Installation/cmake/modules/FindOpenMesh.cmake b/Installation/cmake/modules/FindOpenMesh.cmake index 1a6bad504dd..823ede4de3c 100644 --- a/Installation/cmake/modules/FindOpenMesh.cmake +++ b/Installation/cmake/modules/FindOpenMesh.cmake @@ -6,6 +6,8 @@ # OPENMESH_LIBRARIES - OpenMesh libraries # +find_package(OpenMesh NO_MODULE QUIET) + # Is it already configured? if (NOT OpenMesh_FOUND) @@ -44,7 +46,34 @@ endif() include( FindPackageHandleStandardArgs ) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenMesh - REQUIRED_VARS OPENMESH_INCLUDE_DIR OPENMESH_LIBRARIES - FOUND_VAR OpenMesh_FOUND - ) +find_package_handle_standard_args(OpenMesh + REQUIRED_VARS OPENMESH_INCLUDE_DIR OPENMESH_LIBRARIES + FOUND_VAR OpenMesh_FOUND + ) + +if(OpenMesh_FOUND AND NOT TARGET OpenMesh::OpenMesh) + add_library(OpenMesh::OpenMesh UNKNOWN IMPORTED) + + if(TARGET OpenMeshCore) + target_link_libraries(OpenMesh::OpenMesh PUBLIC OpenMeshCore) + return() + endif() + + set_target_properties(OpenMesh::OpenMesh PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES" + INTERFACE_INCLUDE_DIRECTORIES "${OPENMESH_INCLUDE_DIR}") + + if(OPENMESH_LIBRARY_RELEASE) + set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(OpenMesh::OpenMesh PROPERTIES + IMPORTED_LOCATION_RELEASE "${OPENMESH_LIBRARY_RELEASE}") + endif() + + if(OPENMESH_LIBRARY_DEBUG) + set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(OpenMesh::OpenMesh PROPERTIES + IMPORTED_LOCATION_DEBUG "${OPENMESH_LIBRARY_DEBUG}") + endif() +endif() diff --git a/Installation/include/CGAL/license/Surface_mesh_topology.h b/Installation/include/CGAL/license/Surface_mesh_topology.h new file mode 100644 index 00000000000..57f92380b3a --- /dev/null +++ b/Installation/include/CGAL/license/Surface_mesh_topology.h @@ -0,0 +1,54 @@ +// Copyright (c) 2016 GeometryFactory SARL (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Andreas Fabri +// +// Warning: this file is generated, see include/CGAL/licence/README.md + +#ifndef CGAL_LICENSE_SURFACE_MESH_TOPOLOGY_H +#define CGAL_LICENSE_SURFACE_MESH_TOPOLOGY_H + +#include +#include + +#ifdef CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE + +# if CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE + +# if defined(CGAL_LICENSE_WARNING) + + CGAL_pragma_warning("Your commercial license for CGAL does not cover " + "this release of the Surface Mesh Topology package.") +# endif + +# ifdef CGAL_LICENSE_ERROR +# error "Your commercial license for CGAL does not cover this release \ + of the Surface Mesh Topology package. \ + You get this error, as you defined CGAL_LICENSE_ERROR." +# endif // CGAL_LICENSE_ERROR + +# endif // CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE + +#else // no CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE + +# if defined(CGAL_LICENSE_WARNING) + CGAL_pragma_warning("\nThe macro CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE is not defined." + "\nYou use the CGAL Surface Mesh Topology package under " + "the terms of the GPLv3+.") +# endif // CGAL_LICENSE_WARNING + +# ifdef CGAL_LICENSE_ERROR +# error "The macro CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE is not defined.\ + You use the CGAL Surface Mesh Topology package under the terms of \ + the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR." +# endif // CGAL_LICENSE_ERROR + +#endif // no CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE + +#endif // CGAL_LICENSE_SURFACE_MESH_TOPOLOGY_H diff --git a/Installation/include/CGAL/license/gpl_package_list.txt b/Installation/include/CGAL/license/gpl_package_list.txt index 9841982de7d..c82b04d0784 100644 --- a/Installation/include/CGAL/license/gpl_package_list.txt +++ b/Installation/include/CGAL/license/gpl_package_list.txt @@ -82,6 +82,7 @@ Surface_mesh_segmentation Triangulated Surface Mesh Segmentation Surface_mesh_shortest_path Triangulated Surface Mesh Shortest Paths Surface_mesh_simplification Triangulated Surface Mesh Simplification Surface_mesh_skeletonization Triangulated Surface Mesh Skeletonization +Surface_mesh_topology Surface Mesh Topology Surface_sweep_2 2D Intersection of Curves TDS_2 2D Triangulation Data Structure TDS_3 3D Triangulation Data Structure diff --git a/Kernel_23/include/CGAL/internal/Projection_traits_3.h b/Kernel_23/include/CGAL/internal/Projection_traits_3.h index 95c12d97e8f..c203eb6be7b 100644 --- a/Kernel_23/include/CGAL/internal/Projection_traits_3.h +++ b/Kernel_23/include/CGAL/internal/Projection_traits_3.h @@ -89,6 +89,7 @@ template class Construct_bbox_projected_2 { public: typedef typename R::Point_3 Point; + typedef Bbox_2 result_type; Bbox_2 operator()(const Point& p) const { typename R::Construct_bbox_3 bb; return Projector::bbox(bb(p)); } }; diff --git a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt index b9b86d10fc5..d9edd8915d6 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt @@ -24,7 +24,7 @@ endif() # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") # To use valgrind, we must disable rounding math ckeck. -# add_definition(-DCGAL_DISABLE_ROUNDING_MATH_CHECK) +# add_definitions(-DCGAL_DISABLE_ROUNDING_MATH_CHECK) if (CGAL_FOUND) diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h index 8d852eba13a..ef414af8759 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h @@ -150,6 +150,8 @@ namespace CGAL { CGAL_assertion(i <= dimension); return dh->mf[i]==null_dart_handle; } + bool is_perforated(Dart_const_handle /*dh*/) const + { return false; } /// Set simultaneously all the marks of this dart to a given value. void set_dart_marks(Dart_const_handle ADart, diff --git a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h index d6e851b433f..7a75e7824b9 100644 --- a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h @@ -142,6 +142,8 @@ namespace CGAL { CGAL_assertion(i <= dimension); return dh->mf[i]==dh; } + bool is_perforated(Dart_const_handle /*dh*/) const + { return false; } /// Set simultaneously all the marks of this dart to a given value. void set_dart_marks(Dart_const_handle ADart, diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h index 1ebe43a6a5d..1507e27c253 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h @@ -147,26 +147,48 @@ namespace CGAL { Linear_cell_complex_base(const Self& alcc) : Base(alcc) {} - template < class LCC2 > - Linear_cell_complex_base(const LCC2& alcc) : Base(alcc) + template class CMap2, + class Refs2, class Storage2> + Linear_cell_complex_base + (const Linear_cell_complex_base& alcc) : Base(alcc) {} - template < class LCC2, typename Converters > - Linear_cell_complex_base(const LCC2& alcc, Converters& converters) : + template class CMap2, + class Refs2, + class Storage2, typename Converters> + Linear_cell_complex_base + (const Linear_cell_complex_base& alcc, Converters& converters) : Base(alcc, converters) {} - template < class LCC2, typename Converters, typename DartInfoConverter > - Linear_cell_complex_base(const LCC2& alcc, Converters& converters, - const DartInfoConverter& dartinfoconverter) : + template class CMap2, + class Refs2, class Storage2, typename Converters, + typename DartInfoConverter> + Linear_cell_complex_base + (const Linear_cell_complex_base& alcc, Converters& converters, + const DartInfoConverter& dartinfoconverter) : Base(alcc, converters, dartinfoconverter) {} - template < class LCC2, typename Converters, typename DartInfoConverter, - typename Pointconverter > - Linear_cell_complex_base(const LCC2& alcc, Converters& converters, - const DartInfoConverter& dartinfoconverter, - const Pointconverter& pointconverter) : + template class CMap2, + class Refs2, class Storage2, typename Converters, + typename DartInfoConverter, typename Pointconverter> + Linear_cell_complex_base + (const Linear_cell_complex_base& alcc, Converters& converters, + const DartInfoConverter& dartinfoconverter, + const Pointconverter& pointconverter) : Base(alcc, converters, dartinfoconverter, pointconverter) {} diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h index 052421e0e15..48519960458 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h @@ -17,6 +17,7 @@ #include #include #include +#include namespace CGAL { @@ -100,40 +101,119 @@ namespace CGAL { * @param alcc the linear cell complex to copy. * @post *this is valid. */ -#ifdef DOXYGEN_RUNNING Linear_cell_complex_for_combinatorial_map(const Self& alcc) : Base(alcc) {} -#endif - - template < class LCC2 > - Linear_cell_complex_for_combinatorial_map(const LCC2& alcc) : Base(alcc) + + template class CMap2, + class Storage2> + Linear_cell_complex_for_combinatorial_map + (const Linear_cell_complex_for_combinatorial_map& alcc) : Base(alcc) {} - template < class LCC2, typename Converters > - Linear_cell_complex_for_combinatorial_map(const LCC2& alcc, - Converters& converters) : - Base(alcc, converters) + template class CMap2, + class Storage2, typename Converters> + Linear_cell_complex_for_combinatorial_map + (const Linear_cell_complex_for_combinatorial_map& alcc, + const Converters& converters) : Base(alcc, converters) {} - template < class LCC2, typename Converters, typename DartInfoConverter > - Linear_cell_complex_for_combinatorial_map(const LCC2& alcc, - Converters& converters, - const DartInfoConverter& - dartinfoconverter) : + template class CMap2, + class Storage2, typename Converters, typename DartInfoConverter> + Linear_cell_complex_for_combinatorial_map + (const Linear_cell_complex_for_combinatorial_map& alcc, + const Converters& converters, + const DartInfoConverter& dartinfoconverter) : Base(alcc, converters, dartinfoconverter) {} - template < class LCC2, typename Converters, typename DartInfoConverter, - typename PointConverter > - Linear_cell_complex_for_combinatorial_map(const LCC2& alcc, - Converters& converters, - const DartInfoConverter& - dartinfoconverter, - const PointConverter& - pointconverter) : + template class CMap2, + class Storage2, typename Converters, + typename DartInfoConverter, typename PointConverter> + Linear_cell_complex_for_combinatorial_map + (const Linear_cell_complex_for_combinatorial_map& alcc, + const Converters& converters, const DartInfoConverter& dartinfoconverter, + const PointConverter& pointconverter) : Base(alcc, converters, dartinfoconverter, pointconverter) {} + Self & operator= (const Self & alcc) + { + Base::operator=(alcc); + return *this; + } + + /** Import the given hds which should be a model of an halfedge graph. */ + template + void import_from_halfedge_graph(const HEG& heg , + const PointConverter& pointconverter, + boost::unordered_map + ::halfedge_descriptor, + Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::halfedge_descriptor>* + copy_to_origin=NULL) + + { + boost::unordered_map + ::halfedge_descriptor, + Dart_handle> local_dartmap; + if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map + { origin_to_copy=&local_dartmap; } + + Base::import_from_halfedge_graph(heg, origin_to_copy, copy_to_origin); + + typedef typename boost::property_map::const_type + Point_property_map; + Point_property_map ppmap = get(CGAL::vertex_point, heg); + + typename boost::unordered_map + ::halfedge_descriptor, + Dart_handle>::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end(); + for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end; + ++dartmap_iter) + { + if (this->vertex_attribute(dartmap_iter->second)==NULL) + { + this->set_vertex_attribute(dartmap_iter->second, + this->create_vertex_attribute()); + pointconverter.run(ppmap[source(dartmap_iter->first, heg)], + this->point(dartmap_iter->second)); + } + } + } + + /** Import the given hds which should be a model of an halfedge graph. */ + template + void import_from_halfedge_graph(const HEG& heg, + boost::unordered_map + ::halfedge_descriptor, + Dart_handle>* origin_to_copy=NULL, + boost::unordered_map + ::halfedge_descriptor>* + copy_to_origin=NULL) + { + typedef typename boost::property_traits::type>::value_type HEG_point; + + CGAL::internal::Set_point_if_possible_cmap default_point_converter; + import_from_halfedge_graph(heg, default_point_converter, + origin_to_copy, copy_to_origin); + } + }; } // namespace CGAL diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h index 6b2f8292b67..079a5143c7f 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h @@ -96,40 +96,59 @@ namespace CGAL { * @param alcc the linear cell complex to copy. * @post *this is valid. */ -#ifdef DOXYGEN_RUNNING Linear_cell_complex_for_generalized_map(const Self & alcc) : Base(alcc) {} -#endif - - template < class LCC2 > - Linear_cell_complex_for_generalized_map(const LCC2& alcc) : Base(alcc) + + template class CMap2, + class Storage2> + Linear_cell_complex_for_generalized_map + (const Linear_cell_complex_for_generalized_map& alcc) : Base(alcc) {} - template < class LCC2, typename Converters > - Linear_cell_complex_for_generalized_map(const LCC2& alcc, - Converters& converters) : - Base(alcc, converters) + template class CMap2, + class Storage2, typename Converters> + Linear_cell_complex_for_generalized_map + (const Linear_cell_complex_for_generalized_map& alcc, + const Converters& converters) : Base(alcc, converters) {} - template < class LCC2, typename Converters, typename DartInfoConverter > - Linear_cell_complex_for_generalized_map(const LCC2& alcc, - Converters& converters, - const DartInfoConverter& - dartinfoconverter) : + template class CMap2, + class Storage2, typename Converters, typename DartInfoConverter> + Linear_cell_complex_for_generalized_map + (const Linear_cell_complex_for_generalized_map& alcc, + const Converters& converters, + const DartInfoConverter& dartinfoconverter) : Base(alcc, converters, dartinfoconverter) {} - template < class LCC2, typename Converters, typename DartInfoConverter, - typename PointConverter > - Linear_cell_complex_for_generalized_map(const LCC2& alcc, - Converters& converters, - const DartInfoConverter& - dartinfoconverter, - const PointConverter& - pointconverter) : + template class CMap2, + class Storage2, typename Converters, typename DartInfoConverter, + typename PointConverter> + Linear_cell_complex_for_generalized_map + (const Linear_cell_complex_for_generalized_map& alcc, + const Converters& converters, + const DartInfoConverter& dartinfoconverter, + const PointConverter& pointconverter) : Base(alcc, converters, dartinfoconverter, pointconverter) {} + Self & operator= (const Self & alcc) + { + Base::operator=(alcc); + return *this; + } }; } // namespace CGAL diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 0a411c66a42..946cdad69b0 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -16,7 +16,7 @@ #ifdef CGAL_USE_BASIC_VIEWER -#include +#include #include namespace CGAL diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab index 6d4757ab8f2..6912301cc49 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab @@ -27,7 +27,7 @@ LC_CTYPE=en_US.UTF-8 # "integration" 0 21 * * Mon,Tue,Wed,Thu cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/integration.git $HOME/CGAL/branches/empty-dir --do-it --public || echo ERROR # from branch 5.0 -0 21 * * fri cd $HOME/CGAL/create_internal_release-5.0-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.14-branch.git --public --do-it || echo ERROR +0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.0-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.0-branch.git --public --do-it || echo ERROR # from branch 4.14 0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.14-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.14-branch.git --public --do-it || echo ERROR diff --git a/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html new file mode 100644 index 00000000000..6cb41ecb451 --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html @@ -0,0 +1,136 @@ + + + + + Diff of Testsuites + + + + + + + + +

+ + + + + +
+ I = Master
+ Ic = integration +

+

+
+
+
+
+

+ + + + diff --git a/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js new file mode 100644 index 00000000000..04486118b8d --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js @@ -0,0 +1,148 @@ +/* Author: Maxime Gimeno */ + +/*** + Needs difflib.js, fill_empty_lines.js and print_diff.js to work. + + Input : 2 strings of the form "CGAL-M.m.mm-I[c]-XXX" + + Output: the list of differences between the testsuites. + +***/ + +//v1.7 +function diff_testsuites(baseTest, newTest){ + var URL_suff='https://cgal.geometryfactory.com/~mgimeno/testsuite_comparison/list_of_suffixes.txt'; + var URL_testsuite='https://cgal.geometryfactory.com/CGAL/Members/testsuite/'; + //get the list of suffixes + var xhr = new XMLHttpRequest(); + xhr.open('GET', URL_suff, false); + xhr.send(null); + var tmp=xhr.responseText; + var suffixes=tmp.split("\n"); + suffixes.sort(); + suffixes.reverse(); + var myArray = new Array(); + + //contains the diff of existing platforms. + + var diffArray = new Array(); + + var init = false; + for(s = 0; s < suffixes.length; s++) { + var new_column = new Array(); + xhr.open('GET', URL_testsuite+baseTest+'/'+suffixes[s], false); + xhr.send(null); + var base_exists = (xhr.status === 200); + var base=xhr.responseText; + xhr.open('GET', URL_testsuite+newTest+'/'+suffixes[s], false); + xhr.send(null); + var new_exists = (xhr.status === 200) + + if(base_exists && !new_exists) + { + diffArray.push("-"+suffixes[s]); + continue; + } + if(!base_exists && new_exists) + { + diffArray.push("+"+suffixes[s]); + continue; + } + if(!base_exists && !new_exists) + { + continue; + } + + var newtext=xhr.responseText; + var sp_base=base.split("\n"); + sp_base.sort(); + var sp_newtext=newtext.split("\n"); + sp_newtext.sort(); + addMissingLines(sp_base, sp_newtext); + if(!init) + { + var first_column = new Array(); + first_column.push("Platform") + for(i=0; i< sp_base.length; i++){ + if(sp_base[i] !== ""){ + first_column.push(sp_base[i].substr(0, sp_base[i].length-2)); + } else { + first_column.push(sp_newtext[i].substr(0, sp_newtext[i].length-2)); + } + } + myArray.push(first_column); + init = true; + } + var fragments = suffixes[s].split("_"); + fragments.shift(); + var name = fragments.join("_"); + name = name.replace('.txt', ''); + if(name !== ""){ + new_column.push(name.replace(fragments[0]+"_", '')); + for(i=0; i< sp_base.length; i++){ + var broken = false; + var res = print_diff(sp_base[i], sp_newtext[i]); + var compensator=0; + if(sp_base[i] !== ""){ + while(sp_base[i].substr(0, sp_base[i].length-2) !== first_column[i+compensator]){ + if(compensator >10){ + broken=true; + break; + } + compensator++; + } + } + else{ + while(sp_newtext[i].substr(0, sp_newtext[i].length-2) !== first_column[i+compensator]){ + if(compensator >10){ + broken=true; + break; + } + compensator++; + } + } + if(broken) + { + continue; + } + var new_line=first_column[i+compensator]+"||"+" "+result; + } else if(res[1]=== "r"){ + new_line+=" background-color: rgb(65%,65%,100%)'> "+result; + } else if(res[1]=== "n"){ + new_line+=" background-color: rgb(100%,50%,50%)'> "+result; + } + else if(res[1]==="" && res[0]!==""){ + new_line+=" background-color: rgb(50%,25%,75%)'>"+result; + } + else{ + new_line+="'>"; + } + new_line+=""; + new_column.push(new_line); + } + myArray.push(new_column); + } + } + + return [myArray, diffArray]; +} diff --git a/Maintenance/test_handling/testsuite_comparison/difflib.js b/Maintenance/test_handling/testsuite_comparison/difflib.js new file mode 100644 index 00000000000..c8b335362b9 --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/difflib.js @@ -0,0 +1,409 @@ +/*** +This is part of jsdifflib v1.0. +Copyright (c) 2007, Snowtide Informatics Systems, Inc. +All rights reserved. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Snowtide Informatics Systems nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +***/ +/* Author: Chas Emerick */ +var __whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true}; + +var difflib = { + defaultJunkFunction: function (c) { + return __whitespace.hasOwnProperty(c); + }, + + stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); }, + + stringAsLines: function (str) { + var lfpos = str.indexOf("\n"); + var crpos = str.indexOf("\r"); + var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r"; + + var lines = str.split(linebreak); + for (var i = 0; i < lines.length; i++) { + lines[i] = difflib.stripLinebreaks(lines[i]); + } + + return lines; + }, + + // iteration-based reduce implementation + __reduce: function (func, list, initial) { + if (initial != null) { + var value = initial; + var idx = 0; + } else if (list) { + var value = list[0]; + var idx = 1; + } else { + return null; + } + + for (; idx < list.length; idx++) { + value = func(value, list[idx]); + } + + return value; + }, + + // comparison function for sorting lists of numeric tuples + __ntuplecomp: function (a, b) { + var mlen = Math.max(a.length, b.length); + for (var i = 0; i < mlen; i++) { + if (a[i] < b[i]) return -1; + if (a[i] > b[i]) return 1; + } + + return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1); + }, + + __calculate_ratio: function (matches, length) { + return length ? 2.0 * matches / length : 1.0; + }, + + // returns a function that returns true if a key passed to the returned function + // is in the dict (js object) provided to this function; replaces being able to + // carry around dict.has_key in python... + __isindict: function (dict) { + return function (key) { return dict.hasOwnProperty(key); }; + }, + + // replacement for python's dict.get function -- need easy default values + __dictget: function (dict, key, defaultValue) { + return dict.hasOwnProperty(key) ? dict[key] : defaultValue; + }, + + SequenceMatcher: function (a, b, isjunk) { + this.set_seqs = function (a, b) { + this.set_seq1(a); + this.set_seq2(b); + } + + this.set_seq1 = function (a) { + if (a == this.a) return; + this.a = a; + this.matching_blocks = this.opcodes = null; + } + + this.set_seq2 = function (b) { + if (b == this.b) return; + this.b = b; + this.matching_blocks = this.opcodes = this.fullbcount = null; + this.__chain_b(); + } + + this.__chain_b = function () { + var b = this.b; + var n = b.length; + var b2j = this.b2j = {}; + var populardict = {}; + for (var i = 0; i < b.length; i++) { + var elt = b[i]; + if (b2j.hasOwnProperty(elt)) { + var indices = b2j[elt]; + if (n >= 200 && indices.length * 100 > n) { + populardict[elt] = 1; + delete b2j[elt]; + } else { + indices.push(i); + } + } else { + b2j[elt] = [i]; + } + } + + for (var elt in populardict) { + if (populardict.hasOwnProperty(elt)) { + delete b2j[elt]; + } + } + + var isjunk = this.isjunk; + var junkdict = {}; + if (isjunk) { + for (var elt in populardict) { + if (populardict.hasOwnProperty(elt) && isjunk(elt)) { + junkdict[elt] = 1; + delete populardict[elt]; + } + } + for (var elt in b2j) { + if (b2j.hasOwnProperty(elt) && isjunk(elt)) { + junkdict[elt] = 1; + delete b2j[elt]; + } + } + } + + this.isbjunk = difflib.__isindict(junkdict); + this.isbpopular = difflib.__isindict(populardict); + } + + this.find_longest_match = function (alo, ahi, blo, bhi) { + var a = this.a; + var b = this.b; + var b2j = this.b2j; + var isbjunk = this.isbjunk; + var besti = alo; + var bestj = blo; + var bestsize = 0; + var j = null; + var k; + + var j2len = {}; + var nothing = []; + for (var i = alo; i < ahi; i++) { + var newj2len = {}; + var jdict = difflib.__dictget(b2j, a[i], nothing); + for (var jkey in jdict) { + if (jdict.hasOwnProperty(jkey)) { + j = jdict[jkey]; + if (j < blo) continue; + if (j >= bhi) break; + newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1; + if (k > bestsize) { + besti = i - k + 1; + bestj = j - k + 1; + bestsize = k; + } + } + } + j2len = newj2len; + } + + while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { + besti--; + bestj--; + bestsize++; + } + + while (besti + bestsize < ahi && bestj + bestsize < bhi && + !isbjunk(b[bestj + bestsize]) && + a[besti + bestsize] == b[bestj + bestsize]) { + bestsize++; + } + + while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { + besti--; + bestj--; + bestsize++; + } + + while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) && + a[besti + bestsize] == b[bestj + bestsize]) { + bestsize++; + } + + return [besti, bestj, bestsize]; + } + + this.get_matching_blocks = function () { + if (this.matching_blocks != null) return this.matching_blocks; + var la = this.a.length; + var lb = this.b.length; + + var queue = [[0, la, 0, lb]]; + var matching_blocks = []; + var alo, ahi, blo, bhi, qi, i, j, k, x; + while (queue.length) { + qi = queue.pop(); + alo = qi[0]; + ahi = qi[1]; + blo = qi[2]; + bhi = qi[3]; + x = this.find_longest_match(alo, ahi, blo, bhi); + i = x[0]; + j = x[1]; + k = x[2]; + + if (k) { + matching_blocks.push(x); + if (alo < i && blo < j) + queue.push([alo, i, blo, j]); + if (i+k < ahi && j+k < bhi) + queue.push([i + k, ahi, j + k, bhi]); + } + } + + matching_blocks.sort(difflib.__ntuplecomp); + + var i1 = 0, j1 = 0, k1 = 0, block = 0; + var i2, j2, k2; + var non_adjacent = []; + for (var idx in matching_blocks) { + if (matching_blocks.hasOwnProperty(idx)) { + block = matching_blocks[idx]; + i2 = block[0]; + j2 = block[1]; + k2 = block[2]; + if (i1 + k1 == i2 && j1 + k1 == j2) { + k1 += k2; + } else { + if (k1) non_adjacent.push([i1, j1, k1]); + i1 = i2; + j1 = j2; + k1 = k2; + } + } + } + + if (k1) non_adjacent.push([i1, j1, k1]); + + non_adjacent.push([la, lb, 0]); + this.matching_blocks = non_adjacent; + return this.matching_blocks; + } + + this.get_opcodes = function () { + if (this.opcodes != null) return this.opcodes; + var i = 0; + var j = 0; + var answer = []; + this.opcodes = answer; + var block, ai, bj, size, tag; + var blocks = this.get_matching_blocks(); + for (var idx in blocks) { + if (blocks.hasOwnProperty(idx)) { + block = blocks[idx]; + ai = block[0]; + bj = block[1]; + size = block[2]; + tag = ''; + if (i < ai && j < bj) { + tag = 'replace'; + } else if (i < ai) { + tag = 'delete'; + } else if (j < bj) { + tag = 'insert'; + } + if (tag) answer.push([tag, i, ai, j, bj]); + i = ai + size; + j = bj + size; + + if (size) answer.push(['equal', ai, i, bj, j]); + } + } + + return answer; + } + + // this is a generator function in the python lib, which of course is not supported in javascript + // the reimplementation builds up the grouped opcodes into a list in their entirety and returns that. + this.get_grouped_opcodes = function (n) { + if (!n) n = 3; + var codes = this.get_opcodes(); + if (!codes) codes = [["equal", 0, 1, 0, 1]]; + var code, tag, i1, i2, j1, j2; + if (codes[0][0] == 'equal') { + code = codes[0]; + tag = code[0]; + i1 = code[1]; + i2 = code[2]; + j1 = code[3]; + j2 = code[4]; + codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2]; + } + if (codes[codes.length - 1][0] == 'equal') { + code = codes[codes.length - 1]; + tag = code[0]; + i1 = code[1]; + i2 = code[2]; + j1 = code[3]; + j2 = code[4]; + codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]; + } + + var nn = n + n; + var group = []; + var groups = []; + for (var idx in codes) { + if (codes.hasOwnProperty(idx)) { + code = codes[idx]; + tag = code[0]; + i1 = code[1]; + i2 = code[2]; + j1 = code[3]; + j2 = code[4]; + if (tag == 'equal' && i2 - i1 > nn) { + group.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]); + groups.push(group); + group = []; + i1 = Math.max(i1, i2-n); + j1 = Math.max(j1, j2-n); + } + + group.push([tag, i1, i2, j1, j2]); + } + } + + if (group && !(group.length == 1 && group[0][0] == 'equal')) groups.push(group) + + return groups; + } + + this.ratio = function () { + matches = difflib.__reduce( + function (sum, triple) { return sum + triple[triple.length - 1]; }, + this.get_matching_blocks(), 0); + return difflib.__calculate_ratio(matches, this.a.length + this.b.length); + } + + this.quick_ratio = function () { + var fullbcount, elt; + if (this.fullbcount == null) { + this.fullbcount = fullbcount = {}; + for (var i = 0; i < this.b.length; i++) { + elt = this.b[i]; + fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1; + } + } + fullbcount = this.fullbcount; + + var avail = {}; + var availhas = difflib.__isindict(avail); + var matches = numb = 0; + for (var i = 0; i < this.a.length; i++) { + elt = this.a[i]; + if (availhas(elt)) { + numb = avail[elt]; + } else { + numb = difflib.__dictget(fullbcount, elt, 0); + } + avail[elt] = numb - 1; + if (numb > 0) matches++; + } + + return difflib.__calculate_ratio(matches, this.a.length + this.b.length); + } + + this.real_quick_ratio = function () { + var la = this.a.length; + var lb = this.b.length; + return _calculate_ratio(Math.min(la, lb), la + lb); + } + + this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction; + this.a = this.b = null; + this.set_seqs(a, b); + } +}; + diff --git a/Maintenance/test_handling/testsuite_comparison/fill_empty_lines.js b/Maintenance/test_handling/testsuite_comparison/fill_empty_lines.js new file mode 100644 index 00000000000..366df662d7c --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/fill_empty_lines.js @@ -0,0 +1,47 @@ +/* Author: Maxime Gimeno */ + +/*** + This is designed to treat lines from CGAL testsuites results files, + of the form Package_name [r/y/w/n]. + + Input : 2 arrays of string, sorted by alphabetical order. + + Output: the arrays, alphabetically sorted, of the same size, filled with + empty strings. + + Short: Equalizes the sizes of the two inpu arrays by adding empty strings. + + Detailed: for each element of the smaller input, + if base[i] != newtest[i] (not taking the last char into account), + adds an empty string in the input that is missing this entry, + based on the alphabetical order. Once it is done, will fill the smaller array + with empty strings if necessary. + + +***/ +function addMissingLines(base, newtext){ + for(i=0, j=0; inewtext.length){ + minsize = newtext.length; + maxsize = base.length; + to_fill = newtext; + } + for(i = minsize; i < maxsize; i++) + { + to_fill.push(""); + } +} diff --git a/Maintenance/test_handling/testsuite_comparison/print_diff.js b/Maintenance/test_handling/testsuite_comparison/print_diff.js new file mode 100644 index 00000000000..9340d2c1013 --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/print_diff.js @@ -0,0 +1,44 @@ +/* Author: Maxime Gimeno */ +/*** +Need difflib.js + +Input : 2 strings + +Output: res. Contains the difference between the two input strings. + +According to the result of difflib, will output : +- replace : -base, +newtext (the two input differs, but none are empty) +- insert: +newtext (the first input is empty) +- delete: -base (the second input is empty) +***/ + +function print_diff(base, newtext){ + // create a SequenceMatcher instance that diffs the two sets of lines + var sm = new difflib.SequenceMatcher(base, newtext); + // get the opcodes from the SequenceMatcher instance + // opcodes is a list of 3-tuples describing what changes should be made to the base text + // in order to yield the new text + var opcodes = sm.get_opcodes(); + var res=["",""]; + for (var idx = 0; idx < opcodes.length; idx++) { + code = opcodes[idx]; + change = code[0]; + var b = code[1]; + var be = code[2]; + var n = code[3]; + var ne = code[4]; + if(newtext.charAt(newtext.length-1) !== "y" + && change != "equal"){ + res[0]=base.charAt(base.length-1); + res[1]=newtext.charAt(newtext.length-1); + } + //else if(change == "insert") { + // res=newtext.charAt(newtext.length-1); + //} + //else if(change == "delete") { + // res="-"; + //} + //} + } + return res; +} diff --git a/Maintenance/test_handling/testsuite_comparison/test.html b/Maintenance/test_handling/testsuite_comparison/test.html new file mode 100644 index 00000000000..41a19d74d67 --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/test.html @@ -0,0 +1,51 @@ + + + + + Combo Box Test + + + + + + + + + diff --git a/Maintenance/test_handling/testsuite_comparison/worker.js b/Maintenance/test_handling/testsuite_comparison/worker.js new file mode 100644 index 00000000000..8938ea93c38 --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/worker.js @@ -0,0 +1,62 @@ + + +onmessage=function(e){ + importScripts('difflib.js', 'diff_testsuites.js'); + importScripts('fill_empty_lines.js','print_diff.js'); + var res_arrays = diff_testsuites(e.data[0],e.data[1]); + var myArray = res_arrays[0]; + var diffArray = res_arrays[1]; + for(var i=0; i"+ diffArray[i]+""]); + } + postMessage(["diffPlatforms", ""]); + //pass over My Array to equalize columns length + + var max_length=myArray[0].length; + for( i = 1; i< myArray.length; ++i){ + var length = myArray[i].length; + if(length === max_length){ continue; } + for(var j=2; j"); + } + } + var minsize = myArray[i].length; + + for(k = minsize; k < myArray[0].length; k++) + { + myArray[i].push(""); + } + } + + for(i=1; i"+i+": "+ myArray[i][0]+""]); + } + postMessage(["namesTable", ""]); + + postMessage(["testTable", "Platform: "]); + for(i=1; i" + i + ""]); + } + postMessage(["testTable", ""]); + for (var j=2; j"+ myArray[0][j]+": "]); + for(i=1; i"]); + } + postMessage(["testTable", ""]); + postMessage(["finished"]); +} diff --git a/Mesh_2/include/CGAL/Mesh_2/Clusters.h b/Mesh_2/include/CGAL/Mesh_2/Clusters.h index 6ea340f647e..c1529bd96b8 100644 --- a/Mesh_2/include/CGAL/Mesh_2/Clusters.h +++ b/Mesh_2/include/CGAL/Mesh_2/Clusters.h @@ -89,7 +89,7 @@ public: /** * The following map tells what vertices are in the cluster and if - * the corresponding segment has been splitted once. + * the corresponding segment has been split once. */ typedef std::map Vertices_map; Vertices_map vertices; diff --git a/Mesh_2/include/CGAL/Mesh_2/Refine_edges.h b/Mesh_2/include/CGAL/Mesh_2/Refine_edges.h index 23bc7b24a16..3420990ed3c 100644 --- a/Mesh_2/include/CGAL/Mesh_2/Refine_edges.h +++ b/Mesh_2/include/CGAL/Mesh_2/Refine_edges.h @@ -493,7 +493,7 @@ public: /** This version computes the refinement point without handling clusters. The refinement point of an edge is just the middle point of the segment. - Saves the handles of the edge that will be splitted. + Saves the handles of the edge that will be split. This function is overridden in class Refine_edge_with_clusters. */ Point refinement_point_impl(const Edge& edge) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h index 296d1bc5427..18f4d42663c 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/Scene.h @@ -106,9 +106,8 @@ public Q_SLOTS: void insert_mp() { insert_point(moving_point); - QString str; - ui->viewer->displayMessage(str.sprintf("Added point (%f, %f, %f)", - moving_point.x(),moving_point.y(),moving_point.z())); + ui->viewer->displayMessage(QString("Added point (%1, %2, %3)").arg( + moving_point.x()).arg(moving_point.y()).arg(moving_point.z())); changed(); } @@ -117,9 +116,8 @@ public Q_SLOTS: Point pt = *rp+Vector(0.5,0.5,0.5); rp++; insert_point(Point(pt.x(),pt.y(),(in_plane? 0.0:pt.z()))); - QString str; - ui->viewer->displayMessage(str.sprintf("Added point (%f, %f, %f)", - pt.x(),pt.y(),(in_plane? 0.0:pt.z()))); + ui->viewer->displayMessage(QString("Added point (%1, %2, %3)").arg( + pt.x()).arg(pt.y()).arg((in_plane? 0.0:pt.z()))); changed(); } void insert_point(Point p) { diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp index 6fd19cdf7c9..9d82538f863 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp @@ -16,7 +16,7 @@ MainWindow::MainWindow(QWidget* parent): CGAL::Qt::DemosMainWindow(parent) scene.eight_copies=false; scene.two_dimensional=false; - qtimer = new QTimer(this); + qtimer= new QTimer(this); connect(qtimer, SIGNAL(timeout()), this, SLOT(lloydStep())); } diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index 8fe32fbdbfa..16cd9ddf3c8 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -231,6 +231,18 @@ public: return *this; } + /// \cond SKIP_IN_MANUAL + // copy constructor (same as assignment) + Point_set_3 (const Point_set_3& ps) + { + m_base = ps.m_base; + m_indices = this->property_map ("index").first; + m_points = this->property_map ("point").first; + m_normals = this->property_map ("normal").first; + m_nb_removed = ps.m_nb_removed; + } + /// \endcond + /// @} /// \cond SKIP_IN_MANUAL diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt index 4076a5e1915..20cea4f136f 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/NamedParameters.txt @@ -404,31 +404,28 @@ still ensuring that the total sum of the coordinates is `1`. Default: `0` \cgalNPEnd -\cgalNPBegin{use_angle_smoothing_t} \anchor PMP_use_angle_smoothing +\cgalNPBegin{use_angle_smoothing} \anchor PMP_use_angle_smoothing Parameter used in the function `smooth_mesh()` to indicate if angle-based smoothing should be used. When this type of smoothing is used, the algorithm attempts to equalize angles incident to each vertex. - \n Type: `bool` \n Default: `true` \cgalNPEnd -\cgalNPBegin{use_area_smoothing_t} \anchor PMP_use_area_smoothing +\cgalNPBegin{use_area_smoothing} \anchor PMP_use_area_smoothing Parameter used in the function `smooth_mesh()` to indicate if area-based smoothing should be used. When this type of smoothing is used, the algorithm attempts to equalize the areas of the triangles incident to each vertex. Since this can create elongated triangles, a second phase uses Delaunay-based flips to recover good shapes, unless specified otherwise (see below). - \n Type: `bool` \n Default: `true` \cgalNPEnd -\cgalNPBegin{use_Delaunay_flips_t} \anchor PMP_use_Delaunay_flips +\cgalNPBegin{use_Delaunay_flips} \anchor PMP_use_Delaunay_flips Parameter used in the function `smooth_mesh()` to indicate if Delaunay-based flips should be used after area-based smoothing has been performed. A user wishing to preserve combinatorial information can set this parameter to `false`, but the mesh might have elongated elements. - \n Type: `bool` \n Default: `true` @@ -439,7 +436,6 @@ Parameter used in the function `smooth_mesh()` to indicate if some sanity checks if the move of a vertex should be applied or rejected. These sanity checks consists of checking that no face incident to the vertex becomes inverted and that the minimum angle of the incident faces is not decreased by the move. - \n Type: `bool` \n Default: `true` @@ -449,7 +445,6 @@ is not decreased by the move. Parameter used in the functions `keep_large_connected_components()` and `keep_largest_connected_components()` to pass a property map that gives the size of a face when evaluating the size of a connected component (which is defined as the sum of the sizes of its faces). - \n Type: a class model of `ReadablePropertyMap` with `boost::graph_traits::%face_descriptor` as key type and @@ -457,6 +452,33 @@ a value type supporting construction from `0`, `operator+=()`, and comparison op Default: `CGAL::Constant_property_map` with value `1` \cgalNPEnd +\cgalNPBegin{area_threshold} \anchor PMP_area_threshold +Parameter used in the function `remove_connected_components_of_negligible_size()` +to pass a threshold value such that all connected components with an area smaller +than this value are removed from the mesh. +\n +Type: `Kernel::FT` \n +Default: The square of one percent of the length of the diagonal of the bounding box of the mesh. +\cgalNPEnd + +\cgalNPBegin{volume_threshold} \anchor PMP_volume_threshold +Parameter used in the function `remove_connected_components_of_negligible_size()` +to pass a threshold value such that all (closed) connected components with a volume smaller +than this value are removed from the mesh. +\n +Type: `Kernel::FT` \n +Default: The third power of one percent of the length of the diagonal of the bounding box of the mesh. +\cgalNPEnd + + +\cgalNPBegin{dry_run} \anchor PMP_dry_run +Parameter that tells a function not to alter the input, but rather to only return the expected result. +It is for example used in the fucntion `keep_large_connected_components()`. +\n +Type: `bool` \n +Default: `false` +\cgalNPEnd + \cgalNPTableEnd */ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index eb78d77b85c..5ee40672191 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -155,6 +155,7 @@ and provides a list of the parameters that are used in this package. - `CGAL::Polygon_mesh_processing::duplicate_non_manifold_vertices()` - `CGAL::Polygon_mesh_processing::merge_duplicated_vertices_in_boundary_cycle()` - `CGAL::Polygon_mesh_processing::merge_duplicated_vertices_in_boundary_cycles()` +- `CGAL::Polygon_mesh_processing::remove_connected_components_of_negligible_size()` \cgalCRPSection{Normal Computation Functions} - `CGAL::Polygon_mesh_processing::compute_face_normal()` diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/compute_normals_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/compute_normals_example.cpp index ac4e2c3b4a3..cd7ba66f2e4 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/compute_normals_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/compute_normals_example.cpp @@ -6,13 +6,16 @@ #include #include -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; -typedef K::Point_3 Point; -typedef K::Vector_3 Vector; +namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Surface_mesh Surface_mesh; -typedef boost::graph_traits::vertex_descriptor vertex_descriptor; -typedef boost::graph_traits::face_descriptor face_descriptor; +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; + +typedef K::Point_3 Point; +typedef K::Vector_3 Vector; + +typedef CGAL::Surface_mesh Surface_mesh; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef boost::graph_traits::face_descriptor face_descriptor; int main(int argc, char* argv[]) { @@ -25,24 +28,18 @@ int main(int argc, char* argv[]) return 1; } - auto fnormals = mesh.add_property_map - ("f:normals", CGAL::NULL_VECTOR).first; - auto vnormals = mesh.add_property_map - ("v:normals", CGAL::NULL_VECTOR).first; + auto vnormals = mesh.add_property_map("v:normals", CGAL::NULL_VECTOR).first; + auto fnormals = mesh.add_property_map("f:normals", CGAL::NULL_VECTOR).first; - CGAL::Polygon_mesh_processing::compute_normals(mesh, - vnormals, - fnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points()). - geom_traits(K())); + PMP::compute_normals(mesh, vnormals, fnormals); + + std::cout << "Vertex normals :" << std::endl; + for(vertex_descriptor vd: vertices(mesh)) + std::cout << vnormals[vd] << std::endl; std::cout << "Face normals :" << std::endl; - for(face_descriptor fd: faces(mesh)){ + for(face_descriptor fd: faces(mesh)) std::cout << fnormals[fd] << std::endl; - } - std::cout << "Vertex normals :" << std::endl; - for(vertex_descriptor vd: vertices(mesh)){ - std::cout << vnormals[vd] << std::endl; - } + return 0; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h index 10e022ad608..e3696de26ff 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h @@ -1,4 +1,4 @@ -// Copyright (c) 2015 GeometryFactory (France). +// Copyright (c) 2015-2019 GeometryFactory (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -9,88 +9,101 @@ // // // Author(s) : Jane Tournois - +// Mael Rouxel-Labbé #ifndef CGAL_POLYGON_MESH_PROCESSING_COMPUTE_NORMAL_H #define CGAL_POLYGON_MESH_PROCESSING_COMPUTE_NORMAL_H #include - -#include -#include -#include -#include -#include -#include - #include #include -#include +#include +#include +#include +#include -namespace CGAL{ +#include -namespace Polygon_mesh_processing{ +#include +#include +#include +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP +# ifndef CGAL_PMP_COMPUTE_NORMAL_DEBUG +# define CGAL_PMP_COMPUTE_NORMAL_DEBUG +# endif +#endif + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG +#include +#include +#endif + +namespace CGAL { +namespace Polygon_mesh_processing { namespace internal { - template - void normalize(typename GT::Vector_3& v, const GT& traits) - { - typename GT::FT norm = CGAL::approximate_sqrt( - traits.compute_squared_length_3_object()(v)); - //If the vector is small enough, approx_sqrt might return 0, and then we get nan values. - //To avoid that, we check the resulted norm. If it is 0, we don't normalize. - if(norm != 0) - { - v = traits.construct_divided_vector_3_object()(v, norm ); - } - } +template +void normalize(typename GT::Vector_3& v, const GT& traits) +{ + typedef typename GT::FT FT; - template - typename GT::Vector_3 - triangle_normal(const Point& p0, const Point& p1, const Point& p2 - , const GT& traits) + //If the vector is small enough, approx_sqrt might return 0, and then we get nan values. + //To avoid that, we check the resulted norm. If it is 0, we don't normalize. + const FT norm = CGAL::approximate_sqrt(traits.compute_squared_length_3_object()(v)); + if(norm != FT(0)) { - typename GT::Vector_3 n = traits.construct_cross_product_vector_3_object()( - traits.construct_vector_3_object()(p1, p2), - traits.construct_vector_3_object()(p1, p0)); - - //cross-product(AB, AC)'s norm is the area of the parallelogram - //formed by these 2 vectors. - //the triangle's area is half of it - return traits.construct_scaled_vector_3_object()(n, 0.5); + v = traits.construct_divided_vector_3_object()(v, norm); } } -template +template +typename GT::Vector_3 +triangle_normal(const Point& p0, const Point& p1, const Point& p2, const GT& traits) +{ + typedef typename GT::FT FT; + + typename GT::Vector_3 n = traits.construct_cross_product_vector_3_object()( + traits.construct_vector_3_object()(p1, p2), + traits.construct_vector_3_object()(p1, p0)); + + //cross-product(AB, AC)'s norm is the area of the parallelogram + //formed by these 2 vectors. + //the triangle's area is half of it + return traits.construct_scaled_vector_3_object()(n, FT(1)/FT(2)); +} + +template void sum_normals(const PM& pmesh, typename boost::graph_traits::face_descriptor f, VertexPointMap vpmap, Vector& sum, const GT& traits) { - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typedef typename boost::property_traits::reference Point_ref; halfedge_descriptor he = halfedge(f, pmesh); vertex_descriptor v = source(he, pmesh); - const Point& pv = get(vpmap, v); - while (v != target(next(he, pmesh), pmesh)) - { - const Point& pvn = get(vpmap, target(he, pmesh)); - const Point& pvnn = get(vpmap, target(next(he, pmesh), pmesh)); + const Point_ref pv = get(vpmap, v); - Vector n = internal::triangle_normal(pv, pvn, pvnn, traits); + while(v != target(next(he, pmesh), pmesh)) + { + const Point_ref pvn = get(vpmap, target(he, pmesh)); + const Point_ref pvnn = get(vpmap, target(next(he, pmesh), pmesh)); + + const Vector n = internal::triangle_normal(pv, pvn, pvnn, traits); sum = traits.construct_sum_of_vectors_3_object()(sum, n); he = next(he, pmesh); } } +} // namespace internal /** * \ingroup PMP_normal_grp @@ -124,42 +137,50 @@ Vector_3 #else typename GetGeomTraits::type::Vector_3 #endif -compute_face_normal(typename boost::graph_traits::face_descriptor f - , const PolygonMesh& pmesh - , const NamedParameters& np) +compute_face_normal(typename boost::graph_traits::face_descriptor f, + const PolygonMesh& pmesh, + const NamedParameters& np) { using parameters::choose_parameter; using parameters::get_parameter; - typedef typename GetGeomTraits::type GT; + typedef typename GetGeomTraits::type GT; GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits), GT()); - typedef typename GetVertexPointMap::const_type VPMap; + typedef typename GetVertexPointMap::const_type VPMap; VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, pmesh)); - typedef typename GT::Point_3 Point; - typedef typename GT::Vector_3 Vector; + typedef typename GT::Point_3 Point; + typedef typename GT::Vector_3 Vector_3; - Vector normal = traits.construct_vector_3_object()(CGAL::NULL_VECTOR); - sum_normals(pmesh, f, vpmap, normal, traits); + Vector_3 normal = traits.construct_vector_3_object()(CGAL::NULL_VECTOR); + internal::sum_normals(pmesh, f, vpmap, normal, traits); - if (!traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) + if(!traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) internal::normalize(normal, traits); return normal; } +template +typename GetGeomTraits::type::Vector_3 +compute_face_normal(typename boost::graph_traits::face_descriptor f, + const PolygonMesh& pmesh) +{ + return compute_face_normal(f, pmesh, CGAL::parameters::all_default()); +} + /** * \ingroup PMP_normal_grp * computes the outward unit vector normal for all faces of the polygon mesh. * @tparam PolygonMesh a model of `FaceGraph` -* @tparam FaceNormalMap a model of `WritablePropertyMap` with +* @tparam Face_normal_map a model of `WritablePropertyMap` with `boost::graph_traits::%face_descriptor` as key type and `Kernel::Vector_3` as value type. * * @param pmesh the polygon mesh -* @param fnm the property map in which the normals are written +* @param face_normals the property map in which the normals are written * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -173,22 +194,366 @@ compute_face_normal(typename boost::graph_traits::face_descriptor f * If `Kernel::FT` does not have a `sqrt()` operation, the square root computation * will be done approximately. */ -template -void -compute_face_normals(const PolygonMesh& pmesh - , FaceNormalMap fnm - , const NamedParameters& np) +template +void compute_face_normals(const PolygonMesh& pmesh, + Face_normal_map face_normals, + const NamedParameters& np) { typedef typename GetGeomTraits::type Kernel; - for(typename boost::graph_traits::face_descriptor f : faces(pmesh)){ + for(typename boost::graph_traits::face_descriptor f : faces(pmesh)) + { typename Kernel::Vector_3 vec = compute_face_normal(f, pmesh, np); - put(fnm, f, vec); + put(face_normals, f, vec); +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG + std::cout << "normal at face " << f << " is " << get(face_normals, f) << std::endl; +#endif } } +template +void compute_face_normals(const PolygonMesh& pmesh, Face_normal_map face_normals) +{ + compute_face_normals(pmesh, face_normals, CGAL::parameters::all_default()); +} + +namespace internal { + +enum Vertex_normal_type { + NO_WEIGHT = 0, + SIN_WEIGHT, + MOST_VISIBLE +}; + +template +bool almost_equal(const typename GT::Vector_3& v1, const typename GT::Vector_3& v2, + const GT& traits) +{ + typedef typename GT::FT FT; + + // We are doing a lot of likely inexact constructions to compute min circles on the sphere and + // these degenerate cases often happen (e.g. almost flat surfaces), so we don't want to to the usual + // "switch to the exact kernel" in degenerate cases robustness trick. Rather, use a fixed tolerance + // to assimilate vectors and scalar products. + // + // Tolerance is (arbitrarily) chosen as theta := 0.01°, thus we want sp(v1,v2) >= cos(theta) + const FT cos_theta = 0.99999998476912910; + return traits.compute_scalar_product_3_object()(v1, v2) >= cos_theta; +} + +template +bool does_enclose_other_normals(const std::size_t i, const std::size_t j, const std::size_t k, + const typename K::Vector_3& nb, + const typename K::FT sp_bi, + const std::vector::face_descriptor>& incident_faces, + const FaceNormalVector& face_normals, + const K& traits) +{ + typedef typename K::FT FT; + typedef typename boost::property_traits::reference Vector_ref; + + typename K::Compute_scalar_product_3 sp = traits.compute_scalar_product_3_object(); + + const FT nbn = CGAL::approximate_sqrt(traits.compute_squared_length_3_object()(nb)); + + // check that this min circle defined by the diameter contains the other points + const std::size_t nif = incident_faces.size(); + for(std::size_t l=0; l +typename GT::Vector_3 compute_normals_bisector(const typename GT::Vector_3& ni, + const typename GT::Vector_3& nj, + const GT& traits) +{ + if(traits.equal_3_object()(ni, nj)) + return ni; + + return traits.construct_sum_of_vectors_3_object()(ni, nj); // not normalized +} + +template +typename GT::Vector_3 compute_normals_bisector(const typename GT::Vector_3& ni, + const typename GT::Vector_3& nj, + const typename GT::Vector_3& nk, + const GT& traits) +{ + typedef typename GT::FT FT; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + + typename GT::Construct_scaled_vector_3 cslv_3 = traits.construct_scaled_vector_3_object(); + typename GT::Construct_sum_of_vectors_3 csv_3 = traits.construct_sum_of_vectors_3_object(); + typename GT::Construct_vector_3 cv_3 = traits.construct_vector_3_object(); + + Vector_3 nb = cv_3(CGAL::NULL_VECTOR); + + if(almost_equal(ni, nj, traits)) + { + if(almost_equal(nj, nk, traits)) + nb = ni; + else // ni == nj, but nij != nk + nb = compute_normals_bisector(nj, nk, traits); + } + else if(almost_equal(ni, nk, traits)) // ni != nj + { + nb = compute_normals_bisector(nj, nk, traits); + } + else if(almost_equal(nj, nk, traits)) // ni != nj, ni != nk + { + nb = compute_normals_bisector(ni, nk, traits); + } + else + { + CGAL_assertion(ni != nj); + CGAL_assertion(ni != nk); + CGAL_assertion(nj != nk); + CGAL_assertion(!traits.collinear_3_object()(CGAL::ORIGIN + ni, CGAL::ORIGIN + nj, CGAL::ORIGIN + nk)); + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << "Triplet: ni[" << ni << "] nj[" << nj << "] nk[" << nk << "]" << std::endl; +#endif + + const Point_3 c = traits.construct_circumcenter_3_object()(CGAL::ORIGIN + ni, CGAL::ORIGIN + nj, CGAL::ORIGIN + nk); + if(c == CGAL::ORIGIN) + { + // will happen if the three vectors live in the same plan, return some weighted sum + const FT third = FT(1)/FT(3); + return csv_3(csv_3(cslv_3(ni, third), cslv_3(nj, third)), cslv_3(nk, third)); + } + + nb = cv_3(CGAL::ORIGIN, c); // note that this isn't normalized + } + + return nb; +} + +template +typename GT::Vector_3 +compute_most_visible_normal_2_points(std::vector::face_descriptor>& incident_faces, + const FaceNormalVector& face_normals, + const GT& traits) +{ + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; + typedef typename boost::property_traits::reference Vector_ref; + + typename GT::Compute_scalar_product_3 sp_3 = traits.compute_scalar_product_3_object(); + typename GT::Construct_vector_3 cv_3 = traits.construct_vector_3_object(); + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << "Trying to find enclosing normal with 2 normals" << std::endl; +#endif + + FT min_sp = -1; + Vector_3 n = cv_3(CGAL::NULL_VECTOR); + + const std::size_t nif = incident_faces.size(); + for(std::size_t i=0; i= 0); + if(sp_bi <= min_sp) + continue; + + if(!does_enclose_other_normals(i, j, -1 /*NA*/, nb, sp_bi, incident_faces, face_normals, traits)) + continue; + + min_sp = sp_bi; + n = nb; + } + } + + return n; +} + +template +typename GT::Vector_3 +compute_most_visible_normal_3_points(const std::vector::face_descriptor>& incident_faces, + const FaceNormalVector& face_normals, + const GT& traits) +{ + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; + typedef typename boost::property_traits::reference Vector_ref; + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << "Trying to find enclosing normal with 3 normals" << std::endl; +#endif + + FT min_sp = -1; + + Vector_3 n = traits.construct_vector_3_object()(CGAL::NULL_VECTOR); + + const std::size_t nif = incident_faces.size(); + for(std::size_t i=0; i(i, j, k, nb, sp_bi, incident_faces, face_normals, traits)) + continue; + + min_sp = sp_bi; + n = nb; + } + } + } + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << "Best normal from 3-normals-approach: " << n << std::endl; +#endif + + return n; +} + +// Inspired by Aubry et al. On the most 'normal' normal +template +typename GT::Vector_3 +compute_vertex_normal_most_visible_min_circle(typename boost::graph_traits::vertex_descriptor v, + const FaceNormalVector& face_normals, + const PolygonMesh& pmesh, + const GT& traits) +{ + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + typedef typename GT::Vector_3 Vector_3; + + std::vector incident_faces; + for(face_descriptor f : CGAL::faces_around_target(halfedge(v, pmesh), pmesh)) + { + if(f == boost::graph_traits::null_face()) + continue; + + incident_faces.push_back(f); + } + + if(incident_faces.size() == 1) + return get(face_normals, incident_faces.front()); + + Vector_3 res = compute_most_visible_normal_2_points(incident_faces, face_normals, traits); + + if(res != CGAL::NULL_VECTOR) // found a valid normal through 2 point min circle + return res; + + CGAL_assertion(incident_faces.size() > 2); + + return compute_most_visible_normal_3_points(incident_faces, face_normals, traits); +} + +template +typename GT::Vector_3 +compute_vertex_normal_as_sum_of_weighted_normals(typename boost::graph_traits::vertex_descriptor v, + const Vertex_normal_type& vn_type, + const FaceNormalVector& face_normals, + const VertexPointMap& vpmap, + const PolygonMesh& pmesh, + const GT& traits) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; + typedef typename boost::property_traits::reference Vector_ref; + + typename GT::Construct_vector_3 cv_3 = traits.construct_vector_3_object(); + typename GT::Compute_squared_length_3 csl_3 = traits.compute_squared_length_3_object(); + + Vector_3 normal = cv_3(CGAL::NULL_VECTOR); + + halfedge_descriptor h = halfedge(v, pmesh); + if(h == boost::graph_traits::null_halfedge()) + return normal; + + halfedge_descriptor end = h; + do + { + if(!is_border(h, pmesh)) + { + if(vn_type == NO_WEIGHT) + { + const Vector_ref n = get(face_normals, face(h, pmesh)); + normal = traits.construct_sum_of_vectors_3_object()(normal, n); + } + else if(vn_type == SIN_WEIGHT) + { + const Vector_3 v1 = cv_3(get(vpmap, v), get(vpmap, source(h, pmesh))); + const Vector_3 v2 = cv_3(get(vpmap, v), get(vpmap, target(next(h, pmesh), pmesh))); + + //v(i) and v(i+1) must me seen in ccw order, from v, so we reverse v1 and v2 + Vector_3 n = traits.construct_cross_product_vector_3_object()(v2, v1); + n = traits.construct_scaled_vector_3_object()(n, CGAL::approximate_sqrt(FT(1)/(csl_3(v1) * csl_3(v2)))); + + normal = traits.construct_sum_of_vectors_3_object()(normal, n); + } + else + { + std::cerr << "Error: unknown vertex normal type" << std::endl; + CGAL_assertion(false); + return CGAL::NULL_VECTOR; + } + } + + h = opposite(next(h, pmesh), pmesh); + } + while(h != end); + + return normal; +} + +} // end namespace internal + /** * \ingroup PMP_normal_grp * computes the unit normal at vertex `v` as the average of the normals of incident faces. @@ -222,61 +587,101 @@ typename GetGeomTraits::type::Vector_3 #endif compute_vertex_normal(typename boost::graph_traits::vertex_descriptor v, const PolygonMesh& pmesh, - const NamedParameters& np - ) + const NamedParameters& np) { using parameters::choose_parameter; + using parameters::is_default_parameter; using parameters::get_parameter; - typedef typename GetGeomTraits::type GT; - typedef typename GT::Vector_3 Vector; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + typedef typename GetGeomTraits::type GT; + typedef typename GT::Vector_3 Vector_3; GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits), GT()); - typedef typename GetFaceNormalMap::NoMap DefaultMap; - typedef typename internal_np::Lookup_named_param_def < - internal_np::face_normal_t, - NamedParameters, - DefaultMap> ::type FaceNormalMap; - FaceNormalMap fnmap = choose_parameter(get_parameter(np, internal_np::face_normal), DefaultMap()); - bool fnmap_valid - = !boost::is_same::value; + typedef typename GetVertexPointMap::const_type VPMap; + VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_const_property_map(vertex_point, pmesh)); - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef std::map Face_vector_map; + typedef boost::associative_property_map Default_map; - Vector normal = traits.construct_vector_3_object()(CGAL::NULL_VECTOR); + typedef typename internal_np::Lookup_named_param_def::type Face_normal_map; + Face_vector_map default_fvmap; + Face_normal_map face_normals = choose_parameter(get_parameter(np, internal_np::face_normal), + Default_map(default_fvmap)); + const bool must_compute_face_normals = is_default_parameter(get_parameter(np, internal_np::face_normal)); + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << std::endl << std::endl; + std::cout << "----------------------------------------------------------------------" << std::endl; + std::cout << "compute vertex at " << get(vpmap, v) + << ", must compute face normals? " << must_compute_face_normals << std::endl; +#endif - halfedge_descriptor he = halfedge(v, pmesh); // handle isolated vertices - if (he==boost::graph_traits::null_halfedge()) return normal; - halfedge_descriptor end = he; - do - { - if (!is_border(he, pmesh)) - { - Vector n = fnmap_valid ? get(fnmap, face(he, pmesh)) - : compute_face_normal(face(he, pmesh), pmesh, np); - normal = traits.construct_sum_of_vectors_3_object()(normal, n); - } - he = opposite(next(he, pmesh), pmesh); - } while (he != end); + halfedge_descriptor he = halfedge(v, pmesh); + if(he == boost::graph_traits::null_halfedge()) + return CGAL::NULL_VECTOR; - if ( ! traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) + if(must_compute_face_normals) + { + for(face_descriptor f : CGAL::faces_around_target(halfedge(v, pmesh), pmesh)) + { + if(f == boost::graph_traits::null_face()) + continue; + + put(face_normals, f, compute_face_normal(f, pmesh, np)); + } + } + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG + std::cout << "Incident face normals:" << std::endl; + for(halfedge_descriptor h : CGAL::halfedges_around_target(v, pmesh)) + { + if(!is_border(h, pmesh)) + std::cout << "get normal at f " << face(h, pmesh) << " : " << get(face_normals, face(h, pmesh)) << std::endl; + } +#endif + + Vector_3 normal = internal::compute_vertex_normal_most_visible_min_circle(v, face_normals, pmesh, traits); + if(traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) // can't always find a most visible normal + { +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << "Failed to find most visible normal, use weighted sum of normals" << std::endl; +#endif + normal = internal::compute_vertex_normal_as_sum_of_weighted_normals( + v, internal::SIN_WEIGHT, face_normals, vpmap, pmesh, traits); + } + + if(!traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) internal::normalize(normal, traits); + return normal; } +template +typename GetGeomTraits::type::Vector_3 +compute_vertex_normal(typename boost::graph_traits::vertex_descriptor v, + const PolygonMesh& pmesh) +{ + return compute_vertex_normal(v, pmesh, CGAL::parameters::all_default()); +} + /** * \ingroup PMP_normal_grp * computes the outward unit vector normal for all vertices of the polygon mesh. +* * @tparam PolygonMesh a model of `FaceListGraph` * @tparam VertexNormalMap a model of `WritablePropertyMap` with - `boost::graph_traits::%vertex_descriptor` as key type and - the return type of `compute_vertex_normal()` as value type. +* `boost::graph_traits::%vertex_descriptor` as key type and +* the return type of `compute_vertex_normal()` as value type. * * @param pmesh the polygon mesh -* @param vnm the property map in which the normals are written +* @param vertex_normals the property map in which the normals are written * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -290,38 +695,82 @@ compute_vertex_normal(typename boost::graph_traits::vertex_descript * If `Kernel::FT` does not have a `sqrt()` operation, the square root computation * will be done approximately. */ -template -void -compute_vertex_normals(const PolygonMesh& pmesh - , VertexNormalMap vnm - , const NamedParameters& np - ) +template +void compute_vertex_normals(const PolygonMesh& pmesh, + VertexNormalMap vertex_normals, + const NamedParameters& np) { - typedef typename GetGeomTraits::type Kernel; + using parameters::choose_parameter; + using parameters::is_default_parameter; + using parameters::get_parameter; - for(typename boost::graph_traits::vertex_descriptor v : vertices(pmesh)){ - typename Kernel::Vector_3 vec = compute_vertex_normal(v, pmesh, np); - put(vnm, v, vec); + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + typedef typename GetGeomTraits::type GT; + typedef typename GT::Vector_3 Vector_3; + + typedef CGAL::dynamic_face_property_t Face_normal_tag; + typedef typename boost::property_map::const_type Face_normal_dmap; + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits), GT()); + + typedef typename GetVertexPointMap::const_type VPMap; + VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_const_property_map(vertex_point, pmesh)); +#endif + + typedef typename internal_np::Lookup_named_param_def::type Face_normal_map; + Face_normal_map face_normals = choose_parameter(get_parameter(np, internal_np::face_normal), + get(Face_normal_tag(), pmesh)); + const bool must_compute_face_normals = is_default_parameter(get_parameter(np, internal_np::face_normal)); + + if(must_compute_face_normals) + compute_face_normals(pmesh, face_normals, np); + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::ofstream out("computed_normals.cgal.polylines.txt"); + const Bbox_3 bb = bbox(pmesh, np); + const typename GT::FT bbox_diagonal = CGAL::sqrt(CGAL::square(bb.xmax() - bb.xmin()) + + CGAL::square(bb.ymax() - bb.ymin()) + + CGAL::square(bb.zmax() - bb.zmin())); +#endif + + for(vertex_descriptor v : vertices(pmesh)) + { + const Vector_3 n = compute_vertex_normal(v, pmesh, np.face_normal_map(face_normals)); + put(vertex_normals, v, n); + +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + out << "2 " << get(vpmap, v) << " " + << get(vpmap, v) + traits.construct_scaled_vector_3_object()(n, 0.1 * bbox_diagonal) << "\n"; +#endif } } +template +void compute_vertex_normals(const PolygonMesh& pmesh, VertexNormalMap vertex_normals) +{ + compute_vertex_normals(pmesh, vertex_normals, CGAL::parameters::all_default()); +} + /** * \ingroup PMP_normal_grp * computes the outward unit vector normal for all vertices and faces of the polygon mesh. +* * @tparam PolygonMesh a model of `FaceListGraph` * @tparam VertexNormalMap a model of `WritablePropertyMap` with - `boost::graph_traits::%vertex_descriptor` as key type and - `Kernel::Vector_3` as value type. +* `boost::graph_traits::%vertex_descriptor` as key type and +* `Kernel::Vector_3` as value type. * @tparam FaceNormalMap a model of `ReadWritePropertyMap` with - `boost::graph_traits::%face_descriptor` as key type and - `Kernel::Vector_3` as value type. +* `boost::graph_traits::%face_descriptor` as key type and +* `Kernel::Vector_3` as value type. * * @param pmesh the polygon mesh -* @param vnm the property map in which the vertex normals are written -* @param fnm the property map in which the face normals are written +* @param vertex_normals the property map in which the vertex normals are written +* @param face_normals the property map in which the face normals are written * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -335,79 +784,27 @@ compute_vertex_normals(const PolygonMesh& pmesh * If `Kernel::FT` does not have a `sqrt()` operation, the square root computation * will be done approximately. */ -template -void -compute_normals(const PolygonMesh& pmesh - , VertexNormalMap vnm - , FaceNormalMap fnm - , const NamedParameters& np - ) +template +void compute_normals(const PolygonMesh& pmesh, + VertexNormalMap vertex_normals, + FaceNormalMap face_normals, + const NamedParameters& np) { - compute_face_normals(pmesh, fnm, np); - compute_vertex_normals(pmesh, vnm, np.face_normal_map(fnm)); + compute_face_normals(pmesh, face_normals, np); + compute_vertex_normals(pmesh, vertex_normals, np.face_normal_map(face_normals)); } -///\cond SKIP_IN_MANUAL -// compute_vertex_normal overloads -template -typename CGAL::Kernel_traits< typename property_map_value::type>::Kernel::Vector_3 -compute_vertex_normal( - typename boost::graph_traits::vertex_descriptor v, - const PolygonMesh& pmesh) -{ - return compute_vertex_normal(v, pmesh, - CGAL::Polygon_mesh_processing::parameters::all_default()); -} - -// compute_vertex_normals overloads -template -void -compute_vertex_normals(const PolygonMesh& pmesh, - VertexNormalMap vnm) -{ - compute_vertex_normals(pmesh, vnm, - CGAL::Polygon_mesh_processing::parameters::all_default()); -} - -// compute_face_normal overload -template -typename CGAL::Kernel_traits < typename property_map_value::type>::Kernel::Vector_3 -compute_face_normal( - typename boost::graph_traits::face_descriptor f, - const PolygonMesh& pmesh) -{ - return compute_face_normal(f, pmesh, - CGAL::Polygon_mesh_processing::parameters::all_default()); -} - -// compute_face_normals overload -template -void -compute_face_normals(const PolygonMesh& pmesh, FaceNormalMap fnm) -{ - compute_face_normals(pmesh, fnm, - CGAL::Polygon_mesh_processing::parameters::all_default()); -} - -// compute_normals overload template -void -compute_normals(const PolygonMesh& pmesh, - VertexNormalMap vnm, - FaceNormalMap fnm) +void compute_normals(const PolygonMesh& pmesh, + VertexNormalMap vertex_normals, + FaceNormalMap face_normals) { - compute_normals(pmesh, vnm, fnm, - CGAL::Polygon_mesh_processing::parameters::all_default()); + compute_normals(pmesh, vertex_normals, face_normals, CGAL::parameters::all_default()); } -/// \endcond - -} - -} // end of namespace CGAL::Polygon_mesh_processing +} // namespace Polygon_mesh_processing +} // namespace CGAL #endif // CGAL_POLYGON_MESH_PROCESSING_COMPUTE_NORMAL_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h index 5ced2e4916a..aa4d78448e2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h @@ -27,14 +27,14 @@ #include #include +#include #include #include - -#include -#include #include -#include #include +#include +#include +#include #include #include @@ -87,7 +87,7 @@ namespace internal { EdgeConstraintMap ecm; }; -}// namespace internal +} // namespace internal /*! * \ingroup keep_connected_components_grp @@ -238,12 +238,9 @@ typename boost::property_traits::value_type connected_components(const PolygonMesh& pmesh, FaceComponentMap fcm) { - - return CGAL::Polygon_mesh_processing::connected_components(pmesh, fcm, - CGAL::Polygon_mesh_processing::parameters::all_default()); + return CGAL::Polygon_mesh_processing::connected_components(pmesh, fcm, CGAL::parameters::all_default()); } - template +std::size_t number_of_connected_components(const PolygonMesh& pmesh, + const CGAL_PMP_NP_CLASS& np) +{ + typedef CGAL::dynamic_face_property_t Face_property_tag; + typedef typename boost::property_map::const_type Patch_ids_map; + + Patch_ids_map patch_ids_map = get(Face_property_tag(), pmesh); + + return CGAL::Polygon_mesh_processing::connected_components(pmesh, patch_ids_map, np); +} + +template +std::size_t number_of_connected_components(const PolygonMesh& pmesh) +{ + return internal::number_of_connected_components(pmesh, CGAL::parameters::all_default()); +} + +} // end namespace internal + /*! * \ingroup keep_connected_components_grp * @@ -270,7 +311,8 @@ void keep_connected_components(PolygonMesh& pmesh * \tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * \param pmesh the polygon mesh - * \param nb_components_to_keep the number of components to be kept + * \param nb_components_to_keep the number of components to be kept. If this number is larger than + * the number of components in the mesh, all components are kept. * \param np optional \ref pmp_namedparameters "Named Parameters", amongst those described below * * \cgalNamedParamsBegin @@ -282,6 +324,14 @@ void keep_connected_components(PolygonMesh& pmesh * is chosen by the user, but must be constructible from `0` and support `operator+=()` and * comparisons. * \cgalParamEnd + * \cgalParamBegin{dry_run} + * a Boolean parameter. If set to `true`, the mesh will not be altered, but the number + * of components that would be removed is returned. The default value is `false`. + * \cgalParamEnd + * \cgalParamBegin{output_iterator} a model of `OutputIterator` with value type `face_descriptor`. + * When using the "dry run" mode (see parameter `dry_run`), faces that would be removed by the + * algorithm can be collected with this output iterator. + * \cgalParamEnd * \cgalNamedParamsEnd * * \return the number of connected components removed (ignoring isolated vertices). @@ -313,6 +363,13 @@ std::size_t keep_largest_connected_components(PolygonMesh& pmesh, FaceSizeMap face_size_pmap = choose_parameter(get_parameter(np, internal_np::face_size_map), Constant_property_map(1)); + const bool dry_run = choose_parameter(get_parameter(np, internal_np::dry_run), false); + + typedef typename internal_np::Lookup_named_param_def::type Output_iterator; + Output_iterator out = choose_parameter(get_parameter(np, internal_np::output_iterator), Emptyset_iterator()); + // vector_property_map boost::vector_property_map face_cc(fimap); std::size_t num = connected_components(pmesh, face_cc, np); @@ -320,12 +377,13 @@ std::size_t keep_largest_connected_components(PolygonMesh& pmesh, // Even if we do not want to keep anything we need to first // calculate the number of existing connected_components to get the // correct return value. - if(nb_components_to_keep == 0) { + if(nb_components_to_keep == 0) + { CGAL::clear(pmesh); return num; } - if((num == 1)|| (nb_components_to_keep > num) ) + if(nb_components_to_keep >= num) return 0; std::vector > component_size(num); @@ -338,11 +396,25 @@ std::size_t keep_largest_connected_components(PolygonMesh& pmesh, // we sort the range [0, num) by component size std::sort(component_size.begin(), component_size.end(), internal::MoreSecond()); - std::vector cc_to_keep; - for(std::size_t i=0; i is_to_be_removed(num, false); + for(std::size_t i=0; i cc_to_keep; + for(std::size_t i=0; i::value)); + typedef typename internal_np::Lookup_named_param_def::type Output_iterator; + FaceSizeMap face_size_pmap = choose_parameter(get_parameter(np, internal_np::face_size_map), Constant_property_map(1)); + const bool dry_run = choose_parameter(get_parameter(np, internal_np::dry_run), false); + Output_iterator out = choose_parameter(get_parameter(np, internal_np::output_iterator), Emptyset_iterator()); // vector_property_map boost::vector_property_map face_cc(fim); std::size_t num = connected_components(pmesh, face_cc, np); - std::vector component_size(num); - - for(std::size_t i=0; i component_size(num, 0); for(face_descriptor f : faces(pmesh)) component_size[face_cc[f]] += get(face_size_pmap, f); const Face_size thresh = threshold_value; + std::vector is_to_be_kept(num, false); + std::size_t res = 0; - std::vector cc_to_keep; for(std::size_t i=0; i= thresh) - cc_to_keep.push_back(i); + { + is_to_be_kept[i] = true; + ++res; + } } - keep_connected_components(pmesh, cc_to_keep, face_cc, np); + if(dry_run) + { + for(face_descriptor f : faces(pmesh)) + if(!is_to_be_kept[face_cc[f]]) + *out++ = f; + } + else + { + std::vector ccs_to_keep; + for(std::size_t i=0; i std::size_t keep_large_connected_components(PolygonMesh& pmesh, std::size_t threshold_components_to_keep) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h index 37581df874c..23fbdb118b3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h @@ -326,7 +326,8 @@ face_area(typename boost::graph_traits::face_descriptor f, halfedge_descriptor hd = halfedge(f, tmesh); halfedge_descriptor nhd = next(hd, tmesh); - typename GetGeomTraits::type traits; + typedef typename GetGeomTraits::type GT; + GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits), GT()); return approximate_sqrt(traits.compute_squared_area_3_object()(get(vpm, source(hd, tmesh)), get(vpm, target(hd, tmesh)), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h index bf8a72a4f80..536f59db782 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h @@ -29,8 +29,10 @@ #include #include +#include #include #include +#include #include #include @@ -58,8 +60,286 @@ #define CGAL_PMP_NP_CLASS NamedParameters #endif -namespace CGAL{ +namespace CGAL { namespace Polygon_mesh_processing { + +/// \ingroup PMP_repairing_grp +/// removes the isolated vertices from any polygon mesh. +/// A vertex is considered isolated if it is not incident to any simplex +/// of higher dimension. +/// +/// @tparam PolygonMesh a model of `FaceListGraph` and `MutableFaceGraph` +/// +/// @param pmesh the polygon mesh to be repaired +/// +/// @return number of removed isolated vertices +/// +template +std::size_t remove_isolated_vertices(PolygonMesh& pmesh) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + std::vector to_be_removed; + + for(vertex_descriptor v : vertices(pmesh)) + { + if (CGAL::halfedges_around_target(v, pmesh).first + == CGAL::halfedges_around_target(v, pmesh).second) + to_be_removed.push_back(v); + } + std::size_t nb_removed = to_be_removed.size(); + for(vertex_descriptor v : to_be_removed) + { + remove_vertex(v, pmesh); + } + return nb_removed; +} + +/// \ingroup PMP_repairing_grp +/// +/// removes connected components whose area or volume is under a certain threshold value. +/// +/// Thresholds are provided via \ref pmp_namedparameters "Named Parameters". (see below). +/// If thresholds are not provided by the user, default values are computed as follows: +/// - the area threshold is taken as the square of one percent of the length of the diagonal +/// of the bounding box of the mesh. +/// - the volume threshold is taken as the third power of one percent of the length of the diagonal +/// of the bounding box of the mesh. +/// +/// The area and volume of a connected component will always be positive values (regardless +/// of the orientation of the mesh). +/// +/// As a consequence of the last sentence, the area or volume criteria can be disabled +/// by passing zero (`0`) as threshold value. +/// +/// Property maps for `CGAL::face_index_t` and `CGAL::vertex_index_t` +/// must be either available as internal property maps +/// to `tmesh` or provided as \ref pmp_namedparameters "Named Parameters". +/// +/// \tparam TriangleMesh a model of `FaceListGraph` and `MutableFaceGraph` +/// \tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" +/// +/// \param tmesh the triangulated polygon mesh +/// \param np optional \ref pmp_namedparameters "Named Parameters", amongst those described below +/// +/// \cgalNamedParamsBegin +/// \cgalParamBegin{area_threshold} a fixed value such that only connected components whose area is +/// larger than this value are kept \cgalParamEnd +/// \cgalParamBegin{volume_threshold} a fixed value such that only connected components whose volume is +/// larger than this value are kept (only applies to closed connected components) \cgalParamEnd +/// \cgalParamBegin{edge_is_constrained_map} a property map containing the constrained-or-not status of each edge of `pmesh` \cgalParamEnd +/// \cgalParamBegin{face_index_map} a property map containing the index of each face of `tmesh` \cgalParamEnd +/// \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `tmesh`. +/// If this parameter is omitted, an internal property map for +/// `CGAL::vertex_point_t` should be available in `TriangleMesh` \cgalParamEnd +/// \cgalParamBegin{geom_traits} an instance of a geometric traits class, model of `Kernel` \cgalParamEnd +/// \cgalParamBegin{dry_run} a Boolean parameter. If set to `true`, the mesh will not be altered, +/// but the number of components that would be removed is returned. The default value is `false`.\cgalParamEnd +/// \cgalParamBegin{output_iterator} a model of `OutputIterator` with value type `face_descriptor`. +/// When using the "dry run" mode (see parameter `dry_run`), faces +/// that would be removed by the algorithm can be collected with this output iterator. \cgalParamEnd +/// \cgalNamedParamsEnd +/// +/// \return the number of connected components removed (ignoring isolated vertices). +/// +template +std::size_t remove_connected_components_of_negligible_size(TriangleMesh& tmesh, + const NamedParameters& np) +{ + using parameters::choose_parameter; + using parameters::is_default_parameter; + using parameters::get_parameter; + + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + const GT traits = choose_parameter(get_parameter(np, internal_np::vertex_point), GT()); + + typedef typename GetVertexPointMap::const_type VPM; + typedef typename boost::property_traits::value_type Point_3; + const VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_const_property_map(CGAL::vertex_point, tmesh)); + + typedef typename GetFaceIndexMap::type FaceIndexMap; + FaceIndexMap fim = choose_parameter(get_parameter(np, internal_np::face_index), + get_property_map(boost::face_index, tmesh)); + + FT area_threshold = choose_parameter(get_parameter(np, internal_np::area_threshold), FT(-1)); + FT volume_threshold = choose_parameter(get_parameter(np, internal_np::volume_threshold), FT(-1)); + + // If no threshold is provided, compute it as a % of the bbox + const bool is_default_area_threshold = is_default_parameter(get_parameter(np, internal_np::area_threshold)); + const bool is_default_volume_threshold = is_default_parameter(get_parameter(np, internal_np::volume_threshold)); + + const bool dry_run = choose_parameter(get_parameter(np, internal_np::dry_run), false); + + typedef typename internal_np::Lookup_named_param_def::type Output_iterator; + Output_iterator out = choose_parameter(get_parameter(np, internal_np::output_iterator), Emptyset_iterator()); + +#ifdef CGAL_PMP_DEBUG_SMALL_CC_REMOVAL + std::cout << "default threshold? " << is_default_area_threshold << " " << is_default_volume_threshold << std::endl; +#endif + + FT bbox_diagonal = FT(0), threshold_value = FT(0); + + if(is_default_area_threshold || is_default_volume_threshold) + { + if(is_empty(tmesh)) + return 0; + + const Bbox_3 bb = bbox(tmesh, np); + + bbox_diagonal = FT(CGAL::sqrt(CGAL::square(bb.xmax() - bb.xmin()) + + CGAL::square(bb.ymax() - bb.ymin()) + + CGAL::square(bb.zmax() - bb.zmin()))); + threshold_value = bbox_diagonal / FT(100); // default filter is 1% + +#ifdef CGAL_PMP_DEBUG_SMALL_CC_REMOVAL + std::cout << "bb xmin xmax: " << bb.xmin() << " " << bb.xmax() << std::endl; + std::cout << "bb ymin ymax: " << bb.ymin() << " " << bb.ymax() << std::endl; + std::cout << "bb zmin zmax: " << bb.zmin() << " " << bb.zmax() << std::endl; + std::cout << "bbox_diagonal: " << bbox_diagonal << std::endl; + std::cout << "threshold_value: " << threshold_value << std::endl; +#endif + } + + if(is_default_area_threshold) + area_threshold = CGAL::square(threshold_value); + + if(is_default_volume_threshold) + volume_threshold = CGAL::square(threshold_value); + + const bool use_areas = (is_default_area_threshold || area_threshold > 0); + const bool use_volumes = (is_default_volume_threshold || volume_threshold > 0); + + if(!use_areas && !use_volumes) + return 0; + + // Compute the connected components only once + boost::vector_property_map face_cc(fim); + std::size_t num = connected_components(tmesh, face_cc, np); + +#ifdef CGAL_PMP_DEBUG_SMALL_CC_REMOVAL + std::cout << num << " different connected components" << std::endl; +#endif + + if(!dry_run) + CGAL::Polygon_mesh_processing::remove_isolated_vertices(tmesh); + + // Compute CC-wide and total areas/volumes + FT total_area = 0; + std::vector component_areas(num, 0); + + if(use_areas) + { + for(face_descriptor f : faces(tmesh)) + { + const FT fa = face_area(f, tmesh, np); + component_areas[face_cc[f]] += fa; + total_area += fa; + } + +#ifdef CGAL_PMP_DEBUG_SMALL_CC_REMOVAL + std::cout << "area threshold: " << area_threshold << std::endl; + std::cout << "total area: " << total_area << std::endl; +#endif + } + + // Volumes make no sense for CCs that are not closed + std::vector cc_closeness(num, true); + std::vector component_volumes(num); + + if(use_volumes) + { + for(halfedge_descriptor h : halfedges(tmesh)) + { + if(is_border(h, tmesh)) + cc_closeness[face_cc[face(opposite(h, tmesh), tmesh)]] = false; + } + + typename GT::Compute_volume_3 cv3 = traits.compute_volume_3_object(); + Point_3 origin(0, 0, 0); + + for(face_descriptor f : faces(tmesh)) + { + const std::size_t i = face_cc[f]; + if(!cc_closeness[i]) + continue; + + const FT fv = cv3(origin, + get(vpm, target(halfedge(f, tmesh), tmesh)), + get(vpm, target(next(halfedge(f, tmesh), tmesh), tmesh)), + get(vpm, target(prev(halfedge(f, tmesh), tmesh), tmesh))); + + component_volumes[i] += fv; + } + + // negative volume means the CC was oriented inward + FT total_volume = 0; + for(std::size_t i=0; i is_to_be_removed(num, false); + + for(std::size_t i=0; i ccs_to_remove; + for(std::size_t i=0; i +std::size_t remove_connected_components_of_negligible_size(TriangleMesh& tmesh) +{ + return remove_connected_components_of_negligible_size(tmesh, parameters::all_default()); +} + namespace debug{ template @@ -2368,37 +2648,6 @@ std::size_t duplicate_non_manifold_vertices(PolygonMesh& pm) return duplicate_non_manifold_vertices(pm, parameters::all_default()); } -/// \ingroup PMP_repairing_grp -/// removes the isolated vertices from any polygon mesh. -/// A vertex is considered isolated if it is not incident to any simplex -/// of higher dimension. -/// -/// @tparam PolygonMesh a model of `FaceListGraph` and `MutableFaceGraph` -/// -/// @param pmesh the polygon mesh to be repaired -/// -/// @return number of removed isolated vertices -/// -template -std::size_t remove_isolated_vertices(PolygonMesh& pmesh) -{ - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - std::vector to_be_removed; - - for(vertex_descriptor v : vertices(pmesh)) - { - if (CGAL::halfedges_around_target(v, pmesh).first - == CGAL::halfedges_around_target(v, pmesh).second) - to_be_removed.push_back(v); - } - std::size_t nb_removed = to_be_removed.size(); - for(vertex_descriptor v : to_be_removed) - { - remove_vertex(v, pmesh); - } - return nb_removed; -} - /// \cond SKIP_IN_MANUAL template std::pair< bool, bool > diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 02f55be25dd..2bf92f35e85 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.1...3.15) project( Polygon_mesh_processing_Tests ) # CGAL and its components -find_package( CGAL QUIET COMPONENTS ) +find_package( CGAL QUIET COMPONENTS Core) if ( NOT CGAL_FOUND ) @@ -14,6 +14,8 @@ if ( NOT CGAL_FOUND ) endif() +include(${CGAL_USE_FILE}) + # Boost and its components find_package( Boost REQUIRED ) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp index ce954aa9789..4a9fcec8ec7 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp @@ -45,6 +45,19 @@ void mesh_with_id(const char* argv1, const bool save_output) assert(num == 3); std::cerr << "The graph has " << num << " connected components (face connectivity)" << std::endl; + std::size_t nb_faces = num_faces(sm); + std::vector faces_to_remove; // faces that would be removed but are not because we're doing a dry run + std::size_t nb_to_remove = PMP::keep_large_connected_components(sm, 1000, + CGAL::parameters::face_size_map( + CGAL::Constant_property_map(1)) + .dry_run(true) + .output_iterator(std::back_inserter(faces_to_remove))); + assert(!faces_to_remove.empty()); + if (strcmp(argv1, "data/blobby_3cc.off") == 0) + { + assert(nb_to_remove == 1); + assert(num_faces(sm) == nb_faces); + } PMP::keep_largest_connected_components(sm, 2, CGAL::parameters::face_size_map( diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_surface_mesh.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_surface_mesh.cpp index 4092a5c2fb9..c22d400cda4 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_surface_mesh.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_surface_mesh.cpp @@ -161,8 +161,26 @@ void test_CC_with_area_size_map(Mesh sm, typedef boost::graph_traits::face_descriptor face_descriptor; Face_descriptor_area_functor f(sm, k); + std::vector faces_to_remove; // faces that would be removed but are not because we're doing a dry run + std::size_t nv = num_vertices(sm); + std::size_t num = PMP::internal::number_of_connected_components(sm); std::cout << "We keep the " << 2 << " largest components" << std::endl; + std::size_t res = PMP::keep_largest_connected_components(sm, 2, + PMP::parameters::face_size_map(CGAL::internal::boost_::make_function_property_map(f)) + .dry_run(true) + .output_iterator(std::back_inserter(faces_to_remove))); + + // didn't actually remove anything + assert(PMP::internal::number_of_connected_components(sm) == num); + assert(num_vertices(sm) == nv); + + if(num > 2) + { + assert(res == num - 2); + assert(!faces_to_remove.empty()); + } + PMP::keep_largest_connected_components(sm, 2, PMP::parameters::face_size_map( CGAL::internal::boost_::make_function_property_map(f))); @@ -183,6 +201,12 @@ void test_CC_with_area_size_map(Mesh sm, CGAL::parameters::face_size_map( CGAL::internal::boost_::make_function_property_map(f))); assert(vertices(m).size() == 3); + + PMP::keep_largest_connected_components(m, 1); + assert(PMP::internal::number_of_connected_components(m) == 1); + PMP::keep_largest_connected_components(m, 0); + assert(is_empty(m)); + assert(PMP::internal::number_of_connected_components(m) == 0); } } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data/folded_star.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/folded_star.off new file mode 100644 index 00000000000..68c8a887da2 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data/folded_star.off @@ -0,0 +1,15 @@ +OFF +7 6 0 +0.50085999554530469 0.98935974982034269 0.054777016186685679 +0.51086414037695982 0.0074532224578913869 0.0098759303387234813 +0.23667027533904861 -0.19236191791372245 0.078118737677961653 +0.49890739640011506 0.47147692553082188 0.51901846156493603 +0.5 0.5 0 +0.8400145559724278 0.28990007922508693 -0.53104077094013602 +-0.011501240589425327 0.99837637926383715 0.011228717925938695 +3 4 5 0 +3 1 4 3 +3 3 4 6 +3 4 0 6 +3 1 2 4 +3 2 5 4 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/data_degeneracies/small_ccs.off b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_degeneracies/small_ccs.off new file mode 100644 index 00000000000..1762f2e41a0 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/data_degeneracies/small_ccs.off @@ -0,0 +1,371 @@ +OFF +141 228 0 +-1 -1 1 +1 -1 1 +1 -1 -1 +-1 -1 -1 +-1 1 -1 +-1 1 1 +1 1 1 +1 1 -1 +-2 1 0 +-2 0 -1.0000000000000001e-05 +-2.0000100000000001 0 -1.2246467991473532e-21 +-2 0 1.0000000000000001e-05 +-1.9999899999999999 0 0 +-2 0 0 +0.066195740892434629 9.7645929666223047e-06 3.4984150593572543 +6.123233995736766e-17 0 2 +-1 0 3 +-1.8369701987210297e-16 0 4 +1 0 3 +0 0 3 +0 4 0 +0 4.0000001000000003 0 +0 4.0000001999999997 0 +1.0000000000000002e-06 4.0000001000000003 0 +0 4.0000003 0 +1.0000000000000002e-06 4.0000001999999997 0 +0 4.0000004000000002 0 +1.0000000000000002e-06 4.0000003 0 +0 4.0000005000000005 0 +1.0000000000000002e-06 4.0000004000000002 0 +0 4.0000005999999999 0 +1.0000000000000002e-06 4.0000005000000005 0 +0 4.0000007000000002 0 +1.0000000000000002e-06 4.0000005999999999 0 +0 4.0000008000000005 0 +1.0000000000000002e-06 4.0000007000000002 0 +0 4.0000008999999999 0 +1.0000000000000002e-06 4.0000008000000005 0 +0 4.0000010000000001 0 +1.0000000000000002e-06 4.0000008999999999 0 +1.0000000000000002e-06 4.0000010000000001 0 +1.0000000000000002e-06 4 0 +2.0000000000000003e-06 4.0000001000000003 0 +2.0000000000000003e-06 4.0000001999999997 0 +2.0000000000000003e-06 4.0000003 0 +2.0000000000000003e-06 4.0000004000000002 0 +2.0000000000000003e-06 4.0000005000000005 0 +2.0000000000000003e-06 4.0000005999999999 0 +2.0000000000000003e-06 4.0000007000000002 0 +2.0000000000000003e-06 4.0000008000000005 0 +2.0000000000000003e-06 4.0000008999999999 0 +2.0000000000000003e-06 4.0000010000000001 0 +2.0000000000000003e-06 4 0 +3.0000000000000005e-06 4.0000001000000003 0 +3.0000000000000005e-06 4.0000001999999997 0 +3.0000000000000005e-06 4.0000003 0 +3.0000000000000005e-06 4.0000004000000002 0 +3.0000000000000005e-06 4.0000005000000005 0 +3.0000000000000005e-06 4.0000005999999999 0 +3.0000000000000005e-06 4.0000007000000002 0 +3.0000000000000005e-06 4.0000008000000005 0 +3.0000000000000005e-06 4.0000008999999999 0 +3.0000000000000005e-06 4.0000010000000001 0 +3.0000000000000005e-06 4 0 +4.0000000000000007e-06 4.0000001000000003 0 +4.0000000000000007e-06 4.0000001999999997 0 +4.0000000000000007e-06 4.0000003 0 +4.0000000000000007e-06 4.0000004000000002 0 +4.0000000000000007e-06 4.0000005000000005 0 +4.0000000000000007e-06 4.0000005999999999 0 +4.0000000000000007e-06 4.0000007000000002 0 +4.0000000000000007e-06 4.0000008000000005 0 +4.0000000000000007e-06 4.0000008999999999 0 +4.0000000000000007e-06 4.0000010000000001 0 +4.0000000000000007e-06 4 0 +5.0000000000000004e-06 4.0000001000000003 0 +5.0000000000000004e-06 4.0000001999999997 0 +5.0000000000000004e-06 4.0000003 0 +5.0000000000000004e-06 4.0000004000000002 0 +5.0000000000000004e-06 4.0000005000000005 0 +5.0000000000000004e-06 4.0000005999999999 0 +5.0000000000000004e-06 4.0000007000000002 0 +5.0000000000000004e-06 4.0000008000000005 0 +5.0000000000000004e-06 4.0000008999999999 0 +5.0000000000000004e-06 4.0000010000000001 0 +5.0000000000000004e-06 4 0 +6.000000000000001e-06 4.0000001000000003 0 +6.000000000000001e-06 4.0000001999999997 0 +6.000000000000001e-06 4.0000003 0 +6.000000000000001e-06 4.0000004000000002 0 +6.000000000000001e-06 4.0000005000000005 0 +6.000000000000001e-06 4.0000005999999999 0 +6.000000000000001e-06 4.0000007000000002 0 +6.000000000000001e-06 4.0000008000000005 0 +6.000000000000001e-06 4.0000008999999999 0 +6.000000000000001e-06 4.0000010000000001 0 +6.000000000000001e-06 4 0 +7.0000000000000007e-06 4.0000001000000003 0 +7.0000000000000007e-06 4.0000001999999997 0 +7.0000000000000007e-06 4.0000003 0 +7.0000000000000007e-06 4.0000004000000002 0 +7.0000000000000007e-06 4.0000005000000005 0 +7.0000000000000007e-06 4.0000005999999999 0 +7.0000000000000007e-06 4.0000007000000002 0 +7.0000000000000007e-06 4.0000008000000005 0 +7.0000000000000007e-06 4.0000008999999999 0 +7.0000000000000007e-06 4.0000010000000001 0 +7.0000000000000007e-06 4 0 +8.0000000000000013e-06 4.0000001000000003 0 +8.0000000000000013e-06 4.0000001999999997 0 +8.0000000000000013e-06 4.0000003 0 +8.0000000000000013e-06 4.0000004000000002 0 +8.0000000000000013e-06 4.0000005000000005 0 +8.0000000000000013e-06 4.0000005999999999 0 +8.0000000000000013e-06 4.0000007000000002 0 +8.0000000000000013e-06 4.0000008000000005 0 +8.0000000000000013e-06 4.0000008999999999 0 +8.0000000000000013e-06 4.0000010000000001 0 +8.0000000000000013e-06 4 0 +9.0000000000000002e-06 4.0000001000000003 0 +9.0000000000000002e-06 4.0000001999999997 0 +9.0000000000000002e-06 4.0000003 0 +9.0000000000000002e-06 4.0000004000000002 0 +9.0000000000000002e-06 4.0000005000000005 0 +9.0000000000000002e-06 4.0000005999999999 0 +9.0000000000000002e-06 4.0000007000000002 0 +9.0000000000000002e-06 4.0000008000000005 0 +9.0000000000000002e-06 4.0000008999999999 0 +9.0000000000000002e-06 4.0000010000000001 0 +9.0000000000000002e-06 4 0 +1.0000000000000001e-05 4 0 +1.0000000000000001e-05 4.0000001000000003 0 +1.0000000000000001e-05 4.0000001999999997 0 +1.0000000000000001e-05 4.0000003 0 +1.0000000000000001e-05 4.0000004000000002 0 +1.0000000000000001e-05 4.0000005000000005 0 +1.0000000000000001e-05 4.0000005999999999 0 +1.0000000000000001e-05 4.0000007000000002 0 +1.0000000000000001e-05 4.0000008000000005 0 +1.0000000000000001e-05 4.0000008999999999 0 +1.0000000000000001e-05 4.0000010000000001 0 +3 4 5 6 +3 0 3 2 +3 1 2 7 +3 0 1 6 +3 3 0 5 +3 2 3 4 +3 6 7 4 +3 2 1 0 +3 7 6 1 +3 6 5 0 +3 5 4 3 +3 4 7 2 +3 9 8 12 +3 10 8 9 +3 11 8 10 +3 12 8 11 +3 12 13 9 +3 9 13 10 +3 10 13 11 +3 11 13 12 +3 15 14 18 +3 16 14 15 +3 17 14 16 +3 18 14 17 +3 18 19 15 +3 15 19 16 +3 16 19 17 +3 17 19 18 +3 21 20 41 +3 21 41 23 +3 22 21 23 +3 22 23 25 +3 24 22 25 +3 24 25 27 +3 26 24 27 +3 26 27 29 +3 28 26 29 +3 28 29 31 +3 30 28 31 +3 30 31 33 +3 32 30 33 +3 32 33 35 +3 34 32 35 +3 34 35 37 +3 36 34 37 +3 36 37 39 +3 38 36 39 +3 38 39 40 +3 23 41 52 +3 23 52 42 +3 25 23 42 +3 25 42 43 +3 27 25 43 +3 27 43 44 +3 29 27 44 +3 29 44 45 +3 31 29 45 +3 31 45 46 +3 33 31 46 +3 33 46 47 +3 35 33 47 +3 35 47 48 +3 37 35 48 +3 37 48 49 +3 39 37 49 +3 39 49 50 +3 40 39 50 +3 40 50 51 +3 42 52 63 +3 42 63 53 +3 43 42 53 +3 43 53 54 +3 44 43 54 +3 44 54 55 +3 45 44 55 +3 45 55 56 +3 46 45 56 +3 46 56 57 +3 47 46 57 +3 47 57 58 +3 48 47 58 +3 48 58 59 +3 49 48 59 +3 49 59 60 +3 50 49 60 +3 50 60 61 +3 51 50 61 +3 51 61 62 +3 53 63 74 +3 53 74 64 +3 54 53 64 +3 54 64 65 +3 55 54 65 +3 55 65 66 +3 56 55 66 +3 56 66 67 +3 57 56 67 +3 57 67 68 +3 58 57 68 +3 58 68 69 +3 59 58 69 +3 59 69 70 +3 60 59 70 +3 60 70 71 +3 61 60 71 +3 61 71 72 +3 62 61 72 +3 62 72 73 +3 64 74 85 +3 64 85 75 +3 65 64 75 +3 65 75 76 +3 66 65 76 +3 66 76 77 +3 67 66 77 +3 67 77 78 +3 68 67 78 +3 68 78 79 +3 69 68 79 +3 69 79 80 +3 70 69 80 +3 70 80 81 +3 71 70 81 +3 71 81 82 +3 72 71 82 +3 72 82 83 +3 73 72 83 +3 73 83 84 +3 75 85 96 +3 75 96 86 +3 76 75 86 +3 76 86 87 +3 77 76 87 +3 77 87 88 +3 78 77 88 +3 78 88 89 +3 79 78 89 +3 79 89 90 +3 80 79 90 +3 80 90 91 +3 81 80 91 +3 81 91 92 +3 82 81 92 +3 82 92 93 +3 83 82 93 +3 83 93 94 +3 84 83 94 +3 84 94 95 +3 86 96 107 +3 86 107 97 +3 87 86 97 +3 87 97 98 +3 88 87 98 +3 88 98 99 +3 89 88 99 +3 89 99 100 +3 90 89 100 +3 90 100 101 +3 91 90 101 +3 91 101 102 +3 92 91 102 +3 92 102 103 +3 93 92 103 +3 93 103 104 +3 94 93 104 +3 94 104 105 +3 95 94 105 +3 95 105 106 +3 97 107 118 +3 97 118 108 +3 98 97 108 +3 98 108 109 +3 99 98 109 +3 99 109 110 +3 100 99 110 +3 100 110 111 +3 101 100 111 +3 101 111 112 +3 102 101 112 +3 102 112 113 +3 103 102 113 +3 103 113 114 +3 104 103 114 +3 104 114 115 +3 105 104 115 +3 105 115 116 +3 106 105 116 +3 106 116 117 +3 108 118 129 +3 108 129 119 +3 109 108 119 +3 109 119 120 +3 110 109 120 +3 110 120 121 +3 111 110 121 +3 111 121 122 +3 112 111 122 +3 112 122 123 +3 113 112 123 +3 113 123 124 +3 114 113 124 +3 114 124 125 +3 115 114 125 +3 115 125 126 +3 116 115 126 +3 116 126 127 +3 117 116 127 +3 117 127 128 +3 119 129 130 +3 119 130 131 +3 120 119 131 +3 120 131 132 +3 121 120 132 +3 121 132 133 +3 122 121 133 +3 122 133 134 +3 123 122 134 +3 123 134 135 +3 124 123 135 +3 124 135 136 +3 125 124 136 +3 125 136 137 +3 126 125 137 +3 126 137 138 +3 127 126 138 +3 127 138 139 +3 128 127 139 +3 128 139 140 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp index 364df9d3cfa..ef4e8a08f8a 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/pmp_compute_normals_test.cpp @@ -1,62 +1,165 @@ -#include -#include -#include -#include +// #define CGAL_PMP_COMPUTE_NORMAL_DEBUG -#include +#include +#include + +#include +#include + +#include #include #include -typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; -typedef CGAL::Exact_predicates_exact_constructions_kernel Epec; +typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; +typedef CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt EPECK; -template -void test_normals(const char* file_name) +typedef CGAL::Surface_mesh EPICK_SM; +typedef CGAL::Surface_mesh EPECK_SM; + +namespace PMP = CGAL::Polygon_mesh_processing; + +template +void test(const Mesh& mesh, + const VertexNormalPmap& vnormals, + const FaceNormalPmap& fnormals) { - typedef typename K::Point_3 Point; - typedef typename K::Vector_3 Vector; - typedef CGAL::Surface_mesh Surface_mesh; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::face_descriptor face_descriptor; - - Surface_mesh mesh; + typedef typename K::Vector_3 Vector; + + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + typedef typename CGAL::GetVertexPointMap::const_type VPMap; + VPMap vpmap = get_const_property_map(CGAL::vertex_point, mesh); + + assert(!is_empty(mesh)); + + const vertex_descriptor first_vertex = *(vertices(mesh).begin()); + const face_descriptor first_face = *(faces(mesh).begin()); + + PMP::compute_face_normals(mesh, fnormals); + PMP::compute_face_normals(mesh, fnormals, PMP::parameters::vertex_point_map(vpmap)); + PMP::compute_face_normals(mesh, fnormals, CGAL::parameters::vertex_point_map(vpmap) + .geom_traits(K())); + + Vector f0n = PMP::compute_face_normal(first_face, mesh); + assert(f0n == get(fnormals, first_face)); + PMP::compute_face_normal(first_face, mesh, PMP::parameters::vertex_point_map(vpmap)); + + PMP::compute_vertex_normals(mesh, vnormals); + PMP::compute_vertex_normals(mesh, vnormals, PMP::parameters::vertex_point_map(vpmap)); + PMP::compute_vertex_normals(mesh, vnormals, CGAL::parameters::vertex_point_map(vpmap) + .geom_traits(K())); + + Vector v0n = PMP::compute_vertex_normal(first_vertex, mesh); + assert(v0n == get(vnormals, first_vertex)); + v0n = PMP::compute_vertex_normal(first_vertex, mesh, PMP::parameters::vertex_point_map(vpmap) + .face_normal_map(fnormals)); + std::cout.precision(17); + assert(v0n == get(vnormals, first_vertex)); + + PMP::compute_normals(mesh, vnormals, fnormals); + PMP::compute_normals(mesh, vnormals, fnormals, PMP::parameters::vertex_point_map(vpmap)); + PMP::compute_normals(mesh, vnormals, fnormals, CGAL::parameters::vertex_point_map(vpmap) + .geom_traits(K())); + + for(vertex_descriptor v : vertices(mesh)) { + assert(get(vnormals, v) != CGAL::NULL_VECTOR); + } + + for(face_descriptor f : faces(mesh)) { + assert(get(fnormals, f) != CGAL::NULL_VECTOR); + } +} + +template +void test_SM(const char* file_name) +{ + typedef CGAL::Surface_mesh SM; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + typedef typename K::Vector_3 Vector; + + std::cout << "Test with Surface_mesh, and kernel: " << typeid(K).name() << std::endl; + + SM mesh; std::ifstream input(file_name); - if (!(input >> mesh)){ - std::cerr << "Error: cannot read Surface_mesh : " << file_name << "\n"; + if(!(input >> mesh)) + { + std::cerr << "Error: cannot read " << file_name << " as a Surface_mesh\n"; assert(false); } - - typename Surface_mesh::template Property_map fnormals; - bool created; - boost::tie(fnormals, created) = mesh.template add_property_map("f:normals",Vector(0,0,0)); - CGAL::Polygon_mesh_processing::compute_face_normals(mesh, fnormals); - CGAL::Polygon_mesh_processing::compute_face_normals(mesh, fnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points())); - CGAL::Polygon_mesh_processing::compute_face_normals(mesh, fnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points()).geom_traits(K())); - typename Surface_mesh:: template Property_map vnormals; + typename SM::template Property_map vnormals; + vnormals = mesh.template add_property_map("v:normals", CGAL::NULL_VECTOR).first; + typename SM::template Property_map fnormals; + fnormals = mesh.template add_property_map("f:normals", CGAL::NULL_VECTOR).first; - boost::tie(vnormals, created) = mesh.template add_property_map("v:normals",Vector(0,0,0)); - CGAL::Polygon_mesh_processing::compute_vertex_normals(mesh, vnormals); - CGAL::Polygon_mesh_processing::compute_vertex_normals(mesh, vnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points())); - CGAL::Polygon_mesh_processing::compute_vertex_normals(mesh, vnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points()).geom_traits(K())); + test(mesh, vnormals, fnormals); +} - CGAL::Polygon_mesh_processing::compute_normals(mesh, vnormals, fnormals); - CGAL::Polygon_mesh_processing::compute_normals(mesh, vnormals, fnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points())); - CGAL::Polygon_mesh_processing::compute_normals(mesh, vnormals, fnormals, - CGAL::Polygon_mesh_processing::parameters::vertex_point_map(mesh.points()).geom_traits(K())); +template +void test_Polyhedron(const char* file_name) +{ + typedef CGAL::Polyhedron_3 Polyhedron; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename K::Vector_3 Vector; + + std::cout << "Test with Polyhedron, and kernel: " << typeid(K).name() << std::endl; + + Polyhedron mesh; + std::ifstream input(file_name); + if(!(input >> mesh)) + { + std::cerr << "Error: cannot read " << file_name << " as a Polyhedron\n"; + assert(false); + } + + typedef std::map VertexNormalMap; + typedef boost::associative_property_map VertexNormalPMap; + typedef std::map FaceNormalMap; + typedef boost::associative_property_map FaceNormalPMap; + + VertexNormalMap vn_map; + FaceNormalMap fn_map; + + for(vertex_descriptor v : vertices(mesh)) + vn_map[v] = CGAL::NULL_VECTOR; + for(face_descriptor f : faces(mesh)) + fn_map[f] = CGAL::NULL_VECTOR; + + VertexNormalPMap vnormals(vn_map); + FaceNormalPMap fnormals(fn_map); + + test(mesh, vnormals, fnormals); +} + +void test(const char* filename) +{ + std::cout << "test " << filename << "..." << std::endl; + + // EPECK disabled because it takes too long for the testsuite due to sq roots comparisons, + // but it passed. + test_SM(filename); +// test_SM(filename); + test_Polyhedron(filename); +// test_Polyhedron(filename); } int main() { - test_normals("data/elephant.off"); - test_normals("data/elephant.off"); + std::cout.precision(17); + + CGAL::Set_ieee_double_precision pfr; + + test("data/elephant.off"); + test("data/folded_star.off"); + test("data/joint_refined.off"); + test("data/mannequin-devil.off"); + test("data/U.off"); std::cerr << "All done." << std::endl; return EXIT_SUCCESS; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp index ab5778ec5f8..f18dda38b1e 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp @@ -1,8 +1,12 @@ +#define CGAL_PMP_DEBUG_SMALL_CC_REMOVAL + #include #include #include +#include +#include #include #include @@ -14,11 +18,9 @@ // namespace PMP = CGAL::Polygon_mesh_processing; +namespace CP = CGAL::parameters; -typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; - -typedef CGAL::Surface_mesh Surface_mesh; -typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; template void detect_degeneracies(const EdgeRange& edge_range, @@ -34,10 +36,10 @@ void detect_degeneracies(const EdgeRange& edge_range, std::set dedges; PMP::degenerate_edges(mesh, std::inserter(dedges, dedges.end())); PMP::degenerate_edges(edge_range, mesh, std::inserter(dedges, dedges.begin())); - PMP::degenerate_edges(mesh, std::inserter(dedges, dedges.end()), CGAL::parameters::all_default()); + PMP::degenerate_edges(mesh, std::inserter(dedges, dedges.end()), CP::all_default()); dedges.clear(); - PMP::degenerate_edges(edge_range, mesh, std::inserter(dedges, dedges.begin()), CGAL::parameters::all_default()); + PMP::degenerate_edges(edge_range, mesh, std::inserter(dedges, dedges.begin()), CP::all_default()); std::cout << "\t" << dedges.size() << " degenerate edges vs " << expected_dedges_n << std::endl; assert(dedges.size() == expected_dedges_n); @@ -45,10 +47,10 @@ void detect_degeneracies(const EdgeRange& edge_range, std::vector dfaces; PMP::degenerate_faces(mesh, std::back_inserter(dfaces)); PMP::degenerate_faces(face_range, mesh, std::back_inserter(dfaces)); - PMP::degenerate_faces(mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); + PMP::degenerate_faces(mesh, std::back_inserter(dfaces), CP::all_default()); dfaces.clear(); - PMP::degenerate_faces(face_range, mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); + PMP::degenerate_faces(face_range, mesh, std::back_inserter(dfaces), CP::all_default()); std::cout << "\t" << dfaces.size() << " degenerate faces vs " << expected_dfaces_n << std::endl; assert(dfaces.size() == expected_dfaces_n); } @@ -99,7 +101,7 @@ bool remove_dedges(const std::vector& edges_selection_ids, for(std::size_t edge_id : edges_selection_ids) edge_range.push_back(all_edges[edge_id]); - return CGAL::Polygon_mesh_processing::remove_degenerate_edges(edge_range, mesh, CGAL::parameters::all_default()); + return CGAL::Polygon_mesh_processing::remove_degenerate_edges(edge_range, mesh, CP::all_default()); } template @@ -115,21 +117,21 @@ bool remove_dfaces(const std::vector& faces_selection_ids, for(std::size_t face_id : faces_selection_ids) face_range.push_back(all_faces[face_id]); - return CGAL::Polygon_mesh_processing::remove_degenerate_faces(face_range, mesh, CGAL::parameters::all_default()); + return CGAL::Polygon_mesh_processing::remove_degenerate_faces(face_range, mesh, CP::all_default()); } template -void test(const char* filename, - const std::vector& edges_selection_ids, - const std::vector& faces_selection_ids, - const std::size_t expected_all_degen_edges_n, - const std::size_t expected_all_degen_faces_n, - const std::size_t expected_partial_degen_edges_n, - const std::size_t expected_partial_degen_faces_n, - const std::size_t expected_post_removal_degen_edges_n, - const std::size_t expected_post_removal_degen_faces_n) +void remove_degeneracies(const char* filename, + const std::vector& edges_selection_ids, + const std::vector& faces_selection_ids, + const std::size_t expected_all_degen_edges_n, + const std::size_t expected_all_degen_faces_n, + const std::size_t expected_partial_degen_edges_n, + const std::size_t expected_partial_degen_faces_n, + const std::size_t expected_post_removal_degen_edges_n, + const std::size_t expected_post_removal_degen_faces_n) { - std::cout << " test file: " << filename << std::endl; + std::cout << " remove_degeneracies, file: " << filename << std::endl; std::ifstream input(filename); Mesh mesh; @@ -149,12 +151,12 @@ void test(const char* filename, // Complete remove std::cout << " Remove all..." << std::endl; mesh = mesh_cpy; - /* bool all_removed = */ CGAL::Polygon_mesh_processing::remove_degenerate_edges(mesh, CGAL::parameters::all_default()); + /* bool all_removed = */ CGAL::Polygon_mesh_processing::remove_degenerate_edges(mesh, CP::all_default()); //assert(all_removed); assert(CGAL::is_valid_polygon_mesh(mesh)); mesh = mesh_cpy; - /* all_removed = */ CGAL::Polygon_mesh_processing::remove_degenerate_faces(mesh, CGAL::parameters::all_default()); + /* all_removed = */ CGAL::Polygon_mesh_processing::remove_degenerate_faces(mesh, CP::all_default()); // assert(all_removed); assert(CGAL::is_valid_polygon_mesh(mesh)); @@ -179,69 +181,177 @@ void test(const char* filename, std::cout << " Done" << std::endl; } +template +void initialize_IDs(const Mesh&) { } + +template +void initialize_IDs(const CGAL::Polyhedron_3& mesh) +{ + typedef CGAL::Polyhedron_3 Mesh; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + int i=0; + for(vertex_descriptor v : vertices(mesh)) + v->id() = i++; + + i=0; + for(face_descriptor f : faces(mesh)) + f->id() = i++; +} + +template +void remove_negligible_connected_components(const char* filename) +{ + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + std::cout << " remove negligible CCs, file: " << filename << std::endl; + + std::ifstream input(filename); + Mesh mesh, mesh_cpy; + if (!input || !(input >> mesh) || mesh.is_empty()) + { + std::cerr << filename << " is not a valid off file.\n"; + exit(1); + } + + mesh_cpy = mesh; + + initialize_IDs(mesh); + initialize_IDs(mesh_cpy); + + std::size_t ini_nv = num_vertices(mesh); + std::size_t ini_nf = num_faces(mesh); + + std::cout << "before: " << ini_nv << " nv & " << ini_nf << " nf" << std::endl; + + // negative thresholds --> doesn't remove anything + std::cout << "---------\nnull or negative threshold, nothing happens..." << std::endl; + std::size_t res = PMP::remove_connected_components_of_negligible_size(mesh, CP::area_threshold(-1e15) + .volume_threshold(0)); + assert(PMP::internal::number_of_connected_components(mesh) == 4); + assert(num_vertices(mesh) == ini_nv); + assert(num_faces(mesh) == ini_nf); + + // threshold too small, doesn't remove anything + std::cout << "---------\ntiny threshold, nothing happens..." << std::endl; + PMP::remove_connected_components_of_negligible_size(mesh, CP::area_threshold(1e-15) + .volume_threshold(1e-15)); + assert(PMP::internal::number_of_connected_components(mesh) == 4); + assert(num_vertices(mesh) == ini_nv); + assert(num_faces(mesh) == ini_nf); + + // that removes the CCs with small volumes + std::cout << "---------\nremove small volumes..." << std::endl; + res = PMP::remove_connected_components_of_negligible_size(mesh, CP::area_threshold(1e-15) + .volume_threshold(0.1)); + std::cout << "res: " << res << std::endl; + initialize_IDs(mesh); + assert(PMP::internal::number_of_connected_components(mesh) == 2); + + // that removes the open CC with a small area + std::cout << "---------\nremove small areas..." << std::endl; + PMP::remove_connected_components_of_negligible_size(mesh, CP::area_threshold(20)); + initialize_IDs(mesh); + assert(PMP::internal::number_of_connected_components(mesh) == 1); + + // Remove everything with a too-large value + std::cout << "---------\nremove everything..." << std::endl; + PMP::remove_connected_components_of_negligible_size(mesh, CP::area_threshold(1e15)); + assert(is_empty(mesh)); + + // Could also have used default paramaters, which does the job by itself + std::cout << "---------\ndefault values..." << std::endl; + + std::vector faces_to_be_removed; + std::size_t nb_to_be_rm = PMP::remove_connected_components_of_negligible_size( + mesh_cpy, CP::dry_run(true) + .output_iterator(std::back_inserter(faces_to_be_removed))); + assert(nb_to_be_rm == 3); + assert(PMP::internal::number_of_connected_components(mesh_cpy) == 4); // a dry run does not remove anything + assert(faces_to_be_removed.size() == 216); // sum of #faces of the small CCs + + assert(nb_to_be_rm == PMP::remove_connected_components_of_negligible_size(mesh_cpy)); + assert(PMP::internal::number_of_connected_components(mesh_cpy) == 1); +} + template void test() { - test("data_degeneracies/degtri_2dt_1edge_split_twice.off", - std::initializer_list({0, 1, 4, 3}), // edge selection - std::initializer_list({0}), // face selection - 0, 2, // expected number of degenerate edges/faces in the complete mesh - 0, 1, // expected number of degenerate edges/faces in the selection - 0, 0); // expected number of degenerate edges/faces in the mesh after partial removal + remove_degeneracies("data_degeneracies/degtri_2dt_1edge_split_twice.off", + std::initializer_list({0, 1, 4, 3}), // edge selection + std::initializer_list({0}), // face selection + 0, 2, // expected number of degenerate edges/faces in the complete mesh + 0, 1, // expected number of degenerate edges/faces in the selection + 0, 0); // expected number of degenerate edges/faces in the mesh after partial removal - test("data_degeneracies/degtri_four.off", - std::initializer_list({1}), - std::initializer_list({3}), - 0, 1, 0, 0, 0, 1); + remove_degeneracies("data_degeneracies/degtri_four.off", + std::initializer_list({1}), + std::initializer_list({3}), + 0, 1, 0, 0, 0, 1); - test("data_degeneracies/degtri_four-2.off", - std::initializer_list({2}), - std::initializer_list({3}), - 0, 1, 0, 0, 0, 1); + remove_degeneracies("data_degeneracies/degtri_four-2.off", + std::initializer_list({2}), + std::initializer_list({3}), + 0, 1, 0, 0, 0, 1); - test("data_degeneracies/degtri_on_border.off", - std::initializer_list({2}), - std::initializer_list({0}), - 0, 1, 0, 1, 0, 0); + remove_degeneracies("data_degeneracies/degtri_on_border.off", + std::initializer_list({2}), + std::initializer_list({0}), + 0, 1, 0, 1, 0, 0); - test("data_degeneracies/degtri_three.off", - std::initializer_list({2}), - std::initializer_list({1}), - 0, 1, 0, 0, 0, 1); + remove_degeneracies("data_degeneracies/degtri_three.off", + std::initializer_list({2}), + std::initializer_list({1}), + 0, 1, 0, 0, 0, 1); - test("data_degeneracies/degtri_single.off", - std::initializer_list({0, 1, 2}), - std::initializer_list({0}), - 0, 1, 0, 1, 0, 0); + remove_degeneracies("data_degeneracies/degtri_single.off", + std::initializer_list({0, 1, 2}), + std::initializer_list({0}), + 0, 1, 0, 1, 0, 0); - test("data_degeneracies/degtri_nullface.off", - std::initializer_list({3, 6, 7}), - std::initializer_list({0, 1, 2}), - 3, 4, 1, 2, 0, 0); + remove_degeneracies("data_degeneracies/degtri_nullface.off", + std::initializer_list({3, 6, 7}), + std::initializer_list({0, 1, 2}), + 3, 4, 1, 2, 0, 0); - test("data_degeneracies/trihole.off", - std::initializer_list({12}), - std::initializer_list({4, 5}), - 1, 3, 1, 2, 0, 0); + remove_degeneracies("data_degeneracies/trihole.off", + std::initializer_list({12}), + std::initializer_list({4, 5}), + 1, 3, 1, 2, 0, 0); - test("data_degeneracies/degtri_sliding.off", - std::initializer_list({2}), - std::initializer_list({2, 4}), - 0, 4, 0, 2, 0, 0); + remove_degeneracies("data_degeneracies/degtri_sliding.off", + std::initializer_list({2}), + std::initializer_list({2, 4}), + 0, 4, 0, 2, 0, 0); - test("data_degeneracies/fused_vertices.off", - std::initializer_list({5, 10, 13, 15, 27, 45}), - std::initializer_list({1, 3, 5, 10, 19}), - 6, 7, 2, 4, 3, 3); + remove_degeneracies("data_degeneracies/fused_vertices.off", + std::initializer_list({5, 10, 13, 15, 27, 45}), + std::initializer_list({1, 3, 5, 10, 19}), + 6, 7, 2, 4, 3, 3); + + remove_negligible_connected_components("data_degeneracies/small_ccs.off"); } -int main() +template +void test() { + typedef typename Kernel::Point_3 Point_3; + typedef CGAL::Surface_mesh Surface_mesh; + typedef CGAL::Polyhedron_3 Polyhedron_with_ID; + std::cout << "EPICK SM TESTS" << std::endl; - test(); + test(); std::cout << "EPICK POLYHEDRON TESTS" << std::endl; - test(); + test(); +} + +int main(int /*argc*/, char** /*argv*/) +{ + test(); + + std::cout << "Done" << std::endl; return EXIT_SUCCESS; } diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 1fef4191c6c..76ca96647d5 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include @@ -451,7 +451,7 @@ void filterMenuOperations(QMenu* menu, QString filter, bool keep_from_here) action->setVisible(!(submenu->isEmpty())); } - else if(action->text().contains(filter, Qt::CaseInsensitive)){ + else if(action->text().remove("&").contains(filter, Qt::CaseInsensitive)){ //menu->addAction(action); addActionToMenu(action, menu); } @@ -491,7 +491,7 @@ void MainWindow::filterOperations(bool) Q_FOREACH(const PluginNamePair& p, plugins) { Q_FOREACH(QAction* action, p.first->actions()) { action->setVisible( p.first->applicable(action) - && (action->text().contains(filter, Qt::CaseInsensitive) + && (action->text().remove("&").contains(filter, Qt::CaseInsensitive) || action->property("subMenuName") .toString().contains(filter, Qt::CaseInsensitive))); } @@ -1197,6 +1197,10 @@ void MainWindow::open(QString filename) selected_items << io_plugin->name(); } } + //if no plugin is correct, offer them all. + for(CGAL::Three::Polyhedron_demo_io_plugin_interface* io_plugin : io_plugins) { + all_items << io_plugin->name(); + } } else selected_items << *dfs_it; @@ -1477,11 +1481,11 @@ void MainWindow::showSceneContextMenu(int selectedItemIndex, this, SLOT(reloadItem())); } QAction* saveas = menu->addAction(tr("&Save as...")); - saveas->setData(qVariantFromValue((void*)item)); + saveas->setData(QVariant::fromValue((void*)item)); connect(saveas, SIGNAL(triggered()), this, SLOT(on_actionSaveAs_triggered())); QAction* showobject = menu->addAction(tr("&Zoom to this Object")); - showobject->setData(qVariantFromValue((void*)item)); + showobject->setData(QVariant::fromValue((void*)item)); connect(showobject, SIGNAL(triggered()), this, SLOT(viewerShowObject())); @@ -1804,7 +1808,12 @@ void MainWindow::readSettings() viewer->setFastDrawing(settings.value("quick_camera_mode", true).toBool()); scene->enableVisibilityRecentering(settings.value("offset_update", false).toBool()); viewer->textRenderer()->setMax(settings.value("max_text_items", 10000).toInt()); - viewer->setTotalPass(settings.value("transparency_pass_number", 4).toInt()); + int val = settings.value("transparency_pass_number", 4).toInt(); + if (val < 4 ) { + val = 4; + settings.setValue("transparency_pass_number", 4); + } + viewer->setTotalPass(val); CGAL::Three::Three::s_defaultSMRM = CGAL::Three::Three::modeFromName( settings.value("default_sm_rm", "flat+edges").toString()); CGAL::Three::Three::s_defaultPSRM = CGAL::Three::Three::modeFromName( @@ -3173,9 +3182,9 @@ void SubViewer::lookat() if (viewer->camera()->frame()->isSpinning()) viewer->camera()->frame()->stopSpinning(); mw->viewerShow(viewer, - (float)dialog.get_x(), - (float)dialog.get_y(), - (float)dialog.get_z()); + (float)dialog.get_x() + viewer->offset().x, + (float)dialog.get_y() + viewer->offset().y, + (float)dialog.get_z() + viewer->offset().z); } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp index d7a3863ce3a..0cf39f89ccb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp @@ -27,7 +27,7 @@ #include -#include +#include #include #include @@ -1241,7 +1241,7 @@ void Polyhedron_demo_cut_plugin::computeIntersection() Simple_kernel::Plane_3 plane(n[0], n[1], n[2], - n * pos); //std::cerr << plane << std::endl; edges_item->edges.clear(); - QTime time; + QElapsedTimer time; time.start(); bool does_intersect = false; for(Facet_sm_trees::iterator it = facet_sm_trees.begin(); it != facet_sm_trees.end(); ++it) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Convex_decomposition/Nef_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Convex_decomposition/Nef_plugin.cpp index 2d932bed12c..f93d72df11d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Convex_decomposition/Nef_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Convex_decomposition/Nef_plugin.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include using namespace CGAL::Three; class Polyhedron_demo_nef_plugin : @@ -115,7 +115,7 @@ Polyhedron_demo_nef_plugin::on_actionToNef_triggered() } QApplication::setOverrideCursor(Qt::WaitCursor); - QTime time; + QElapsedTimer time; time.start(); std::cerr << "Convert facegraph to nef polyhedron..."; @@ -146,7 +146,7 @@ Polyhedron_demo_nef_plugin::on_actionConvexDecomposition_triggered() : qobject_cast(scene->item(index)); QApplication::restoreOverrideCursor(); if(item) { - QTime time; + QElapsedTimer time; time.start(); std::cerr << "Convex decomposition..."; @@ -188,7 +188,7 @@ Polyhedron_demo_nef_plugin::on_actionToPoly_triggered() if(item) { QApplication::setOverrideCursor(Qt::WaitCursor); - QTime time; + QElapsedTimer time; time.start(); std::cerr << "Convert nef polyhedron to facegraph..."; @@ -277,7 +277,7 @@ void Polyhedron_demo_nef_plugin::boolean_operation(const Boolean_operation opera // perform Boolean operation std::cout << "Boolean operation..."; - QTime time; + QElapsedTimer time; time.start(); switch(operation) { diff --git a/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Convex_hull_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Convex_hull_plugin.cpp index 860b88e4461..3722f916e42 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Convex_hull_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Convex_hull/Convex_hull_plugin.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -74,7 +74,7 @@ void Polyhedron_demo_convex_hull_plugin::on_actionConvexHull_triggered() // wait cursor QApplication::setOverrideCursor(Qt::WaitCursor); - QTime time; + QElapsedTimer time; time.start(); std::cout << "Convex hull..."; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt index 616414c3f4d..01a48c330b8 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt @@ -80,6 +80,7 @@ endif() find_path(3MF_INCLUDE_DIR NAMES Model/COM/NMR_DLLInterfaces.h + PATH_SUFFIXES lib3mf DOC "Path to lib3MF headers" ) find_library(3MF_LIBRARIES NAMES 3MF DOC "Path to the lib3MF library") diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/Mesh_2_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/Mesh_2_plugin.cpp index c552ae91eb0..c746fdd3752 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/Mesh_2_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/Mesh_2_plugin.cpp @@ -35,7 +35,7 @@ #include -#include +#include #include #include #include @@ -264,14 +264,14 @@ private: typedef CGAL::Delaunay_mesh_size_criteria_2 Criteria; typedef CGAL::Delaunay_mesher_2 Mesher; - QTime time; // global timer + QElapsedTimer time; // global timer time.start(); std::cout << " Building Constrained_Delaunay_triangulation_2..." << std::flush; CDT cdt; - QTime ltime; //local timer + QElapsedTimer ltime; //local timer ltime.start(); double constant_coordinate = polylines_items.back()->polylines.back().back()[constant_coordinate_index]; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 08d5b1eee01..286642446a0 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -708,9 +708,9 @@ private: Volume_plane *y_item = new Volume_plane(img->image()->tx,img->image()->ty, img->image()->tz); Volume_plane *z_item = new Volume_plane(img->image()->tx,img->image()->ty, img->image()->tz); - x_item->setProperty("img",qVariantFromValue((void*)seg_img)); - y_item->setProperty("img",qVariantFromValue((void*)seg_img)); - z_item->setProperty("img",qVariantFromValue((void*)seg_img)); + x_item->setProperty("img",QVariant::fromValue((void*)seg_img)); + y_item->setProperty("img",QVariant::fromValue((void*)seg_img)); + z_item->setProperty("img",QVariant::fromValue((void*)seg_img)); x_item->setColor(QColor("red")); y_item->setColor(QColor("green")); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Meshing_thread.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Meshing_thread.cpp index 766613e9dbf..75503a8feec 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Meshing_thread.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Meshing_thread.cpp @@ -16,7 +16,7 @@ #include "config.h" -#include +#include #include #include "Meshing_thread.h" @@ -52,7 +52,7 @@ void Meshing_thread:: run() { - QTime timer; + QElapsedTimer timer; timer.start(); CGAL::Three::Three::CursorScopeGuard guard(Qt::BusyCursor); f_->launch(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimizer_thread.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimizer_thread.cpp index c0c01f0061f..dad540812fa 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimizer_thread.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Optimizer_thread.cpp @@ -16,7 +16,7 @@ #include "config_mesh_3.h" -#include +#include #include #include "Optimizer_thread.h" #include "Scene_c3t3_item.h" @@ -47,7 +47,7 @@ void Optimizer_thread:: run() { - QTime timer; + QElapsedTimer timer; timer.start(); //SEGFAULT rc_ = f_->launch(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp index 1585e3c0fad..4750f6ef4a5 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Clip_polyhedron_plugin.cpp @@ -91,7 +91,8 @@ public : //get the references this->scene = scene_interface; this->messages = mi; - plane = NULL; + plane = nullptr; + clipper_item = nullptr; //creates and link the actions actionClipPolyhedra = new QAction("Clip Polyhedra With Plane", mw); actionClipPolyhedra->setProperty("subMenuName","Polygon Mesh Processing/Corefinement"); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Partition_graph_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Partition_graph_plugin.cpp index c2b390a14bd..4d89a8a8316 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Partition_graph_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/Partition_graph_plugin.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include typedef Scene_surface_mesh_item Scene_facegraph_item; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp index 98851af36e8..d09466be0ff 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include "ui_Transformation_widget.h" diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp index f496b01bcd2..862305a886e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Fairing_plugin.cpp @@ -14,7 +14,7 @@ typedef Scene_surface_mesh_item Scene_facegraph_item; #include #include -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp index fcdb9f65551..bc1b95091c2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Hole_filling_plugin.cpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 66c8db3bef5..bfb2bb520a7 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -341,7 +341,7 @@ public Q_SLOTS: // wait cursor QApplication::setOverrideCursor(Qt::WaitCursor); - QTime time; + QElapsedTimer time; time.start(); typedef boost::graph_traits::edge_descriptor edge_descriptor; @@ -699,7 +699,7 @@ public Q_SLOTS: detect_and_split_duplicates(selection, edges_to_protect, target_length); #ifdef CGAL_LINKED_WITH_TBB - QTime time; + QElapsedTimer time; time.start(); tbb::parallel_for( @@ -715,7 +715,7 @@ public Q_SLOTS: target_length, nb_iter, protect, smooth_features); for(Scene_facegraph_item* poly_item : selection) { - QTime time; + QElapsedTimer time; time.start(); remesher(poly_item, edges_to_protect[poly_item->polyhedron()]); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp index f31f81bcdba..ec78f541cf3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Mean_curvature_flow_skeleton_plugin.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include @@ -360,7 +360,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionSegment() if (num_vertices(item->skeleton_curve)==0 ) { QApplication::restoreOverrideCursor(); return;} QApplication::setOverrideCursor(Qt::WaitCursor); - QTime time; + QElapsedTimer time; time.start(); // init the polyhedron simplex indices @@ -453,7 +453,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionConvert_to_me if ( !is_mesh_valid(pMesh) ) return; - QTime time; + QElapsedTimer time; time.start(); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -491,7 +491,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionContract() return; } - QTime time; + QElapsedTimer time; time.start(); std::cout << "Contract...\n"; QApplication::setOverrideCursor(Qt::WaitCursor); @@ -516,7 +516,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionCollapse() return; } - QTime time; + QElapsedTimer time; time.start(); std::cout << "Collapse...\n"; QApplication::setOverrideCursor(Qt::WaitCursor); @@ -542,7 +542,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionSplit() return; } - QTime time; + QElapsedTimer time; time.start(); std::cout << "Split...\n"; QApplication::setOverrideCursor(Qt::WaitCursor); @@ -567,7 +567,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionDegeneracy() return; } - QTime time; + QElapsedTimer time; time.start(); std::cout << "Detect degeneracy...\n"; QApplication::setOverrideCursor(Qt::WaitCursor); @@ -618,7 +618,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionRun() return; } - QTime time; + QElapsedTimer time; time.start(); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -741,7 +741,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionSkeletonize() return; } - QTime time; + QElapsedTimer time; time.start(); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -802,7 +802,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionConverge() return; } - QTime time; + QElapsedTimer time; time.start(); QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp index 7adfa335f0f..50d907332eb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Polyhedron_slicer_plugin.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include #include @@ -287,7 +287,7 @@ void Polyhedron_demo_polyhedron_slicer_plugin::on_Generate_button_clicked() if(!new_polyline_item_for_polylines) { Scene_polylines_item* new_polylines_item = new Scene_polylines_item(); - QTime time; time.start(); + QElapsedTimer time; time.start(); // call algorithm and fill polylines in polylines_item intersection_of_plane_Polyhedra_3_using_AABB_wrapper(*smesh, planes, plane_positions, new_polylines_item->polylines); // set names etc and print timing @@ -301,7 +301,7 @@ void Polyhedron_demo_polyhedron_slicer_plugin::on_Generate_button_clicked() scene->addItem(new_polylines_item); } else { - QTime time; time.start(); + QElapsedTimer time; time.start(); std::list > polylines; // call algorithm and fill polylines in polylines_item intersection_of_plane_Polyhedra_3_using_AABB_wrapper(*smesh, planes, plane_positions, polylines); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp index f5ee0e486c8..49063e703b7 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include #include @@ -94,7 +94,7 @@ public Q_SLOTS: // wait cursor QApplication::setOverrideCursor(Qt::WaitCursor); - QTime time; + QElapsedTimer time; time.start(); std::cout << "Perturbation..." << std::endl; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Smoothing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Smoothing_plugin.cpp index 3f463f6ce60..15e41fe939b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Smoothing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Smoothing_plugin.cpp @@ -17,7 +17,7 @@ #include "ui_Smoothing_plugin.h" -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp index 7095bc1bc26..88de2f26dab 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include typedef Scene_surface_mesh_item Scene_face_graph_item; @@ -130,7 +130,7 @@ void Polyhedron_demo_intersection_plugin::intersectionSurfaces() Scene_polylines_item* new_item = new Scene_polylines_item(); // perform Boolean operation - QTime time; + QElapsedTimer time; time.start(); try{ @@ -193,7 +193,7 @@ void Polyhedron_demo_intersection_plugin::intersectionPolylines() Scene_points_with_normal_item* new_point_item = new Scene_points_with_normal_item(); Scene_polylines_item* new_pol_item = new Scene_polylines_item(); // perform Boolean operation - QTime time; + QElapsedTimer time; time.start(); std::vector polyA, polyB; Q_FOREACH(const Polyline_3& poly, itemA->polylines) @@ -289,7 +289,7 @@ void Polyhedron_demo_intersection_plugin::intersectionSurfacePolyline() Scene_points_with_normal_item* new_point_item = new Scene_points_with_normal_item(); Scene_polylines_item* new_pol_item = new Scene_polylines_item(); // perform Boolean operation - QTime time; + QElapsedTimer time; time.start(); Scene_face_graph_item::Face_graph tm = *itemA->face_graph(); std::vector Afaces; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Surface_reconstruction_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Surface_reconstruction_plugin.cpp index 8ab870f06fa..715c4a8fb06 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Surface_reconstruction_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Surface_reconstruction_plugin.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp index 0d00de8eb16..cdb67ae214c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -81,7 +81,7 @@ template void Polyhedron_demo_subdivision_methods_plugin::apply_loop(FaceGraphItem* item, int nb_steps) { typename FaceGraphItem::Face_graph* graph = item->face_graph(); - QTime time; + QElapsedTimer time; time.start(); CGAL::Three::Three::information("Loop subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -113,7 +113,7 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_catmullclark(FaceGraphIte { typename FaceGraphItem::Face_graph* graph = item->face_graph(); if(!graph) return; - QTime time; + QElapsedTimer time; time.start(); CGAL::Three::Three::information("Catmull-Clark subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -143,7 +143,7 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_sqrt3(FaceGraphItem* item { typename FaceGraphItem::Face_graph* graph = item->face_graph(); if(!graph) return; - QTime time; + QElapsedTimer time; time.start(); CGAL::Three::Three::information("Sqrt-3 subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -175,7 +175,7 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_doosabin(FaceGraphItem* i { typename FaceGraphItem::Face_graph* graph = item->face_graph(); if(!graph) return; - QTime time; + QElapsedTimer time; time.start(); CGAL::Three::Three::information("Doo-Sabin subdivision..."); QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_plane_detection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_plane_detection_plugin.cpp index 989131b3ec3..c2a0a1c3d94 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_plane_detection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_plane_detection_plugin.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -196,7 +196,7 @@ void Polyhedron_demo_mesh_plane_detection_plugin::on_actionPlaneDetection_trigge if(dialog.exec() == QDialog::Rejected) return; - QTime time; + QElapsedTimer time; time.start(); std::cerr << "Detecting planes... "; QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_segmentation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_segmentation_plugin.cpp index 66ac1b6dd68..336d233b693 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_segmentation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_segmentation_plugin.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include @@ -211,7 +211,7 @@ void Polyhedron_demo_mesh_segmentation_plugin::apply_SDF_button_clicked(Facegrap typename boost::property_map::type fidmap = get(CGAL::face_index, *pair->first->face_graph()); FaceGraph_with_id_to_vector_property_map sdf_pmap(&pair->second, fidmap); - QTime time; + QElapsedTimer time; time.start(); std::pair min_max_sdf = sdf_values(*(pair->first->face_graph()), sdf_pmap, cone_angle, number_of_rays); std::cout << "ok (" << time.elapsed() << " ms)" << std::endl; @@ -284,7 +284,7 @@ void Polyhedron_demo_mesh_segmentation_plugin::apply_Partition_button_clicked(Fa QApplication::setOverrideCursor(Qt::WaitCursor); } check_and_set_ids(pair->first->face_graph()); - QTime time; + QElapsedTimer time; time.start(); typename boost::property_map::type fidmap = get(CGAL::face_index, *pair->first->face_graph()); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_simplification_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_simplification_plugin.cpp index f7156813ea0..29d9759b73b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_simplification_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Mesh_simplification_plugin.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include @@ -136,7 +136,7 @@ void Polyhedron_demo_mesh_simplification_plugin::on_actionSimplify_triggered() return; // simplify - QTime time; + QElapsedTimer time; time.start(); std::cout << "Simplify..."; QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp index 7ef01c4e953..b20bd58304e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Parameterization_plugin.cpp @@ -11,7 +11,7 @@ #include #include #include "Scene.h" -#include +#include #include #include #include @@ -602,7 +602,7 @@ void Polyhedron_demo_parameterization_plugin::parameterize(const Parameterizatio ////////// PARAMETERIZE /////////// /////////////////////////////////// - QTime time; + QElapsedTimer time; time.start(); // add textured polyhedon to the scene diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp index 3010a710635..a752130873e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp @@ -472,7 +472,7 @@ bool Scene_polyhedron_shortest_path_item_priv::run_point_select(const Ray_3& ray CGAL::Three::Three::information(QObject::tr("Computing shortest path polyline...")); - QTime time; + QElapsedTimer time; time.start(); //~ m_shortestPaths->m_debugOutput=true; m_shortestPaths->shortest_path_points_to_source_points( diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp index b411c8c6a17..c54a1d7d8db 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Shortest_path_plugin.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp index cebffa08e4d..bba6d446aa6 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Surface_mesh_approximation_plugin.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include @@ -305,7 +305,7 @@ void Polyhedron_demo_surface_mesh_approximation_plugin::on_buttonSeeding_clicked approx.set_metric(static_cast( ui_widget.comboMetric->currentIndex())); - QTime time; + QElapsedTimer time; time.start(); approx.initialize_seeds(CGAL::parameters::seeding_method( static_cast(ui_widget.comboMethod->currentIndex())) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp index 72bd09b3bd3..8d15fb0cbde 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp @@ -175,7 +175,8 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_actionDeformation_triggered() // what they do is simply transmitting required 'action' to selected scene_edit_polyhedron_item object void Polyhedron_demo_edit_polyhedron_plugin::on_AddCtrlVertPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -183,7 +184,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_AddCtrlVertPushButton_clicked() } void Polyhedron_demo_edit_polyhedron_plugin::on_PrevCtrlVertPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -193,7 +194,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_PrevCtrlVertPushButton_clicked() } void Polyhedron_demo_edit_polyhedron_plugin::on_NextCtrlVertPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -203,7 +204,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_NextCtrlVertPushButton_clicked() } void Polyhedron_demo_edit_polyhedron_plugin::on_SelectAllVerticesPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -213,7 +214,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_SelectAllVerticesPushButton_clic } void Polyhedron_demo_edit_polyhedron_plugin::on_DeleteCtrlVertPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -224,7 +225,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_DeleteCtrlVertPushButton_clicked } void Polyhedron_demo_edit_polyhedron_plugin::on_ClearROIPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -238,7 +239,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_ApplyAndClosePushButton_clicked( } void Polyhedron_demo_edit_polyhedron_plugin::on_DiscardChangesPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if (!edit_item) return; // the selected item is not of the right type @@ -297,14 +298,14 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_ActivateFixedPlaneCheckBox_state } void Polyhedron_demo_edit_polyhedron_plugin::on_OverwritePushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type edit_item->overwrite_deform_object(); } void Polyhedron_demo_edit_polyhedron_plugin::on_Select_isolated_components_button_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -316,7 +317,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_Select_isolated_components_butto } void Polyhedron_demo_edit_polyhedron_plugin::on_Get_minimum_button_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type @@ -328,7 +329,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_Get_minimum_button_clicked() { void Polyhedron_demo_edit_polyhedron_plugin::on_SaveROIPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; @@ -340,7 +341,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_SaveROIPushButton_clicked() } void Polyhedron_demo_edit_polyhedron_plugin::on_ReadROIPushButton_clicked() { - int item_id = scene->mainSelectionIndex(); + int item_id = scene->selectionIndices().front(); Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp index e15b5185976..495d2b73342 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include @@ -99,7 +99,6 @@ struct Scene_edit_polyhedron_item_priv mutable std::vector color_lines; mutable std::vector ROI_points; mutable std::vector control_points; - mutable std::vector ROI_color; mutable std::vector control_color; mutable std::vector normals; mutable std::vector pos_bbox; @@ -360,15 +359,12 @@ void Scene_edit_polyhedron_item_priv::compute_normals_and_vertices(Mesh* mesh) { CGAL::Color c(0,255,0); EPICK::Point_3 point(p.x()+offset.x, p.y()+offset.y, p.z()+offset.z); - spheres->add_sphere(EPICK::Sphere_3(point, length_of_axis/15.0*length_of_axis/15.0), c); + spheres->add_sphere(EPICK::Sphere_3(point, length_of_axis/15.0*length_of_axis/15.0), 0, c); } } } - ROI_color.assign(ROI_points.size(),0); - for(std::size_t i=0; i >::const_iterator hgb_data = fs.get_ctrl_vertex_frame_map(mesh).begin(); hgb_data != fs.get_ctrl_vertex_frame_map(mesh).end(); ++hgb_data) { if(hgb_data->frame == Three::mainViewer()->manipulatedFrame()) @@ -400,7 +396,7 @@ void Scene_edit_polyhedron_item_priv::compute_normals_and_vertices(Mesh* mesh) EPICK::Point_3 center(p.x()+offset.x, p.y()+offset.y, p.z()+offset.z); - spheres_ctrl->add_sphere(EPICK::Sphere_3(center, length_of_axis/15.0*length_of_axis/15.0), c); + spheres_ctrl->add_sphere(EPICK::Sphere_3(center, length_of_axis/15.0*length_of_axis/15.0), 0, c); } } } @@ -909,6 +905,8 @@ bool Scene_edit_polyhedron_item::eventFilter(QObject* /*target*/, QEvent *event) // check state changes between old and current state bool ctrl_pressed_now = d->state.ctrl_pressing && !old_state.ctrl_pressing; bool ctrl_released_now = !d->state.ctrl_pressing && old_state.ctrl_pressing; + if(ctrl_released_now) //to avoid moving the control vertices next time ctrl is pressed + d->state.left_button_pressing = false; if(ctrl_pressed_now || ctrl_released_now || event->type() == QEvent::HoverMove) {// activate a handle manipulated frame CGAL::QGLViewer* viewer = Three::mainViewer(); @@ -1271,7 +1269,7 @@ void Scene_edit_polyhedron_item::ShowAsSphere(bool b) { if(!d->spheres) { - d->spheres = new Scene_spheres_item(this, false); + d->spheres = new Scene_spheres_item(this, 0, false, false); d->spheres->setName("ROI spheres"); d->spheres->setRenderingMode(Gouraud); connect(d->spheres, SIGNAL(destroyed()), this, SLOT(reset_spheres())); @@ -1283,7 +1281,7 @@ void Scene_edit_polyhedron_item::ShowAsSphere(bool b) } if(!d->spheres_ctrl) { - d->spheres_ctrl = new Scene_spheres_item(this, false); + d->spheres_ctrl = new Scene_spheres_item(this, false, false); d->spheres_ctrl->setName("Control spheres"); d->spheres_ctrl->setRenderingMode(Gouraud); connect(d->spheres_ctrl, &QObject::destroyed, this, Reset_spheres_ctrl(d) ); @@ -1776,6 +1774,10 @@ Scene_surface_mesh_item* Scene_edit_polyhedron_item::sm_item()const void Scene_edit_polyhedron_item::computeElements() const { d->compute_normals_and_vertices(sm_item()->face_graph()); + if(d->spheres) + d->spheres->computeElements(); + if(d->spheres_ctrl) + d->spheres_ctrl->computeElements(); std::vector vertices; std::vector *vertices_ptr; const CGAL::qglviewer::Vec offset = Three::mainViewer()->offset(); diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index dbef3cd7402..d0a399d2981 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -84,9 +84,12 @@ Scene::addItem(CGAL::Three::Scene_item* item) addGroup(group); //init the item for the mainViewer to avoid using unexisting //VAOs if the mainViewer is not the first to be drawn. + QOpenGLFramebufferObject* fbo = CGAL::Three::Three::mainViewer()->depthPeelingFbo(); + CGAL::Three::Three::mainViewer()->setDepthPeelingFbo(nullptr);//to prevent crashing as the fbo is not initialized in this call. item->draw(CGAL::Three::Three::mainViewer()); item->drawEdges(CGAL::Three::Three::mainViewer()); item->drawPoints(CGAL::Three::Three::mainViewer()); + CGAL::Three::Three::mainViewer()->setDepthPeelingFbo(fbo); return id; } diff --git a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp index fdace3d1452..c477b00a241 100644 --- a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp @@ -439,6 +439,7 @@ struct Scene_c3t3_item_priv { return false; } Scene_spheres_item *spheres; + std::vector tr_vertices; Scene_intersection_item *intersection; bool spheres_are_shown; const Scene_item* data_item_; @@ -1351,7 +1352,7 @@ void Scene_c3t3_item_priv::computeSpheres() if(!spheres) return; - + int s_id = 0; for(Tr::Finite_vertices_iterator vit = c3t3.triangulation().finite_vertices_begin(), end = c3t3.triangulation().finite_vertices_end(); @@ -1397,8 +1398,10 @@ void Scene_c3t3_item_priv::computeSpheres() wp2p(vit->point()).z() + offset.z); double radius = vit->point().weight() ; typedef unsigned char UC; - spheres->add_sphere(Geom_traits::Sphere_3(center, radius), + tr_vertices.push_back(*vit); + spheres->add_sphere(Geom_traits::Sphere_3(center, radius),s_id++, CGAL::Color(UC(c.red()), UC(c.green()), UC(c.blue()))); + } spheres->invalidateOpenGLBuffers(); } @@ -1563,7 +1566,17 @@ void Scene_c3t3_item::show_spheres(bool b) contextMenu()->findChild("actionShowSpheres")->setChecked(b); if(b && !d->spheres) { - d->spheres = new Scene_spheres_item(this, true); + d->spheres = new Scene_spheres_item(this, d->c3t3.number_of_vertices_in_complex(), true); + connect(d->spheres, &Scene_spheres_item::picked, + this, [this](std::size_t id) + { + if(id == (std::size_t)(-1)) + return; + QString msg = QString("Vertex's index : %1; Vertex's in dimension: %2.").arg(d->tr_vertices[id].index()).arg(d->tr_vertices[id].in_dimension()); + CGAL::Three::Three::information(msg); + CGAL::Three::Three::mainViewer()->displayMessage(msg, 5000); + + }); d->spheres->setName("Protecting spheres"); d->spheres->setRenderingMode(Gouraud); connect(d->spheres, SIGNAL(destroyed()), this, SLOT(reset_spheres())); @@ -1580,7 +1593,6 @@ void Scene_c3t3_item::show_spheres(bool b) } Q_EMIT redraw(); } - } void Scene_c3t3_item::show_intersection(bool b) { diff --git a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp index cb9b43c6162..8802aeec8e1 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp @@ -218,6 +218,7 @@ Scene_polylines_item_private::computeSpheres() // At this point, 'corner_polyline_nb' gives the multiplicity of all // corners. //Finds the centers of the spheres and their color + int s_id = 0; for(iterator p_it = corner_polyline_nb.begin(), end = corner_polyline_nb.end(); @@ -253,7 +254,7 @@ Scene_polylines_item_private::computeSpheres() } CGAL::Color c(colors[0], colors[1], colors[2]); - spheres->add_sphere(K::Sphere_3(center+offset, spheres_drawn_square_radius), c); + spheres->add_sphere(K::Sphere_3(center+offset, spheres_drawn_square_radius),s_id++, c); } spheres->setToolTip( QString("

Legend of endpoints colors:

    " @@ -560,7 +561,7 @@ void Scene_polylines_item::change_corner_radii(double r) { d->draw_extremities = (r > 0); if(r>0 && !d->spheres) { - d->spheres = new Scene_spheres_item(this, false); + d->spheres = new Scene_spheres_item(this, 0, false); d->spheres->setName("Corner spheres"); d->spheres->setRenderingMode(Gouraud); connect(d->spheres, SIGNAL(destroyed()), this, SLOT(reset_spheres())); diff --git a/Polyhedron/demo/Polyhedron/Scene_spheres_item.cpp b/Polyhedron/demo/Polyhedron/Scene_spheres_item.cpp index 6be4cae28ad..dbdb9e4dd9d 100644 --- a/Polyhedron/demo/Polyhedron/Scene_spheres_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_spheres_item.cpp @@ -1,4 +1,5 @@ #include "Scene_spheres_item.h" +#include #include #include #include @@ -12,11 +13,14 @@ typedef Edge_container Ec; struct Scene_spheres_item_priv { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + typedef CGAL::Sphere_3 Sphere; + typedef std::pair Sphere_pair; + typedef std::vector > Spheres_container; - Scene_spheres_item_priv(bool planed, Scene_spheres_item* parent) + Scene_spheres_item_priv(bool planed, std::size_t max_index, Scene_spheres_item* parent, bool pickable) :precision(36) ,has_plane(planed) - + ,pickable(pickable) { item = parent; create_flat_and_wire_sphere(1.0f,vertices,normals, edges); @@ -24,6 +28,7 @@ struct Scene_spheres_item_priv edges_colors.clear(); centers.clear(); radius.clear(); + spheres.resize(max_index + 1); nb_centers = 0; nb_edges = 0; nb_vertices = 0; @@ -33,6 +38,9 @@ struct Scene_spheres_item_priv ~Scene_spheres_item_priv() { } + + void pick(int &id)const; + void initializeBuffers(CGAL::Three::Viewer_interface *viewer)const; int precision; @@ -44,6 +52,7 @@ struct Scene_spheres_item_priv mutable std::vector edges; mutable std::vector colors; mutable std::vector edges_colors; + mutable std::vector picking_colors; mutable std::vector centers; mutable std::vector radius; mutable QOpenGLShaderProgram *program; @@ -53,12 +62,61 @@ struct Scene_spheres_item_priv mutable bool model_sphere_is_up; Scene_spheres_item* item; QString tooltip; + mutable Spheres_container spheres; + const bool pickable; }; -Scene_spheres_item::Scene_spheres_item(Scene_group_item* parent, bool planed) + +void Scene_spheres_item_priv::pick(int& id) const +{ + if(!pickable) + return; + + if(id >= static_cast(spheres.size())) + { + id = -1; + } + + int offset = 0; + float color[4]; + for(std::size_t i=0; i(id)) + { + color[0]=spheres[i][j].second.red()/255.0; + color[1]=spheres[i][j].second.green()/255.0; + color[2]=spheres[i][j].second.blue()/255.0; + } + else + { + color[0]=1.0f; + color[1]=1.0f; + color[2]=0.0f; + } + Vbo* color_vbo = item->getTriangleContainer(0)->getVbo(Tc::FColors); + color_vbo->bind(); + color_vbo->vbo.write(offset*3*sizeof(float), color, 3*sizeof(float)); + color_vbo->release(); + ++offset; + } + } +} + +Scene_spheres_item::Scene_spheres_item(Scene_group_item* parent, std::size_t max_index, bool planed, bool pickable) { setParent(parent); - d = new Scene_spheres_item_priv(planed, this); + d = new Scene_spheres_item_priv(planed, max_index, this, pickable); + if(pickable) + { + //for picking + setTriangleContainer(1, + new Tc(planed ? Vi::PROGRAM_CUTPLANE_SPHERES + : Vi::PROGRAM_SPHERES + ,false)); + } + //for drawing setTriangleContainer(0, new Tc(planed ? Vi::PROGRAM_CUTPLANE_SPHERES : Vi::PROGRAM_SPHERES @@ -79,6 +137,12 @@ void Scene_spheres_item_priv::initializeBuffers(CGAL::Three::Viewer_interface *v item->getTriangleContainer(0)->initializeBuffers(viewer); item->getTriangleContainer(0)->setFlatDataSize(nb_vertices); item->getTriangleContainer(0)->setCenterSize(nb_centers); + if(pickable) + { + item->getTriangleContainer(1)->initializeBuffers(viewer); + item->getTriangleContainer(1)->setFlatDataSize(nb_vertices); + item->getTriangleContainer(1)->setCenterSize(nb_centers); + } vertices.clear(); vertices.shrink_to_fit(); item->getEdgeContainer(0)->initializeBuffers(viewer); @@ -91,6 +155,8 @@ void Scene_spheres_item_priv::initializeBuffers(CGAL::Three::Viewer_interface *v centers.swap(centers); colors.clear(); colors.swap(colors); + picking_colors.clear(); + picking_colors.shrink_to_fit(); radius.clear(); radius.swap(radius); edges_colors.clear(); @@ -113,12 +179,39 @@ void Scene_spheres_item::draw(Viewer_interface *viewer) const setBuffersFilled(true); setBuffersInit(viewer, true); } - if(d->has_plane) - { - QVector4D cp(d->plane.a(),d->plane.b(),d->plane.c(),d->plane.d()); - getTriangleContainer(0)->setPlane(cp); - } - getTriangleContainer(0)->draw(viewer, false); + int deviceWidth = viewer->camera()->screenWidth(); + int deviceHeight = viewer->camera()->screenHeight(); + if(d->has_plane) + { + QVector4D cp(d->plane.a(),d->plane.b(),d->plane.c(),d->plane.d()); + getTriangleContainer(0)->setPlane(cp); + if(d->pickable) + getTriangleContainer(1)->setPlane(cp); + } + if(d->pickable && (d->spheres.size() > 1 && viewer->inDrawWithNames())) + { + getTriangleContainer(1)->getVao(viewer)->program->setAttributeValue("normals", QVector3D(0,0,0)); + getTriangleContainer(1)->draw(viewer, false); + } + else + { + getTriangleContainer(0)->draw(viewer, false); + } + if(d->pickable && (d->spheres.size() > 1 && viewer->inDrawWithNames())) + { + int rowLength = deviceWidth * 4; // data asked in RGBA,so 4 bytes. + const static int dataLength = rowLength * deviceHeight; + GLubyte* buffer = new GLubyte[dataLength]; + // Qt uses upper corner for its origin while GL uses the lower corner. + QPoint picking_target = viewer->mapFromGlobal(QCursor::pos()); + viewer->glReadPixels(picking_target.x(), deviceHeight-1-picking_target.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + int ID = (buffer[0] + buffer[1] * 256 +buffer[2] * 256*256) ; + if(buffer[0]*buffer[1]*buffer[2] < 255*255*255) + { + d->pick(ID); + picked(ID); + } + } } void Scene_spheres_item::drawEdges(Viewer_interface *viewer) const @@ -146,29 +239,47 @@ void Scene_spheres_item::drawEdges(Viewer_interface *viewer) const getEdgeContainer(0)->draw(viewer, false); } -void Scene_spheres_item::add_sphere(const CGAL::Sphere_3& sphere, CGAL::Color color) +void Scene_spheres_item::add_sphere(const Sphere &sphere, std::size_t index, CGAL::Color color) { - d->colors.push_back((float)color.red()/255); - d->colors.push_back((float)color.green()/255); - d->colors.push_back((float)color.blue()/255); + if(index > d->spheres.size()-1) + d->spheres.resize(index+1); - d->edges_colors.push_back((float)color.red()/255); - d->edges_colors.push_back((float)color.green()/255); - d->edges_colors.push_back((float)color.blue()/255); + d->spheres[index].push_back(std::make_pair(sphere, color)); - d->centers.push_back(sphere.center().x()); - d->centers.push_back(sphere.center().y()); - d->centers.push_back(sphere.center().z()); + d->colors.push_back((float)color.red()/255); + d->colors.push_back((float)color.green()/255); + d->colors.push_back((float)color.blue()/255); + if(d->pickable) + { + int R = (index & 0x000000FF) >> 0; + int G = (index & 0x0000FF00) >> 8; + int B = (index & 0x00FF0000) >> 16; + float r = R/255.0; + float g = G/255.0; + float b = B/255.0; + d->picking_colors.push_back(r); + d->picking_colors.push_back(g); + d->picking_colors.push_back(b); + } + d->edges_colors.push_back((float)color.red()/255); + d->edges_colors.push_back((float)color.green()/255); + d->edges_colors.push_back((float)color.blue()/255); - d->radius.push_back(CGAL::sqrt(sphere.squared_radius())); + d->centers.push_back(sphere.center().x()); + d->centers.push_back(sphere.center().y()); + d->centers.push_back(sphere.center().z()); + d->radius.push_back(CGAL::sqrt(sphere.squared_radius())); } void Scene_spheres_item::clear_spheres() { + d->spheres.clear(); d->colors.clear(); d->edges_colors.clear(); d->centers.clear(); d->radius.clear(); + d->picking_colors.clear(); + setBuffersFilled(false); } void Scene_spheres_item::setPrecision(int prec) { d->precision = prec; } void Scene_spheres_item::setPlane(Kernel::Plane_3 p_plane) { d->plane = p_plane; } @@ -176,6 +287,11 @@ void Scene_spheres_item::invalidateOpenGLBuffers() { setBuffersFilled(false); getTriangleContainer(0)->reset_vbos(NOT_INSTANCED); + getTriangleContainer(0)->reset_vbos(COLORS); + if(d->pickable){ + getTriangleContainer(1)->reset_vbos(NOT_INSTANCED); + getTriangleContainer(1)->reset_vbos(COLORS); + } getEdgeContainer(0)->reset_vbos(NOT_INSTANCED); } @@ -209,6 +325,11 @@ void Scene_spheres_item::computeElements() const getTriangleContainer(0)->allocate(Tc::Flat_normals, d->normals.data(), static_cast(d->normals.size()*sizeof(float))); + + if(d->pickable) + getTriangleContainer(1)->allocate(Tc::Flat_vertices, d->vertices.data(), + static_cast(d->vertices.size()*sizeof(float))); + d->nb_vertices = d->vertices.size(); } @@ -216,9 +337,19 @@ void Scene_spheres_item::computeElements() const static_cast(d->colors.size()*sizeof(float))); getTriangleContainer(0)->allocate(Tc::Radius, d->radius.data(), static_cast(d->radius.size()*sizeof(float))); - getTriangleContainer(0)->allocate(Tc::Facet_centers, d->centers.data(), static_cast(d->centers.size()*sizeof(float))); + + if(d->pickable) + { + getTriangleContainer(1)->allocate(Tc::FColors, d->picking_colors.data(), + static_cast(d->picking_colors.size()*sizeof(float))); + getTriangleContainer(1)->allocate(Tc::Radius, d->radius.data(), + static_cast(d->radius.size()*sizeof(float))); + getTriangleContainer(1)->allocate(Tc::Facet_centers, d->centers.data(), + static_cast(d->centers.size()*sizeof(float))); + } + if(!d->model_sphere_is_up) { getEdgeContainer(0)->allocate(Ec::Vertices, d->edges.data(), @@ -237,7 +368,6 @@ void Scene_spheres_item::computeElements() const getEdgeContainer(0)->allocate(Ec::Centers, d->centers.data(), static_cast(d->centers.size()*sizeof(float))); - d->nb_centers = d->centers.size(); } @@ -254,3 +384,40 @@ void Scene_spheres_item::gl_initialization(Vi* viewer) setBuffersFilled(true); } } + +void Scene_spheres_item::compute_bbox() const +{ + Bbox box = Bbox(); + for(std::size_t id=0; idspheres.size(); ++id) + { + for(Sphere_pair pair : d->spheres[id]) + { + box += pair.first.bbox(); + } + } + _bbox = box; +} + +bool Scene_spheres_item::save(const std::string& file_name)const +{ + + std::ofstream out(file_name.c_str()); + if(!out) { return false; } + + std::size_t nb_spheres=0; + for(std::size_t i = 0; ispheres.size(); ++i) + nb_spheres += d->spheres[i].size(); + + out<spheres.size() -1<<"\n"; + + for(std::size_t i = 0; ispheres.size(); ++i) + { + for(const Sphere_pair& pair : d->spheres[i]) + { + out << i << " " << pair.first.center() << " " << CGAL::sqrt(pair.first.squared_radius())<<"\n"; + } + } + out << "\n"; + return true; +} + diff --git a/Polyhedron/demo/Polyhedron/Scene_spheres_item.h b/Polyhedron/demo/Polyhedron/Scene_spheres_item.h index a0da0d207d7..57eeaafa10d 100644 --- a/Polyhedron/demo/Polyhedron/Scene_spheres_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_spheres_item.h @@ -15,27 +15,37 @@ #include #include struct Scene_spheres_item_priv; + +/* This item contains spheres and associated colors. They are kept in a Spheres_container, + * sorted by the value of their "index". This item also has an internal picking mechanism that + * colorizes all the spheres that has the same index as the one that has been picked. + * The picking is only usable if several indices exist. + * If all the spheres have the index 0, they can have independant colors (generally used by the items that + * have a Scene_spheres_item child). +*/ class SCENE_BASIC_OBJECTS_EXPORT Scene_spheres_item : public CGAL::Three::Scene_item_rendering_helper { Q_OBJECT public: typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; - typedef std::pair*, CGAL::Color> Sphere_pair ; + typedef CGAL::Sphere_3 Sphere; + typedef std::pair Sphere_pair; + typedef std::vector > Spheres_container; - Scene_spheres_item(Scene_group_item* parent, bool planed = false); + Scene_spheres_item(Scene_group_item* parent, std::size_t max_index = 0, bool planed = false, bool pickable = true); ~Scene_spheres_item(); - bool isFinite() const Q_DECL_OVERRIDE{ return false; } + bool isFinite() const Q_DECL_OVERRIDE{ return true; } bool isEmpty() const Q_DECL_OVERRIDE{ return false; } Scene_item* clone() const Q_DECL_OVERRIDE{return 0;} QString toolTip() const Q_DECL_OVERRIDE; bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE{ return (m == Gouraud || m == Wireframe); } - void compute_bbox() const Q_DECL_OVERRIDE{ _bbox = Bbox(); } - void add_sphere(const CGAL::Sphere_3 &sphere, CGAL::Color = CGAL::Color(120,120,120)); + void compute_bbox() const Q_DECL_OVERRIDE; + void add_sphere(const Sphere &sphere, std::size_t index = 0, CGAL::Color = CGAL::Color(120,120,120)); void clear_spheres(); void setPrecision(int prec); void gl_initialization(CGAL::Three::Viewer_interface* viewer); @@ -45,10 +55,14 @@ public: void setPlane(Kernel::Plane_3 p_plane); void setToolTip(QString s); void setColor(QColor c) Q_DECL_OVERRIDE; + bool save(const std::string &file_name) const; + + void initializeBuffers(Viewer_interface *) const Q_DECL_OVERRIDE; void computeElements() const Q_DECL_OVERRIDE; Q_SIGNALS: void on_color_changed(); + void picked(std::size_t id) const; protected: friend struct Scene_spheres_item_priv; Scene_spheres_item_priv* d; diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index a25bd48cadf..7b6febf0ff9 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -102,7 +102,10 @@ struct Scene_surface_mesh_item_priv{ Scene_surface_mesh_item_priv(const Scene_surface_mesh_item& other, Scene_surface_mesh_item* parent): smesh_(new SMesh(*other.d->smesh_)), idx_data_(other.d->idx_data_), - idx_edge_data_(other.d->idx_edge_data_) + idx_edge_data_(other.d->idx_edge_data_), + fpatch_id_map(other.d->fpatch_id_map), + min_patch_id(other.d->min_patch_id), + colors_(other.d->colors_) { item = parent; item->setTriangleContainer(1, new Triangle_container(VI::PROGRAM_WITH_LIGHT, diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.frag b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.frag index 251ae415a18..4a2f5cd9798 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.frag +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_c3t3.frag @@ -40,7 +40,10 @@ void main(void) { highp vec3 V = -fP.xyz; highp vec3 N; if(fN == vec3(0.0,0.0,0.0)) - N = vec3(0.0,0.0,0.0); + { + gl_FragColor = my_color; + return; + } else N = normalize(fN); L = normalize(L); diff --git a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag index 302fa0e6123..d7e0564ef4f 100644 --- a/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag +++ b/Polyhedron/demo/Polyhedron/resources/compatibility_shaders/shader_with_light.frag @@ -50,16 +50,19 @@ void main(void) { highp vec3 L = light_pos.xyz - fP.xyz; highp vec3 V = -fP.xyz; highp vec3 N; - if(fN == vec3(0.0,0.0,0.0)) - N = vec3(0.0,0.0,0.0); - else - N = normalize(fN); + highp vec4 my_color = highp vec4(color.xyz, 1.0); + if(fN == vec3(0.0,0.0,0.0)) + { + out_color = my_color; + return; + } + N = normalize(fN); L = normalize(L); V = normalize(V); highp vec3 R = reflect(-L, N); highp vec4 diffuse; float dot_prod = dot(N,L); - highp vec4 my_color; + if(back_front_shading) { if (dot_prod > 0) @@ -67,10 +70,7 @@ void main(void) { else my_color = back_color; } - else - { - my_color = highp vec4(color.xyz, 1.0); - } + if(is_two_side == 1) diffuse = abs(dot(N,L)) * light_diff * color; else diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag index ee93e450002..9893fcc80a5 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag @@ -42,7 +42,10 @@ void main(void) { vec3 V = -fP.xyz; vec3 N; if(fN == vec3(0.0,0.0,0.0)) - N = vec3(0.0,0.0,0.0); + { + out_color = my_color; + return; + } else N = normalize(fN); L = normalize(L); diff --git a/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag b/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag index e1fbe4d1139..5963ca308f3 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_with_light.frag @@ -51,8 +51,12 @@ void main(void) { vec3 L = light_pos.xyz - fP.xyz; vec3 V = -fP.xyz; vec3 N; + vec4 my_color = vec4(color.xyz, 1.0); if(fN == vec3(0.0,0.0,0.0)) - N = vec3(0.0,0.0,0.0); + { + out_color = my_color; + return; + } else N = normalize(fN); L = normalize(L); @@ -60,7 +64,7 @@ void main(void) { vec3 R = reflect(-L, N); vec4 diffuse; float dot_prod = dot(N,L); - vec4 my_color; + if(back_front_shading) { if (dot_prod > 0) diff --git a/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h b/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h index 3286936c418..e2490619df9 100644 --- a/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h +++ b/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h @@ -13,6 +13,7 @@ #ifndef CGAL_POLYHEDRON_3_TO_LCC_H #define CGAL_POLYHEDRON_3_TO_LCC_H +#include #include #include #include diff --git a/Stream_support/examples/Stream_support/data/polygons.wkt b/Stream_support/examples/Stream_support/data/polygons.wkt index d1165f8d8e2..a3ab3a8955f 100644 --- a/Stream_support/examples/Stream_support/data/polygons.wkt +++ b/Stream_support/examples/Stream_support/data/polygons.wkt @@ -1,3 +1,3 @@ -POLYGON ((-1 -1, 1 -1, 0 1 ),(-0.5 -0.5, 0 0.5, 0.5 -0.5)) -POLYGON ((-2 -2, 2 -2, 0 2 ),(-1 -1, 0 1, 1 -1)) +POLYGON ((-1 -1, 1 -1, 0 1, -1 -1),(-0.5 -0.5, 0 0.5, 0.5 -0.5, -0.5 -0.5)) +POLYGON ((-2 -2, 2 -2, 0 2, -2 -2),(-1 -1, 0 1, 1 -1, -1 -1)) POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30)) diff --git a/Stream_support/include/CGAL/IO/WKT.h b/Stream_support/include/CGAL/IO/WKT.h index 7fd74c49dde..a4a47790573 100644 --- a/Stream_support/include/CGAL/IO/WKT.h +++ b/Stream_support/include/CGAL/IO/WKT.h @@ -39,6 +39,28 @@ namespace CGAL{ +namespace internal { + + template + void pop_back_if_equal_to_front(CGAL::Polygon_2& poly) + { + typename CGAL::Polygon_2::iterator it = poly.end(); + --it; + if( (*poly.begin()) == *it){ + poly.erase(it); + } + } + + template + void pop_back_if_equal_to_front(CGAL::Polygon_with_holes_2& pwh) + { + pop_back_if_equal_to_front(pwh.outer_boundary()); + for(auto i = pwh.holes_begin(); i!= pwh.holes_end(); ++i){ + pop_back_if_equal_to_front(*i); + } + } +} + template std::istream& read_point_WKT( std::istream& in, @@ -177,7 +199,13 @@ read_polygon_WKT( std::istream& in, if(type.substr(0, 7).compare("POLYGON")==0) { - boost::geometry::read_wkt(line, polygon); + try { + boost::geometry::read_wkt(line, polygon); + } catch( ...){ + in.setstate(std::ios::failbit); + return in; + }; + internal::pop_back_if_equal_to_front(polygon); break; } } @@ -205,7 +233,18 @@ read_multi_polygon_WKT( std::istream& in, if(type.substr(0, 12).compare("MULTIPOLYGON")==0) { - boost::geometry::read_wkt(line, gc); + try { + boost::geometry::read_wkt(line, gc); + } catch( ...){ + in.setstate(std::ios::failbit); + return in; + }; + for( typename + internal::Geometry_container::iterator it + = gc.begin(); it != gc.end(); ++it) + { + internal::pop_back_if_equal_to_front(*it); + } break; } } diff --git a/Stream_support/test/Stream_support/test_write_WKT.cpp b/Stream_support/test/Stream_support/test_write_WKT.cpp index ac602a67a93..4d690001eb7 100644 --- a/Stream_support/test/Stream_support/test_write_WKT.cpp +++ b/Stream_support/test/Stream_support/test_write_WKT.cpp @@ -60,17 +60,14 @@ Polygon generate_polygon() border.push_back(bl); border.push_back(t); border.push_back(br); - border.push_back(bl); Polygon::Polygon_2 hole1; hole1.push_back(Point((xt+xmax)/2, (ymin+ymid)/2)); hole1.push_back(Point(((xt+xmax)/2), ymid)); hole1.push_back(Point(xt+(xmax-xt)/4, (ymin+ymid)/2)); - hole1.push_back(Point((xt+xmax)/2, (ymin+ymid)/2)); Polygon::Polygon_2 hole2; hole2.push_back(Point((xt+xmin)/2, (ymin+ymid)/2)); hole2.push_back(Point(((xt+xmin)/2), ymid)); hole2.push_back(Point(xmin+(xt-xmin)/4, (ymin+ymid)/2)); - hole2.push_back(Point((xt+xmin)/2, (ymin+ymid)/2)); Polygon::Holes_container holes; holes.push_back(hole1); holes.push_back(hole2); @@ -150,6 +147,7 @@ int main() CGAL::read_polygon_WKT(is, test_poly); is.close(); } + CGAL_assertion(poly == test_poly); MultiPoint pees = generate_multipoint(); diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h index c42f07c1c40..2a638624662 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h @@ -83,6 +83,7 @@ #include #include +#include #include #include @@ -173,6 +174,11 @@ public: BorderParameterizer_, Two_vertices_parameterizer_3 >::type Border_parameterizer; + #if !defined(CGAL_EIGEN3_ENABLED) + CGAL_static_assertion_msg(!(boost::is_same::value), + "Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); + #endif + typedef typename Default::Get< SolverTraits_, #if defined(CGAL_EIGEN3_ENABLED) @@ -184,7 +190,6 @@ public: Eigen::SparseLU::EigenType> > #endif #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library") SolverTraits_ // no parameter provided, and Eigen is not enabled: so don't compile! #endif >::type Solver_traits; diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h index 32a472ffb01..fa8307ab6ce 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h @@ -88,7 +88,6 @@ class Barycentric_mapping_parameterizer_3 Eigen::BiCGSTAB::EigenType, Eigen::IncompleteLUT > > >::type > #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library") SolverTraits_>::type > // no parameter provided, and Eigen is not enabled: so don't compile! #endif { diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h index 3ca77271989..c99c3d92d99 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h @@ -92,7 +92,6 @@ class Discrete_authalic_parameterizer_3 Eigen::BiCGSTAB::EigenType, Eigen::IncompleteLUT > > >::type > #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library") SolverTraits_>::type > // no parameter provided, and Eigen is not enabled: don't compile #endif { diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h index 10da5aca451..2eda6baaaf4 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h @@ -92,7 +92,6 @@ class Discrete_conformal_map_parameterizer_3 Eigen::BiCGSTAB::EigenType, Eigen::IncompleteLUT > > >::type > #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library") SolverTraits_>::type > // no parameter provided, and Eigen is not enabled: so don't compile! #endif { diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h index c6e443cdf97..99de2c63519 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h @@ -34,6 +34,7 @@ #endif #include +#include #include /// \file Fixed_border_parameterizer_3.h @@ -104,6 +105,11 @@ public: BorderParameterizer_, Circular_border_arc_length_parameterizer_3 >::type Border_parameterizer; + #if !defined(CGAL_EIGEN3_ENABLED) + CGAL_static_assertion_msg(!(boost::is_same::value), + "Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); + #endif + typedef typename Default::Get< SolverTraits_, #if defined(CGAL_EIGEN3_ENABLED) @@ -111,7 +117,6 @@ public: Eigen::BiCGSTAB::EigenType, Eigen::IncompleteLUT > > #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); SolverTraits_ // no parameter provided, and Eigen is not enabled: so don't compile! #endif >::type Solver_traits; diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h index 78d98885437..1aeca305850 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h @@ -89,7 +89,6 @@ public: Eigen::BiCGSTAB::EigenType, Eigen::IncompleteLUT > > #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library") SolverTraits_ // no parameter provided, and Eigen is not enabled: so don't compile! #endif >::type Solver_traits; diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h index 8eea7686a9f..b832ae16ca1 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h @@ -90,7 +90,6 @@ class Mean_value_coordinates_parameterizer_3 Eigen::BiCGSTAB::EigenType, Eigen::IncompleteLUT > > >::type > #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); SolverTraits_>::type > // no parameter provided, and Eigen is not enabled: so don't compile! #endif { diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h index 6d8692ce377..3d570311b53 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -383,6 +384,11 @@ class Orbifold_Tutte_parameterizer_3 { public: #ifndef DOXYGEN_RUNNING + #if !defined(CGAL_EIGEN3_ENABLED) + CGAL_static_assertion_msg(!(boost::is_same::value), + "Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); + #endif + typedef typename Default::Get< SolverTraits_, #if defined(CGAL_EIGEN3_ENABLED) @@ -394,7 +400,6 @@ public: Eigen::SparseLU::EigenType> > #endif #else - #pragma message("Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library") SolverTraits_ // no parameter provided, and Eigen is not enabled: so don't compile! #endif >::type Solver_traits; diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt index 67a84fb18df..fcda63c6a1f 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt @@ -350,12 +350,12 @@ steps of the simplification algorithm. \cgalExample{Surface_mesh_simplification/edge_collapse_visitor_surface_mesh.cpp} -\subsection Surface_mesh_simplificationExampleWithGarlandHeckbertUsingAPolyhedron Example with Garland-Heckbert using a Polyhedron +\subsection Surface_mesh_simplificationExampleWithGarlandHeckbertUsingAPolyhedron Example Using Garland-Heckbert Policies -Garland-Heckbert simplification is implemented with a single class, +Garland-Heckbert simplification policies are implemented with a single class, `Surface_mesh_simplification::GarlandHeckbert_policies`, that regroups both a cost and -a placement policy class: this is because either of these policies require the other one to function properly. -Note that it is still possible to wrap either policy, for example it is possible to use +a placement policy class: this is because either of these policies requires the other one to function properly. +Note that it is still possible to wrap either policy: for example, it is possible to use behavior modifiers such as `Surface_mesh_simplification::Bounded_normal_change_placement` with the Garland-Heckbert placement policy. diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/dependencies b/Surface_mesh_simplification/doc/Surface_mesh_simplification/dependencies index b9a3ca57d3c..d2fa6db6731 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/dependencies +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/dependencies @@ -5,4 +5,5 @@ Algebraic_foundations Circulator Stream_support Polyhedron +Surface_mesh BGL diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt new file mode 100644 index 00000000000..4887546db08 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt @@ -0,0 +1,23 @@ +project(Surface_mesh_topology_Benchmarks) + +cmake_minimum_required(VERSION 3.1) + +find_package(CGAL) + +# add_definitions(-DCGAL_TRACE_PATH_TESTS) +# add_definitions(-DCGAL_TRACE_CMAP_TOOLS) + +if ( NOT CGAL_FOUND ) + + message(FATAL_ERROR "This program requires the CGAL library, and will not be compiled.") + +endif() + +set(SOURCE_FILES + quadrangulation_computation_benchmarks.cpp + path_homotopy_with_schema.cpp + ) + +foreach(cppfile ${SOURCE_FILES}) + create_single_source_cgal_program("${cppfile}") +endforeach() diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/generate-gnuplot-data.sh b/Surface_mesh_topology/benchmark/Surface_mesh_topology/generate-gnuplot-data.sh new file mode 100755 index 00000000000..de180eec2bd --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/generate-gnuplot-data.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# Requirement: +# The three files res-quadrangulation-computation.txt, res-path-homotopy.txt, res-polygonal-schema.txt must exist (result of the script run-benchmarks.sh) + +ficIn="res-path-homotopy.txt" + +function extract_info_for_reduced_map() +{ + if [ $# -ne 2 ] + then + echo "ERROR in extract_info_for_reduced_map: need two arguments." + exit 1 + fi + + ficIn="${1}" + ficOut="${2}" + + # 0) Copy old file + if [ -f "${ficOut}" ] + then + cp -f "${ficOut}" "${ficOut}.COPY" + fi + + # 1) Extract 2-map size and simplification times + echo "# ==========#INITIAL-MAP========== ==========#REDUCED-MAP========" > "${ficOut}" + echo "#darts #vertices #edges #faces #darts #vertices #edges #faces GlobalTime" >> "${ficOut}" + + # 2.1) Extract the different info. + grep "Initial map:" "${ficIn}" | cut -d '=' -f 2 | cut -d ',' -f 1 > restmp1.txt + grep "Initial map:" "${ficIn}" | cut -d '=' -f 3 | cut -d ',' -f 1 > restmp2.txt + grep "Initial map:" "${ficIn}" | cut -d '=' -f 4 | cut -d ',' -f 1 > restmp3.txt + grep "Initial map:" "${ficIn}" | cut -d '=' -f 5 | cut -d ',' -f 1 > restmp4.txt + + grep "Reduced map:" "${ficIn}" | cut -d '=' -f 2 | cut -d ',' -f 1 > restmp5.txt + grep "Reduced map:" "${ficIn}" | cut -d '=' -f 3 | cut -d ',' -f 1 > restmp6.txt + grep "Reduced map:" "${ficIn}" | cut -d '=' -f 4 | cut -d ',' -f 1 > restmp7.txt + grep "Reduced map:" "${ficIn}" | cut -d '=' -f 5 | cut -d ',' -f 1 > restmp8.txt + + grep "\[TIME\] Total time for computation of reduced map: " "${ficIn}" | cut -d ' ' -f 9 > restmp9.txt + + # 2.2) Regroup the different info in different columns of a same file. + paste -d '\t' restmp1.txt restmp2.txt restmp3.txt restmp4.txt restmp5.txt restmp6.txt restmp7.txt restmp8.txt restmp9.txt >> "${ficOut}" + + # 3) Erase temp files + rm -f restmp1.txt restmp2.txt restmp3.txt restmp4.txt restmp5.txt restmp6.txt restmp7.txt restmp8.txt restmp9.txt +} + +function extract_time_path_homotopy() +{ + if [ $# -ne 2 ] + then + echo "ERROR in extract_time_path_homotopy: need two arguments." + exit 1 + fi + + ficIn="${1}" + ficOut="${2}" + + # 0) Copy old file + if [ -f "${ficOut}" ] + then + cp -f "${ficOut}" "${ficOut}.COPY" + fi + + # 1) Extract computation times of homotopy tests. + + # 1.1) Extract the different info. + echo "Path1" > restmp1.txt + grep "Random seed: " "${ficIn}" | cut -d ' ' -f 6 >> restmp1.txt + echo "Path2" > restmp2.txt + grep "Random seed: " "${ficIn}" | cut -d ' ' -f 12 >> restmp2.txt + echo "TimeContractible" > restmp3.txt + grep "\[TIME\] is_contractible: " "${ficIn}" | cut -d ' ' -f 3 >> restmp3.txt + echo "TimeHomotopy" > restmp4.txt + grep "\[TIME\] are_freely_homotopic: " "${ficIn}" | cut -d ' ' -f 3 >> restmp4.txt + + # 1.2) Regroup the different info in different columns of a same file. + echo "# Size_of_path1; Size_of_path 2; time_of_contractible_test; time_of_homotopy_test." > "${ficOut}" + paste -d '\t' restmp1.txt restmp2.txt restmp3.txt restmp4.txt >> "${ficOut}" + + # 2) Erase temp files + rm -f restmp1.txt restmp2.txt restmp3.txt restmp4.txt +} + +# Bench 1 +extract_info_for_reduced_map "res-quadrangulation-computation.txt" "computation-time-reduce-surface.dat" + +# Bench 2 +extract_time_path_homotopy "res-path-homotopy.txt" "computation-time-path-homotopy.dat" + +# Bench 3 +extract_time_path_homotopy "res-polygonal-schema.txt" "computation-time-polygonal-schema.dat" diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-path-homotopy.dat b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-path-homotopy.dat new file mode 100644 index 00000000000..0a0bdfe3554 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-path-homotopy.dat @@ -0,0 +1,202 @@ +# Size_of_path1; Size_of_path 2; time_of_contractible_test; time_of_homotopy_test. +Path1 Path2 TimeContractible TimeHomotopy +1524414 1530418 3.86554 7.8444 +1049124 1050087 2.83135 5.60931 +2509006 2513362 6.13668 12.624 +2224823 2232443 5.40251 10.484 +1008888 1018619 2.38837 4.79886 +1332065 1339611 3.22555 6.41267 +3561764 3562141 8.05207 16.0708 +2438898 2442370 5.71337 11.477 +1914057 1919940 4.77898 9.59951 +2551120 2555476 6.3078 12.6345 +64526 70685 0.173418 0.361924 +492594 498396 1.26223 2.53348 +571858 580868 1.37788 2.7772 +38840 43934 0.095079 0.203706 +15721 22405 0.052084 0.12308 +9948224 9954782 23.2806 46.5412 +1122183 1126957 2.45848 4.81015 +1459662 1462867 3.35651 6.8351 +1329962 1333900 3.47501 7.01742 +117030 123624 0.265891 0.552161 +1047344 1054974 2.62549 5.27579 +6539021 6542800 15.1482 29.9774 +380967 385239 0.911951 1.78487 +41353 50077 0.115257 0.254276 +3898884 3908780 8.92204 18.0542 +558908 563296 1.44482 2.89175 +4623570 4623770 12.0801 23.8146 +2627660 2633041 6.63529 13.3076 +312744 313066 0.820126 1.65689 +33012 34720 0.108203 0.230179 +5128852 5133062 11.6124 23.6011 +8652 11181 0.026449 0.060392 +90040 90840 0.216791 0.433557 +325686 327807 0.873464 1.75005 +4408 4618 0.01283 0.026318 +2047709 2051939 5.35872 10.6866 +2929154 2934675 7.39593 14.586 +2287508 2290644 5.55511 10.9367 +20056 25590 0.061392 0.135105 +12729 18273 0.025678 0.061112 +8756 11625 0.028232 0.066159 +1133402 1141097 2.82907 5.799 +887726 891707 2.14112 4.27661 +190541 196368 0.443466 0.889504 +784656 793928 1.94601 3.97098 +27886 35939 0.093204 0.205428 +166193 174683 0.481829 0.959715 +1634955 1637981 4.05175 8.12494 +786667 787481 2.16864 4.30371 +3058683 3066220 7.43228 14.9763 +853145 854664 1.91083 3.84597 +915736 924315 2.21234 4.46275 +2064414 2068788 4.54639 9.07704 +1498675 1506208 3.47994 7.0999 +11465 13867 0.034742 0.074569 +1500 5543 0.004261 0.019447 +1460356 1465976 3.44903 6.99999 +3918177 3922313 9.90904 19.7113 +155505 159968 0.419477 0.853855 +5997 12540 0.012746 0.037545 +7791265 7796654 18.2438 36.3007 +3017926 3020885 7.27202 14.4281 +2253 11462 0.007446 0.043296 +1344480 1349288 3.13805 6.35775 +218100 226787 0.468398 0.96952 +19859 25206 0.061167 0.136706 +1570055 1572437 3.70686 7.42759 +1147928 1157287 3.11372 6.27166 +4267 12199 0.013633 0.05177 +794927 804905 1.94774 3.91127 +3118323 3123949 7.4862 14.8817 +345935 348709 0.961987 1.93947 +5251784 5257377 12.0356 24.3891 +425488 434411 1.0689 2.21017 +1025760 1033772 2.47379 4.96134 +2667536 2670807 5.99514 12.1269 +1020 10923 0.003334 0.03613 +41545 47295 0.13632 0.285656 +1586593 1595375 3.89181 7.88352 +2356504 2366079 5.84226 11.6113 +698817 703240 1.81419 3.64923 +1498299 1501573 3.70302 7.44321 +70491 78080 0.208676 0.436235 +3205404 3213809 7.6062 15.2643 +137069 143418 0.331668 0.684771 +185021 193489 0.456013 0.94372 +10514 14184 0.03405 0.079866 +258978 263450 0.654929 1.31629 +188212 189028 0.572463 1.14209 +1655535 1659255 4.05374 8.14516 +20552 29551 0.046739 0.113477 +6858 12047 0.022151 0.059419 +231344 234092 0.522525 1.05193 +277089 283900 0.668141 1.3473 +1421926 1428857 3.38821 6.82178 +6803208 6804143 15.5407 31.2071 +4341787 4342468 10.8756 21.6696 +9820 11913 0.024156 0.051882 +488145 491953 1.09079 2.19668 +193168 202125 0.505617 1.0208 +134408 144351 0.269846 0.569942 +72262 76189 0.158625 0.328027 +1163327 1167912 2.53666 5.09627 +95971 101468 0.22881 0.477161 +94754 98378 0.248858 0.51487 +1619634 1626306 3.6389 7.25762 +1919 8130 0.00373 0.018792 +169566 169802 0.375949 0.766477 +52578 59065 0.119055 0.25467 +327514 327939 0.652794 1.42988 +146008 155458 0.305657 0.660986 +590498 596057 1.32982 2.69134 +144709 145509 0.372597 0.744431 +49839 52970 0.11164 0.229819 +2257 4753 0.005862 0.018162 +772205 779198 1.68543 3.38799 +209107 210069 0.512779 1.07825 +13950 19070 0.044721 0.10062 +148524 156085 0.361171 0.75974 +15715 20316 0.038191 0.085281 +341581 344135 0.828873 1.65824 +111707 114165 0.296571 0.598192 +285513 291355 0.605756 1.24273 +12753 17702 0.024112 0.058651 +261253 263576 0.618294 1.25177 +18513 28416 0.052058 0.130877 +158453 163209 0.358461 0.750459 +101060 103049 0.281742 0.608572 +19681 22059 0.043818 0.09175 +636056 637157 1.43374 2.91012 +26136 29879 0.068484 0.145167 +10689 15705 0.033721 0.083634 +28682 32541 0.068278 0.139902 +13712 16507 0.030123 0.06685 +36802 39073 0.085301 0.192078 +131822 135049 0.330327 0.657221 +15369 15546 0.040625 0.080504 +1197160 1204876 2.66886 5.37277 +47253 47995 0.133238 0.264456 +48388 49535 0.099999 0.198439 +1329710 1332418 3.19551 6.3238 +398055 398563 0.898438 1.81173 +10626 14753 0.021253 0.049661 +38241 47721 0.098851 0.226109 +713191 718785 1.57574 3.37537 +17118 19578 0.042418 0.089777 +20334 20581 0.049075 0.087179 +425156 425864 0.998048 1.96725 +681002 685169 1.56764 3.13846 +14736 23593 0.032963 0.083728 +66104 73386 0.144509 0.312302 +126934 133243 0.304479 0.637488 +173684 182567 0.380653 0.806827 +216994 220747 0.51478 1.05948 +13280 16356 0.030476 0.066812 +24361 31632 0.057538 0.129382 +287887 290771 0.643613 1.31868 +13682 21002 0.032396 0.08104 +43631 51969 0.085418 0.192622 +38593 42276 0.095875 0.202057 +52163 61186 0.1213 0.267168 +30870 31893 0.073838 0.169932 +23218 26791 0.048905 0.106194 +39019 39369 0.106431 0.193006 +18964 27272 0.056686 0.13645 +11732 20138 0.035749 0.106614 +2756 8825 0.006236 0.024911 +85872 86320 0.209328 0.422786 +18111 21500 0.040477 0.086777 +39323 42317 0.11067 0.242744 +110949 115416 0.280661 0.58945 +271220 276460 0.598784 1.22255 +135663 143683 0.312725 0.664022 +44947 48769 0.085369 0.185623 +17174 22804 0.040513 0.091902 +19647 22235 0.052287 0.112104 +400748 408506 0.876389 1.7828 +71523 71930 0.14962 0.338061 +223197 228220 0.533326 1.09191 +2601935 2603641 5.50732 10.8151 +516647 521009 1.14199 2.2921 +1042972 1044599 2.29914 4.62039 +104943 114537 0.231351 0.498831 +1513 9121 0.004627 0.031175 +142475 145066 0.343284 0.726973 +6627 10613 0.019339 0.049796 +448219 449595 0.946231 1.917 +219376 223420 0.51011 1.05122 +370410 371342 0.889112 1.78276 +18643 19126 0.041526 0.08436 +17322 18198 0.032815 0.066431 +16556 25713 0.039275 0.101854 +8885 13720 0.018419 0.046641 +43760 51887 0.116647 0.262684 +33747 41820 0.077442 0.17862 +73982 79198 0.194931 0.409284 +138225 141825 0.298229 0.628531 +25385 34450 0.058727 0.138786 +737872 744717 1.68372 3.4144 +11975 20410 0.027492 0.075561 diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-path-homotopy.gnuplot b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-path-homotopy.gnuplot new file mode 100644 index 00000000000..a467583b2fb --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-path-homotopy.gnuplot @@ -0,0 +1,31 @@ +# set terminal postscript eps color 20 lw 3 +# set output '| epstopdf -f -o=computation-time-path-homotopy.pdf' + +set terminal svg fname 'Verdana' lw 2 # size 640 480 fname 'Verdana' lw 3 +set output 'computation-time-path-homotopy.svg' + +set key autotitle columnheader + +set ylabel "Time (sec)" +set xlabel "Path lengths" +set key left + +# set xtics (0, '' 1, 2, 4, 8, 16, 32, 64) +# set ytics (4, 16, 64, 256, 1024, 4096, "16,384" 16384) + +# set logscale x 10 +# set logscale y 10 + +set xrange [0:20100000] +# set yrange [0:250] + +set xtics ('5,000,000' 5000000, '10,000,000' 10000000, '15,000,000' 15000000, '20,000,000' 20000000) + +# set auto x + +FIT_LIMIT=1.e-14 +f(x) = m*x + b +fit f(x) 'computation-time-path-homotopy.dat' using ($1+$2):4 via m,b + +plot 'computation-time-path-homotopy.dat' using ($1+$2):4 with points title "Homotopy test", f(x) title 'Model Fit' + diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-polygonal-schema.dat b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-polygonal-schema.dat new file mode 100644 index 00000000000..ce64800164a --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-polygonal-schema.dat @@ -0,0 +1,212 @@ +# Size_of_path1; Size_of_path 2; time_of_contractible_test; time_of_homotopy_test. +Path1 Path2 TimeContractible TimeHomotopy +10 1810 1.2e-05 0.001005 +10 1810 9e-06 0.000968 +10 1810 8e-06 0.001003 +10 1810 8e-06 0.000963 +10 1810 7e-06 0.000966 +10 1810 9e-06 0.001177 +10 1810 7e-06 0.000996 +10 1810 8e-06 0.001022 +10 1810 8e-06 0.000979 +10 1810 7e-06 0.000987 +20 1820 1.8e-05 0.001095 +20 1820 1.4e-05 0.00105 +20 1820 1.2e-05 0.001062 +20 1820 1.7e-05 0.001035 +20 1820 1.3e-05 0.001049 +20 1820 1.2e-05 0.00101 +20 1820 1.3e-05 0.001002 +20 1820 1.8e-05 0.001019 +20 1820 2.2e-05 0.001037 +20 1820 1.4e-05 0.001149 +30 1830 2.2e-05 0.001108 +30 1830 1.8e-05 0.001021 +30 1830 2.2e-05 0.001016 +30 1830 2.1e-05 0.001083 +30 1830 2e-05 0.001038 +30 1830 2e-05 0.001031 +30 1830 1.9e-05 0.001087 +30 1830 2.2e-05 0.001032 +30 1830 2e-05 0.001021 +30 1830 1.8e-05 0.001027 +100 1900 6.2e-05 0.001295 +100 1900 5.6e-05 0.001204 +100 1900 5.5e-05 0.001213 +100 1900 5.9e-05 0.001151 +100 1900 5.5e-05 0.001145 +100 1900 5.9e-05 0.001107 +100 1900 5.7e-05 0.001101 +100 1900 5.7e-05 0.001154 +100 1900 5.3e-05 0.001134 +100 1900 5.8e-05 0.001139 +200 2000 0.000108 0.001324 +200 2000 0.000127 0.001278 +200 2000 0.000103 0.001273 +200 2000 0.000106 0.001214 +200 2000 9.7e-05 0.001194 +200 2000 0.000102 0.001204 +200 2000 0.0001 0.001208 +200 2000 0.000106 0 +200 2000 0 0 +200 2000 0 0.001102 +300 2100 0.00015 0.001414 +300 2100 0.000156 0.001383 +300 2100 0.00015 0.001383 +300 2100 0.000164 0.001353 +300 2100 0.000151 0.001377 +300 2100 0.000148 0.00132 +300 2100 0.000189 0.001327 +300 2100 0.000153 0.001346 +300 2100 0.000148 0.001338 +300 2100 0.000149 0.001316 +1000 2800 0.000503 0.00274 +1000 2800 0.000515 0.00225 +1000 2800 0.000503 0.002229 +1000 2800 0.000487 0.002148 +1000 2800 0.000506 0.002183 +1000 2800 0.0005 0.002198 +1000 2800 0.000524 0.002243 +1000 2800 0.000476 0.002138 +1000 2800 0.000519 0.00216 +1000 2800 0.000508 0.002289 +2000 3800 0.001098 0.003557 +2000 3800 0.001039 0.003471 +2000 3800 0.001114 0.003608 +2000 3800 0.001052 0.0035 +2000 3800 0.001065 0.003567 +2000 3800 0.001091 0.003504 +2000 3800 0.001089 0.003487 +2000 3800 0.001035 0.003462 +2000 3800 0.001044 0.003641 +2000 3800 0.001071 0.003581 +3000 4800 0.001588 0.004812 +3000 4800 0.001464 0.00467 +3000 4800 0.001528 0.004638 +3000 4800 0.001537 0.004624 +3000 4800 0.001567 0.004616 +3000 4800 0.0015 0.004668 +3000 4800 0.001511 0.004656 +3000 4800 0.001499 0.004802 +3000 4800 0.001506 0.004569 +3000 4800 0.001547 0.004533 +10000 11800 0.005356 0.013876 +10000 11800 0.005086 0.013546 +10000 11800 0.005001 0.013021 +10000 11800 0.004986 0.013122 +10000 11800 0.005043 0.01331 +10000 11800 0.00499 0.013371 +10000 11800 0.005031 0.009351 +10000 11800 0.004947 0.012935 +10000 11800 0.005056 0.013268 +10000 11800 0.00501 0.012934 +20000 21800 0.010521 0.028003 +20000 21800 0.010399 0.02753 +20000 21800 0.010433 0.027865 +20000 21800 0.010353 0.023407 +20000 21800 0.010198 0.028186 +20000 21800 0.010343 0.027859 +20000 21800 0.010273 0.029628 +20000 21800 0.010566 0.027236 +20000 21800 0.010242 0.026748 +20000 21800 0.01086 0.028129 +30000 31800 0.015946 0.043957 +30000 31800 0.015459 0.041385 +30000 31800 0.016125 0.038053 +30000 31800 0.015935 0.043414 +30000 31800 0.015291 0.04098 +30000 31800 0.015353 0.042937 +30000 31800 0.017732 0.045088 +30000 31800 0.015587 0.041879 +30000 31800 0.015839 0.041111 +30000 31800 0.016299 0.045976 +100000 101800 0.056463 0.17237 +100000 101800 0.054943 0.180977 +100000 101800 0.055873 0.171254 +100000 101800 0.053753 0.171383 +100000 101800 0.055899 0.171538 +100000 101800 0.054506 0.178545 +100000 101800 0.05419 0.171793 +100000 101800 0.055006 0.185616 +100000 101800 0.055066 0.174076 +100000 101800 0.055227 0.189212 +200000 201800 0.113193 0.251366 +200000 201800 0.053804 0.188959 +200000 201800 0.065313 0.319781 +200000 201800 0.11272 0.339641 +200000 201800 0.112057 0.347156 +200000 201800 0.109281 0.340843 +200000 201800 0.108663 0.344816 +200000 201800 0.12226 0.366892 +200000 201800 0.116914 0.375243 +200000 201800 0.109202 0.342457 +300000 301800 0.165865 0.524276 +300000 301800 0.161986 0.52858 +300000 301800 0.164922 0.531664 +300000 301800 0.166501 0.529451 +300000 301800 0.165578 0.532124 +300000 301800 0.166458 0.537297 +300000 301800 0.165786 0.532855 +300000 301800 0.165027 0.55081 +300000 301800 0.166903 0.535346 +300000 301800 0.16556 0.542188 +1000000 1001800 0.565789 1.7571 +1000000 1001800 0.555874 1.73021 +1000000 1001800 0.545865 1.78313 +1000000 1001800 0.567576 1.75944 +1000000 1001800 0.584859 1.77367 +1000000 1001800 0.525251 1.71673 +1000000 1001800 0.568166 1.64886 +1000000 1001800 0.538682 1.71856 +1000000 1001800 0.575029 1.67964 +1000000 1001800 0.548759 1.75386 +2000000 2001800 1.07172 3.30467 +2000000 2001800 1.00794 3.21761 +2000000 2001800 1.04292 3.43482 +2000000 2001800 1.10887 3.44661 +2000000 2001800 1.10033 3.49517 +2000000 2001800 1.10725 3.48497 +2000000 2001800 1.13176 3.46857 +2000000 2001800 1.11183 3.52759 +2000000 2001800 1.12338 3.41028 +2000000 2001800 1.0625 3.4078 +3000000 3001800 1.61675 5.23394 +3000000 3001800 1.76362 5.39348 +3000000 3001800 1.70443 5.38821 +3000000 3001800 1.79035 5.44008 +3000000 3001800 1.79136 5.56954 +3000000 3001800 1.7848 5.48245 +3000000 3001800 1.7496 5.512 +3000000 3001800 1.72438 5.4148 +3000000 3001800 1.65999 5.21928 +3000000 3001800 1.59595 4.85017 +10000000 10001800 5.66762 17.7623 +10000000 10001800 5.35138 17.0192 +10000000 10001800 5.6751 17.2393 +10000000 10001800 5.67143 16.4106 +10000000 10001800 5.66773 17.6798 +10000000 10001800 5.63388 16.511 +10000000 10001800 5.64777 17.7845 +10000000 10001800 5.57198 16.1655 +10000000 10001800 5.58956 17.3209 +10000000 10001800 5.61045 16.1997 +20000000 20001800 11.2896 33.2624 +20000000 20001800 10.8629 32.7729 +20000000 20001800 10.6456 32.64 +20000000 20001800 10.7267 32.7883 +20000000 20001800 10.7952 33.4828 +20000000 20001800 10.8942 33.3988 +20000000 20001800 11.1634 33.8661 +20000000 20001800 10.8488 32.7967 +20000000 20001800 10.805 32.5927 +20000000 20001800 10.6542 33.3069 +30000000 30001800 16.8741 51.2028 +30000000 30001800 16.4561 50.1288 +30000000 30001800 16.031 51.1833 +30000000 30001800 16.4791 51.4586 +30000000 30001800 16.5506 49.4669 +30000000 30001800 16.4287 50.4364 +30000000 30001800 17.0067 51.1537 +30000000 30001800 16.4827 51.8852 +30000000 30001800 17.0735 51.4021 +30000000 30001800 16.1387 51.3036 diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-polygonal-schema.gnuplot b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-polygonal-schema.gnuplot new file mode 100644 index 00000000000..f9ec0757680 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-polygonal-schema.gnuplot @@ -0,0 +1,32 @@ +# set terminal postscript eps color 20 lw 3 +# set output '| epstopdf -f -o=computation-time-polygonal-schema.pdf' + +set terminal svg fname 'Verdana' lw 2 # size 640 480 fname 'Verdana' lw 3 +set output 'computation-time-polygonal-schema.svg' + +set key autotitle columnheader + +set ylabel "Time (sec)" +set xlabel "Path lengths" +set key left + +# set xtics (0, '' 1, 2, 4, 8, 16, 32, 64) +# set ytics (4, 16, 64, 256, 1024, 4096, "16,384" 16384) + +# set logscale x 10 +# set logscale y 10 + +set xrange [0:62000000] +# set yrange [0:250] + +# set xtics ('5,000,000' 5000000, '10,000,000' 10000000, '15,000,000' 15000000, '20,000,000' 20000000, '25,000,000' 25000000, '30,000,000' 30000000) +set xtics ('10,000,000' 10000000, '20,000,000' 20000000, '30,000,000' 30000000, '40,000,000' 40000000, '50,000,000' 50000000, '60,000,000' 60000000) + +# set auto x + +FIT_LIMIT=1.e-14 +f(x) = m*x + b +fit f(x) 'computation-time-polygonal-schema.dat' using ($1+$2):4 via m,b + +plot 'computation-time-polygonal-schema.dat' using ($1+$2):4 with points title "Homotopy test", f(x) title 'Model Fit' + diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-reduce-surface.dat b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-reduce-surface.dat new file mode 100644 index 00000000000..56251b6bf15 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-reduce-surface.dat @@ -0,0 +1,40 @@ +# ==========#INITIAL-MAP========== ==========#REDUCED-MAP======== +#darts #vertices #edges #faces #darts #vertices #edges #faces GlobalTime +12023616 2003932 6011808 4007872 24 2 12 6 13.5703 +5296164 882954 2648082 1765388 13112 3538 6556 3278 5.37898 +8012604 1335436 4006302 2670868 0 0 0 0 4.72275 +205662 33871 102831 68554 1632 2 816 408 0.154715 +334926 55617 167463 111642 824 2 412 206 0.284387 +310740 50528 155370 103580 5056 2 2528 1264 0.290279 +172800 28564 86400 57600 952 2 476 238 0.137383 +694992 115612 347496 231664 888 2 444 222 0.67383 +3298422 548955 1649211 1099474 3136 2 1568 784 3.14391 +16326 2491 8163 5442 928 2 464 232 0.006399 +38292 5488 19146 12764 3584 2 1792 896 0.018229 +11532 1684 5766 3844 960 2 480 240 0.004556 +16188 2460 8094 5396 960 2 480 240 0.006134 +1037988 172466 518994 345996 2136 2 1068 534 0.987253 +97644 15520 48822 32548 3024 2 1512 756 0.061761 +9186 1311 4593 3062 888 2 444 222 0.004214 +11520 1608 5760 3840 1256 2 628 314 0.00465 +29676 4716 14838 9892 928 2 464 232 0.013347 +334212 55498 167106 111404 824 2 412 206 0.276585 +197493 33955 100736 65831 2594 211 1297 690 0.148973 +11079 1687 5650 3693 892 5 446 203 0.004537 +321591 55737 164019 107197 3050 367 1525 956 0.275295 +298413 50589 152202 99471 5672 161 2836 1413 0.267131 +165912 28588 84592 55304 1742 90 871 545 0.140701 +667356 115730 340370 222452 5712 638 2856 1998 0.659971 +3167334 549481 1615459 1055778 26678 3121 13339 9436 3.25409 +15681 2493 7993 5227 880 9 440 201 0.006591 +36780 5494 18750 12260 3372 19 1686 775 0.020382 +15555 2468 7932 5185 948 13 474 225 0.006666 +996714 172645 508357 332238 9820 1247 4910 3131 1.02332 +93777 15548 47826 31259 3200 61 1600 787 0.061693 +8826 1315 4501 2942 822 7 411 186 0.003816 +11064 1614 5646 3688 1146 4 573 257 0.004506 +28500 4727 14534 9500 918 20 459 211 0.011759 +320889 55616 163663 106963 3042 362 1521 959 0.276335 +3263148 543652 1631574 1087716 832 2 416 208 3.54039 +2110536 351750 1055268 703512 32 2 16 8 2.03018 +30000000 4999996 15000000 10000000 24 2 12 6 33.841 diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-reduce-surface.gnuplot b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-reduce-surface.gnuplot new file mode 100644 index 00000000000..52a7ecebf07 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/computation-time-reduce-surface.gnuplot @@ -0,0 +1,37 @@ +# set terminal postscript eps color 20 lw 3 +# set output '| epstopdf -f -o=computation-time-reduce-surface.pdf' + +set terminal svg fname 'Verdana' lw 2 # size 640 480 fname 'Verdana' lw 3 +set output 'computation-time-reduce-surface.svg' + +set key autotitle columnheader + +set ylabel "Time (sec)" +set xlabel "#Darts" +set key left + +# set xtics (0, '' 1, 2, 4, 8, 16, 32, 64) +#set ytics (0, 30, 60, 90, 120, 150, 180,200) + +set xrange [0:30500000] +set yrange [0:35] +# set auto y + +# set logscale x +# set logscale y + +# set xtics ('5,000,000' 5000000, '12,000,000' 12000000, '19,000,000' 19000000, '26,000,000' 26000000, ) +# set xtics ('5,000,000' 5000000, '11,000,000' 11000000, '17,000,000' 17000000, '23,000,000' 23000000, '29,000,000' 29000000 ) +set xtics ('5,000,000' 5000000, '10,000,000' 10000000, '15,000,000' 15000000, '20,000,000' 20000000, '25,000,000' 25000000, '30,000,000' 30000000 ) + +# set auto x +set format x '%.0f' + +FIT_LIMIT=1.e-14 +# f(x) = a*x**2 + b*x + c +f(x) = a*x + b +fit f(x) 'computation-time-reduce-surface.dat' using 1:9 via a,b +# fit f(x) 'computation-time-reduce-surface.dat' using (log($1)):(log($9)) via a,b + +plot 'computation-time-reduce-surface.dat' using 1:9 with points title "Reduce surface computation", f(x) title 'Model Fit' + diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/plot-res.py b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/plot-res.py new file mode 100644 index 00000000000..efb4c2770af --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/plot-res.py @@ -0,0 +1,46 @@ +import matplotlib.pyplot as plt +import numpy as np +# exec(open("./plot-res.py").read()) + +x = [10, 10, 10, 20, 20, 20, 30, 30, 30, 100, 100, 100, 200, 200, 200, 300, 300, 300, 1000, 1000, 1000, 2000, 2000, 2000, 3000, 3000, 3000, 10000, 10000, 10000, 20000, 20000, 20000, 30000, 30000, 30000, 100000, 100000, 100000, 200000, 200000, 200000, 300000, 300000, 300000, 1000000, 1000000, 1000000, 2000000, 2000000, 2000000, 3000000, 3000000, 3000000, 10000000, 10000000, 10000000, 20000000, 20000000, 20000000, 30000000, 30000000, 30000000] + +y_nfh = [3e-05, 2.8e-05, 4.1e-05, +5e-05, 3.1e-05, 3.3e-05, +4.8e-05, 3.9e-05, 4.2e-05, +0, 0.000141, 0.000107, +0.000285, 0.000289, 0.000213, +0.000349, 0.000333, 0.000334, +0, 0.001847, 0.001052, +0.002631, 0.001751, 0.002106, +0.003527, 0.003165, 0.003182, +0.010599, 0.010524, 0.010555, +0.021093, 0.020575, 0.020579, +0.032026, 0.032009, 0.032175, +0.10946, 0.108055, 0.107969, +0.219881, 0.22562, 0.220325, +0.337536, 0.329134, 0.333249, +1.10841, 1.16317, 1.14465, +2.35853, 2.2348, 2.33958, +3.53096, 3.4077, 3.30577, +10.9284, 11.0523, 11.0834, +22.0406, 22.0634, 22.368, +33.8717, 34.2746, 33.8732] + + +col_pts = '#9400d3' +col_line = '#009e73' +# log-log plot +#plt.plot(x[0:63], y_nfh[0:63], 'b+') +plt.plot(x[0:63], y_nfh[0:63], linestyle = 'None', color = col_pts, marker='+') +# plt.plot(x[0:63], y_fh[0:63], 'ro') +# plt.plot(x[0:63], y_c[0:63], 'g+') +plt.xscale('log') +plt.yscale('log') +plt.xlabel('log(path length)') +plt.ylabel('log(time in sec.)') +plt.plot([x[0],x[62]],[1.5e-05,y_nfh[62]], color = col_line) +# plt.plot([x[0],x[62]],[y_fh[0],y_fh[62]], 'r') +# plt.plot([x[0],x[62]],[y_c[0],y_c[62]], 'g') +# plt.title('Random paths on the canonical reduced genus 5 surface') +plt.grid(False) +plt.show() diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-path-homotopy.txt b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-path-homotopy.txt new file mode 100644 index 00000000000..9e56218b382 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-path-homotopy.txt @@ -0,0 +1,616 @@ +Initial map: #Darts=3263148, #0-cells=543652, #1-cells=1631574, #2-cells=1087716, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 1.30931 seconds +[TIME] Simplification in one face: 1.52864 seconds +[TIME] Face quadrangulation: 0.334481 seconds +[TIME] Total time for computation of reduced map: 3.18527 seconds +Reduced map: #Darts=832, #0-cells=2, #1-cells=416, #2-cells=208, #ccs=1, valid=1 +Random seed: 1574945952: Path1 size: 1524414 (from 2360 darts); Path2 size: 1530418 (from 6004 deformations). +[TIME] is_contractible: 3.86554 seconds +[TIME] are_freely_homotopic: 7.8444 seconds +Random seed: 1524412294: Path1 size: 1049124 (from 6814 darts); Path2 size: 1050087 (from 963 deformations). +[TIME] is_contractible: 2.83135 seconds +[TIME] are_freely_homotopic: 5.60931 seconds +Random seed: 1903401680: Path1 size: 2509006 (from 1122 darts); Path2 size: 2513362 (from 4356 deformations). +[TIME] is_contractible: 6.13668 seconds +[TIME] are_freely_homotopic: 12.624 seconds +Random seed: 931857252: Path1 size: 2224823 (from 5500 darts); Path2 size: 2232443 (from 7620 deformations). +[TIME] is_contractible: 5.40251 seconds +[TIME] are_freely_homotopic: 10.484 seconds +Random seed: 1094439597: Path1 size: 1008888 (from 4919 darts); Path2 size: 1018619 (from 9731 deformations). +[TIME] is_contractible: 2.38837 seconds +[TIME] are_freely_homotopic: 4.79886 seconds +Random seed: 74268877: Path1 size: 1332065 (from 2814 darts); Path2 size: 1339611 (from 7546 deformations). +[TIME] is_contractible: 3.22555 seconds +[TIME] are_freely_homotopic: 6.41267 seconds +Random seed: 1179101070: Path1 size: 3561764 (from 608 darts); Path2 size: 3562141 (from 377 deformations). +[TIME] is_contractible: 8.05207 seconds +[TIME] are_freely_homotopic: 16.0708 seconds +Random seed: 1456908315: Path1 size: 2438898 (from 7785 darts); Path2 size: 2442370 (from 3472 deformations). +[TIME] is_contractible: 5.71337 seconds +[TIME] are_freely_homotopic: 11.477 seconds +Random seed: 1499814407: Path1 size: 1914057 (from 668 darts); Path2 size: 1919940 (from 5883 deformations). +[TIME] is_contractible: 4.77898 seconds +[TIME] are_freely_homotopic: 9.59951 seconds +Random seed: 578744460: Path1 size: 2551120 (from 5048 darts); Path2 size: 2555476 (from 4356 deformations). +[TIME] is_contractible: 6.3078 seconds +[TIME] are_freely_homotopic: 12.6345 seconds +Random seed: 213254128: Path1 size: 64526 (from 8013 darts); Path2 size: 70685 (from 6159 deformations). +[TIME] is_contractible: 0.173418 seconds +[TIME] are_freely_homotopic: 0.361924 seconds +Random seed: 1775095594: Path1 size: 492594 (from 4092 darts); Path2 size: 498396 (from 5802 deformations). +[TIME] is_contractible: 1.26223 seconds +[TIME] are_freely_homotopic: 2.53348 seconds +Random seed: 1876630085: Path1 size: 571858 (from 5582 darts); Path2 size: 580868 (from 9010 deformations). +[TIME] is_contractible: 1.37788 seconds +[TIME] are_freely_homotopic: 2.7772 seconds +Random seed: 1560969122: Path1 size: 38840 (from 990 darts); Path2 size: 43934 (from 5094 deformations). +[TIME] is_contractible: 0.095079 seconds +[TIME] are_freely_homotopic: 0.203706 seconds +Random seed: 810569075: Path1 size: 15721 (from 6097 darts); Path2 size: 22405 (from 6684 deformations). +[TIME] is_contractible: 0.052084 seconds +[TIME] are_freely_homotopic: 0.12308 seconds +Random seed: 1388546522: Path1 size: 9948224 (from 3167 darts); Path2 size: 9954782 (from 6558 deformations). +[TIME] is_contractible: 23.2806 seconds +[TIME] are_freely_homotopic: 46.5412 seconds +Random seed: 740365847: Path1 size: 1122183 (from 6018 darts); Path2 size: 1126957 (from 4774 deformations). +[TIME] is_contractible: 2.45848 seconds +[TIME] are_freely_homotopic: 4.81015 seconds +Random seed: 1751524586: Path1 size: 1459662 (from 9345 darts); Path2 size: 1462867 (from 3205 deformations). +[TIME] is_contractible: 3.35651 seconds +[TIME] are_freely_homotopic: 6.8351 seconds +Random seed: 1549068120: Path1 size: 1329962 (from 5701 darts); Path2 size: 1333900 (from 3938 deformations). +[TIME] is_contractible: 3.47501 seconds +[TIME] are_freely_homotopic: 7.01742 seconds +Random seed: 201033949: Path1 size: 117030 (from 2125 darts); Path2 size: 123624 (from 6594 deformations). +[TIME] is_contractible: 0.265891 seconds +[TIME] are_freely_homotopic: 0.552161 seconds +Random seed: 877874983: Path1 size: 1047344 (from 5741 darts); Path2 size: 1054974 (from 7630 deformations). +[TIME] is_contractible: 2.62549 seconds +[TIME] are_freely_homotopic: 5.27579 seconds +Random seed: 133416294: Path1 size: 6539021 (from 2842 darts); Path2 size: 6542800 (from 3779 deformations). +[TIME] is_contractible: 15.1482 seconds +[TIME] are_freely_homotopic: 29.9774 seconds +Random seed: 769183546: Path1 size: 380967 (from 5195 darts); Path2 size: 385239 (from 4272 deformations). +[TIME] is_contractible: 0.911951 seconds +[TIME] are_freely_homotopic: 1.78487 seconds +Random seed: 1860083912: Path1 size: 41353 (from 8398 darts); Path2 size: 50077 (from 8724 deformations). +[TIME] is_contractible: 0.115257 seconds +[TIME] are_freely_homotopic: 0.254276 seconds +Random seed: 1552388394: Path1 size: 3898884 (from 9652 darts); Path2 size: 3908780 (from 9896 deformations). +[TIME] is_contractible: 8.92204 seconds +[TIME] are_freely_homotopic: 18.0542 seconds +Random seed: 394269490: Path1 size: 558908 (from 7487 darts); Path2 size: 563296 (from 4388 deformations). +[TIME] is_contractible: 1.44482 seconds +[TIME] are_freely_homotopic: 2.89175 seconds +Random seed: 608779364: Path1 size: 4623570 (from 4581 darts); Path2 size: 4623770 (from 200 deformations). +[TIME] is_contractible: 12.0801 seconds +[TIME] are_freely_homotopic: 23.8146 seconds +Random seed: 1391080840: Path1 size: 2627660 (from 6099 darts); Path2 size: 2633041 (from 5381 deformations). +[TIME] is_contractible: 6.63529 seconds +[TIME] are_freely_homotopic: 13.3076 seconds +Random seed: 1692836185: Path1 size: 312744 (from 2352 darts); Path2 size: 313066 (from 322 deformations). +[TIME] is_contractible: 0.820126 seconds +[TIME] are_freely_homotopic: 1.65689 seconds +Random seed: 118535817: Path1 size: 33012 (from 886 darts); Path2 size: 34720 (from 1708 deformations). +[TIME] is_contractible: 0.108203 seconds +[TIME] are_freely_homotopic: 0.230179 seconds +Random seed: 1014624509: Path1 size: 5128852 (from 5834 darts); Path2 size: 5133062 (from 4210 deformations). +[TIME] is_contractible: 11.6124 seconds +[TIME] are_freely_homotopic: 23.6011 seconds +Random seed: 914741513: Path1 size: 8652 (from 669 darts); Path2 size: 11181 (from 2529 deformations). +[TIME] is_contractible: 0.026449 seconds +[TIME] are_freely_homotopic: 0.060392 seconds +Random seed: 479844977: Path1 size: 90040 (from 8608 darts); Path2 size: 90840 (from 800 deformations). +[TIME] is_contractible: 0.216791 seconds +[TIME] are_freely_homotopic: 0.433557 seconds +Random seed: 2020930182: Path1 size: 325686 (from 8905 darts); Path2 size: 327807 (from 2121 deformations). +[TIME] is_contractible: 0.873464 seconds +[TIME] are_freely_homotopic: 1.75005 seconds +Random seed: 937146605: Path1 size: 4408 (from 2389 darts); Path2 size: 4618 (from 210 deformations). +[TIME] is_contractible: 0.01283 seconds +[TIME] are_freely_homotopic: 0.026318 seconds +Random seed: 1300363106: Path1 size: 2047709 (from 2988 darts); Path2 size: 2051939 (from 4230 deformations). +[TIME] is_contractible: 5.35872 seconds +[TIME] are_freely_homotopic: 10.6866 seconds +Random seed: 1805470009: Path1 size: 2929154 (from 5735 darts); Path2 size: 2934675 (from 5521 deformations). +[TIME] is_contractible: 7.39593 seconds +[TIME] are_freely_homotopic: 14.586 seconds +Random seed: 97004012: Path1 size: 2287508 (from 6025 darts); Path2 size: 2290644 (from 3136 deformations). +[TIME] is_contractible: 5.55511 seconds +[TIME] are_freely_homotopic: 10.9367 seconds +Random seed: 1757477495: Path1 size: 20056 (from 8513 darts); Path2 size: 25590 (from 5534 deformations). +[TIME] is_contractible: 0.061392 seconds +[TIME] are_freely_homotopic: 0.135105 seconds +Random seed: 579366743: Path1 size: 12729 (from 1759 darts); Path2 size: 18273 (from 5544 deformations). +[TIME] is_contractible: 0.025678 seconds +[TIME] are_freely_homotopic: 0.061112 seconds +Random seed: 2110856968: Path1 size: 8756 (from 7872 darts); Path2 size: 11625 (from 2869 deformations). +[TIME] is_contractible: 0.028232 seconds +[TIME] are_freely_homotopic: 0.066159 seconds +Random seed: 2017033362: Path1 size: 1133402 (from 6797 darts); Path2 size: 1141097 (from 7695 deformations). +[TIME] is_contractible: 2.82907 seconds +[TIME] are_freely_homotopic: 5.799 seconds +Random seed: 1781133485: Path1 size: 887726 (from 8278 darts); Path2 size: 891707 (from 3981 deformations). +[TIME] is_contractible: 2.14112 seconds +[TIME] are_freely_homotopic: 4.27661 seconds +Random seed: 2079943689: Path1 size: 190541 (from 1912 darts); Path2 size: 196368 (from 5827 deformations). +[TIME] is_contractible: 0.443466 seconds +[TIME] are_freely_homotopic: 0.889504 seconds +Random seed: 357050911: Path1 size: 784656 (from 8912 darts); Path2 size: 793928 (from 9272 deformations). +[TIME] is_contractible: 1.94601 seconds +[TIME] are_freely_homotopic: 3.97098 seconds +Random seed: 1204070003: Path1 size: 27886 (from 1541 darts); Path2 size: 35939 (from 8053 deformations). +[TIME] is_contractible: 0.093204 seconds +[TIME] are_freely_homotopic: 0.205428 seconds +Random seed: 10590152: Path1 size: 166193 (from 8654 darts); Path2 size: 174683 (from 8490 deformations). +[TIME] is_contractible: 0.481829 seconds +[TIME] are_freely_homotopic: 0.959715 seconds +Random seed: 1213655585: Path1 size: 1634955 (from 8188 darts); Path2 size: 1637981 (from 3026 deformations). +[TIME] is_contractible: 4.05175 seconds +[TIME] are_freely_homotopic: 8.12494 seconds +Random seed: 102340164: Path1 size: 786667 (from 4193 darts); Path2 size: 787481 (from 814 deformations). +[TIME] is_contractible: 2.16864 seconds +[TIME] are_freely_homotopic: 4.30371 seconds +Random seed: 65018470: Path1 size: 3058683 (from 7145 darts); Path2 size: 3066220 (from 7537 deformations). +[TIME] is_contractible: 7.43228 seconds +[TIME] are_freely_homotopic: 14.9763 seconds +Random seed: 893839509: Path1 size: 853145 (from 3620 darts); Path2 size: 854664 (from 1519 deformations). +[TIME] is_contractible: 1.91083 seconds +[TIME] are_freely_homotopic: 3.84597 seconds +Random seed: 626858492: Path1 size: 915736 (from 6468 darts); Path2 size: 924315 (from 8579 deformations). +[TIME] is_contractible: 2.21234 seconds +[TIME] are_freely_homotopic: 4.46275 seconds +Random seed: 1473957125: Path1 size: 2064414 (from 7316 darts); Path2 size: 2068788 (from 4374 deformations). +[TIME] is_contractible: 4.54639 seconds +[TIME] are_freely_homotopic: 9.07704 seconds +Random seed: 2097455431: Path1 size: 1498675 (from 6125 darts); Path2 size: 1506208 (from 7533 deformations). +[TIME] is_contractible: 3.47994 seconds +[TIME] are_freely_homotopic: 7.0999 seconds +Random seed: 1805351056: Path1 size: 11465 (from 4255 darts); Path2 size: 13867 (from 2402 deformations). +[TIME] is_contractible: 0.034742 seconds +[TIME] are_freely_homotopic: 0.074569 seconds +Random seed: 1551039656: Path1 size: 1500 (from 409 darts); Path2 size: 5543 (from 4043 deformations). +[TIME] is_contractible: 0.004261 seconds +[TIME] are_freely_homotopic: 0.019447 seconds +Random seed: 731201525: Path1 size: 1460356 (from 7083 darts); Path2 size: 1465976 (from 5620 deformations). +[TIME] is_contractible: 3.44903 seconds +[TIME] are_freely_homotopic: 6.99999 seconds +Random seed: 1336172401: Path1 size: 3918177 (from 892 darts); Path2 size: 3922313 (from 4136 deformations). +[TIME] is_contractible: 9.90904 seconds +[TIME] are_freely_homotopic: 19.7113 seconds +Random seed: 1754013662: Path1 size: 155505 (from 1567 darts); Path2 size: 159968 (from 4463 deformations). +[TIME] is_contractible: 0.419477 seconds +[TIME] are_freely_homotopic: 0.853855 seconds +Random seed: 1440167577: Path1 size: 5997 (from 4228 darts); Path2 size: 12540 (from 6543 deformations). +[TIME] is_contractible: 0.012746 seconds +[TIME] are_freely_homotopic: 0.037545 seconds +Random seed: 1364584180: Path1 size: 7791265 (from 6393 darts); Path2 size: 7796654 (from 5389 deformations). +[TIME] is_contractible: 18.2438 seconds +[TIME] are_freely_homotopic: 36.3007 seconds +Random seed: 1410381909: Path1 size: 3017926 (from 7754 darts); Path2 size: 3020885 (from 2959 deformations). +[TIME] is_contractible: 7.27202 seconds +[TIME] are_freely_homotopic: 14.4281 seconds +Random seed: 1030767246: Path1 size: 2253 (from 1448 darts); Path2 size: 11462 (from 9209 deformations). +[TIME] is_contractible: 0.007446 seconds +[TIME] are_freely_homotopic: 0.043296 seconds +Random seed: 913511814: Path1 size: 1344480 (from 8696 darts); Path2 size: 1349288 (from 4808 deformations). +[TIME] is_contractible: 3.13805 seconds +[TIME] are_freely_homotopic: 6.35775 seconds +Random seed: 1423693671: Path1 size: 218100 (from 3471 darts); Path2 size: 226787 (from 8687 deformations). +[TIME] is_contractible: 0.468398 seconds +[TIME] are_freely_homotopic: 0.96952 seconds +Random seed: 1075956758: Path1 size: 19859 (from 3815 darts); Path2 size: 25206 (from 5347 deformations). +[TIME] is_contractible: 0.061167 seconds +[TIME] are_freely_homotopic: 0.136706 seconds +Random seed: 700728023: Path1 size: 1570055 (from 7862 darts); Path2 size: 1572437 (from 2382 deformations). +[TIME] is_contractible: 3.70686 seconds +[TIME] are_freely_homotopic: 7.42759 seconds +Random seed: 1888402334: Path1 size: 1147928 (from 9424 darts); Path2 size: 1157287 (from 9359 deformations). +[TIME] is_contractible: 3.11372 seconds +[TIME] are_freely_homotopic: 6.27166 seconds +Random seed: 1037308229: Path1 size: 4267 (from 3909 darts); Path2 size: 12199 (from 7932 deformations). +[TIME] is_contractible: 0.013633 seconds +[TIME] are_freely_homotopic: 0.05177 seconds +Random seed: 1003878652: Path1 size: 794927 (from 2148 darts); Path2 size: 804905 (from 9978 deformations). +[TIME] is_contractible: 1.94774 seconds +[TIME] are_freely_homotopic: 3.91127 seconds +Random seed: 502871283: Path1 size: 3118323 (from 4987 darts); Path2 size: 3123949 (from 5626 deformations). +[TIME] is_contractible: 7.4862 seconds +[TIME] are_freely_homotopic: 14.8817 seconds +Random seed: 99745040: Path1 size: 345935 (from 7916 darts); Path2 size: 348709 (from 2774 deformations). +[TIME] is_contractible: 0.961987 seconds +[TIME] are_freely_homotopic: 1.93947 seconds +Random seed: 1085969316: Path1 size: 5251784 (from 2720 darts); Path2 size: 5257377 (from 5593 deformations). +[TIME] is_contractible: 12.0356 seconds +[TIME] are_freely_homotopic: 24.3891 seconds +Random seed: 1029892736: Path1 size: 425488 (from 7321 darts); Path2 size: 434411 (from 8923 deformations). +[TIME] is_contractible: 1.0689 seconds +[TIME] are_freely_homotopic: 2.21017 seconds +Random seed: 1434221472: Path1 size: 1025760 (from 5393 darts); Path2 size: 1033772 (from 8012 deformations). +[TIME] is_contractible: 2.47379 seconds +[TIME] are_freely_homotopic: 4.96134 seconds +Random seed: 1260354135: Path1 size: 2667536 (from 8426 darts); Path2 size: 2670807 (from 3271 deformations). +[TIME] is_contractible: 5.99514 seconds +[TIME] are_freely_homotopic: 12.1269 seconds +Random seed: 410552450: Path1 size: 1020 (from 1008 darts); Path2 size: 10923 (from 9903 deformations). +[TIME] is_contractible: 0.003334 seconds +[TIME] are_freely_homotopic: 0.03613 seconds +Random seed: 416264188: Path1 size: 41545 (from 2286 darts); Path2 size: 47295 (from 5750 deformations). +[TIME] is_contractible: 0.13632 seconds +[TIME] are_freely_homotopic: 0.285656 seconds +Random seed: 950597358: Path1 size: 1586593 (from 5366 darts); Path2 size: 1595375 (from 8782 deformations). +[TIME] is_contractible: 3.89181 seconds +[TIME] are_freely_homotopic: 7.88352 seconds +Random seed: 1698189675: Path1 size: 2356504 (from 2396 darts); Path2 size: 2366079 (from 9575 deformations). +[TIME] is_contractible: 5.84226 seconds +[TIME] are_freely_homotopic: 11.6113 seconds +Random seed: 60202036: Path1 size: 698817 (from 2511 darts); Path2 size: 703240 (from 4423 deformations). +[TIME] is_contractible: 1.81419 seconds +[TIME] are_freely_homotopic: 3.64923 seconds +Random seed: 1487242723: Path1 size: 1498299 (from 3976 darts); Path2 size: 1501573 (from 3274 deformations). +[TIME] is_contractible: 3.70302 seconds +[TIME] are_freely_homotopic: 7.44321 seconds +Random seed: 719861449: Path1 size: 70491 (from 2990 darts); Path2 size: 78080 (from 7589 deformations). +[TIME] is_contractible: 0.208676 seconds +[TIME] are_freely_homotopic: 0.436235 seconds +Random seed: 633605317: Path1 size: 3205404 (from 2101 darts); Path2 size: 3213809 (from 8405 deformations). +[TIME] is_contractible: 7.6062 seconds +[TIME] are_freely_homotopic: 15.2643 seconds +Random seed: 2142556750: Path1 size: 137069 (from 9018 darts); Path2 size: 143418 (from 6349 deformations). +[TIME] is_contractible: 0.331668 seconds +[TIME] are_freely_homotopic: 0.684771 seconds +Random seed: 1424644563: Path1 size: 185021 (from 7786 darts); Path2 size: 193489 (from 8468 deformations). +[TIME] is_contractible: 0.456013 seconds +[TIME] are_freely_homotopic: 0.94372 seconds +Random seed: 909840399: Path1 size: 10514 (from 8703 darts); Path2 size: 14184 (from 3670 deformations). +[TIME] is_contractible: 0.03405 seconds +[TIME] are_freely_homotopic: 0.079866 seconds +Random seed: 252496923: Path1 size: 258978 (from 9472 darts); Path2 size: 263450 (from 4472 deformations). +[TIME] is_contractible: 0.654929 seconds +[TIME] are_freely_homotopic: 1.31629 seconds +Random seed: 955673551: Path1 size: 188212 (from 7173 darts); Path2 size: 189028 (from 816 deformations). +[TIME] is_contractible: 0.572463 seconds +[TIME] are_freely_homotopic: 1.14209 seconds +Random seed: 370735399: Path1 size: 1655535 (from 6465 darts); Path2 size: 1659255 (from 3720 deformations). +[TIME] is_contractible: 4.05374 seconds +[TIME] are_freely_homotopic: 8.14516 seconds +Random seed: 1742530242: Path1 size: 20552 (from 9202 darts); Path2 size: 29551 (from 8999 deformations). +[TIME] is_contractible: 0.046739 seconds +[TIME] are_freely_homotopic: 0.113477 seconds +Random seed: 1526231623: Path1 size: 6858 (from 5474 darts); Path2 size: 12047 (from 5189 deformations). +[TIME] is_contractible: 0.022151 seconds +[TIME] are_freely_homotopic: 0.059419 seconds +Random seed: 558603143: Path1 size: 231344 (from 6082 darts); Path2 size: 234092 (from 2748 deformations). +[TIME] is_contractible: 0.522525 seconds +[TIME] are_freely_homotopic: 1.05193 seconds +Random seed: 99045425: Path1 size: 277089 (from 7346 darts); Path2 size: 283900 (from 6811 deformations). +[TIME] is_contractible: 0.668141 seconds +[TIME] are_freely_homotopic: 1.3473 seconds +Random seed: 108772769: Path1 size: 1421926 (from 5611 darts); Path2 size: 1428857 (from 6931 deformations). +[TIME] is_contractible: 3.38821 seconds +[TIME] are_freely_homotopic: 6.82178 seconds +Random seed: 1727722322: Path1 size: 6803208 (from 6951 darts); Path2 size: 6804143 (from 935 deformations). +[TIME] is_contractible: 15.5407 seconds +[TIME] are_freely_homotopic: 31.2071 seconds +Random seed: 1334752652: Path1 size: 4341787 (from 4783 darts); Path2 size: 4342468 (from 681 deformations). +[TIME] is_contractible: 10.8756 seconds +[TIME] are_freely_homotopic: 21.6696 seconds +Random seed: 1817691772: Path1 size: 9820 (from 2429 darts); Path2 size: 11913 (from 2093 deformations). +[TIME] is_contractible: 0.024156 seconds +[TIME] are_freely_homotopic: 0.051882 seconds +Random seed: 905432892: Path1 size: 488145 (from 4710 darts); Path2 size: 491953 (from 3808 deformations). +[TIME] is_contractible: 1.09079 seconds +[TIME] are_freely_homotopic: 2.19668 seconds +Random seed: 1958519057: Path1 size: 193168 (from 3581 darts); Path2 size: 202125 (from 8957 deformations). +[TIME] is_contractible: 0.505617 seconds +[TIME] are_freely_homotopic: 1.0208 seconds +All the 100 tests OK: each pair of paths were homotopic. +Number of contractible paths: 13 among 100 (i.e. 13%). +Initial map: #Darts=334212, #0-cells=55498, #1-cells=167106, #2-cells=111404, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 0.110389 seconds +[TIME] Simplification in one face: 0.150956 seconds +[TIME] Face quadrangulation: 0.032417 seconds +[TIME] Total time for computation of reduced map: 0.295167 seconds +Reduced map: #Darts=824, #0-cells=2, #1-cells=412, #2-cells=206, #ccs=1, valid=1 +Random seed: 1574949942: Path1 size: 134408 (from 5488 darts); Path2 size: 144351 (from 9943 deformations). +[TIME] is_contractible: 0.269846 seconds +[TIME] are_freely_homotopic: 0.569942 seconds +Random seed: 50530994: Path1 size: 72262 (from 2783 darts); Path2 size: 76189 (from 3927 deformations). +[TIME] is_contractible: 0.158625 seconds +[TIME] are_freely_homotopic: 0.328027 seconds +Random seed: 247847864: Path1 size: 1163327 (from 3144 darts); Path2 size: 1167912 (from 4585 deformations). +[TIME] is_contractible: 2.53666 seconds +[TIME] are_freely_homotopic: 5.09627 seconds +Random seed: 706313880: Path1 size: 95971 (from 3672 darts); Path2 size: 101468 (from 5497 deformations). +[TIME] is_contractible: 0.22881 seconds +[TIME] are_freely_homotopic: 0.477161 seconds +Random seed: 188201654: Path1 size: 94754 (from 5181 darts); Path2 size: 98378 (from 3624 deformations). +[TIME] is_contractible: 0.248858 seconds +[TIME] are_freely_homotopic: 0.51487 seconds +Random seed: 83309156: Path1 size: 1619634 (from 6552 darts); Path2 size: 1626306 (from 6672 deformations). +[TIME] is_contractible: 3.6389 seconds +[TIME] are_freely_homotopic: 7.25762 seconds +Random seed: 1017839793: Path1 size: 1919 (from 351 darts); Path2 size: 8130 (from 6211 deformations). +[TIME] is_contractible: 0.00373 seconds +[TIME] are_freely_homotopic: 0.018792 seconds +Random seed: 886255421: Path1 size: 169566 (from 2780 darts); Path2 size: 169802 (from 236 deformations). +[TIME] is_contractible: 0.375949 seconds +[TIME] are_freely_homotopic: 0.766477 seconds +Random seed: 397789418: Path1 size: 52578 (from 4552 darts); Path2 size: 59065 (from 6487 deformations). +[TIME] is_contractible: 0.119055 seconds +[TIME] are_freely_homotopic: 0.25467 seconds +Random seed: 1668607722: Path1 size: 327514 (from 2421 darts); Path2 size: 327939 (from 425 deformations). +[TIME] is_contractible: 0.652794 seconds +[TIME] are_freely_homotopic: 1.42988 seconds +Random seed: 1358200861: Path1 size: 146008 (from 9387 darts); Path2 size: 155458 (from 9450 deformations). +[TIME] is_contractible: 0.305657 seconds +[TIME] are_freely_homotopic: 0.660986 seconds +Random seed: 910744256: Path1 size: 590498 (from 8933 darts); Path2 size: 596057 (from 5559 deformations). +[TIME] is_contractible: 1.32982 seconds +[TIME] are_freely_homotopic: 2.69134 seconds +Random seed: 1899095530: Path1 size: 144709 (from 8770 darts); Path2 size: 145509 (from 800 deformations). +[TIME] is_contractible: 0.372597 seconds +[TIME] are_freely_homotopic: 0.744431 seconds +Random seed: 2092349574: Path1 size: 49839 (from 4600 darts); Path2 size: 52970 (from 3131 deformations). +[TIME] is_contractible: 0.11164 seconds +[TIME] are_freely_homotopic: 0.229819 seconds +Random seed: 267040898: Path1 size: 2257 (from 533 darts); Path2 size: 4753 (from 2496 deformations). +[TIME] is_contractible: 0.005862 seconds +[TIME] are_freely_homotopic: 0.018162 seconds +Random seed: 1683097682: Path1 size: 772205 (from 8790 darts); Path2 size: 779198 (from 6993 deformations). +[TIME] is_contractible: 1.68543 seconds +[TIME] are_freely_homotopic: 3.38799 seconds +Random seed: 1331152193: Path1 size: 209107 (from 4008 darts); Path2 size: 210069 (from 962 deformations). +[TIME] is_contractible: 0.512779 seconds +[TIME] are_freely_homotopic: 1.07825 seconds +Random seed: 233227286: Path1 size: 13950 (from 4723 darts); Path2 size: 19070 (from 5120 deformations). +[TIME] is_contractible: 0.044721 seconds +[TIME] are_freely_homotopic: 0.10062 seconds +Random seed: 564988137: Path1 size: 148524 (from 4960 darts); Path2 size: 156085 (from 7561 deformations). +[TIME] is_contractible: 0.361171 seconds +[TIME] are_freely_homotopic: 0.75974 seconds +Random seed: 1627703444: Path1 size: 15715 (from 187 darts); Path2 size: 20316 (from 4601 deformations). +[TIME] is_contractible: 0.038191 seconds +[TIME] are_freely_homotopic: 0.085281 seconds +Random seed: 519520541: Path1 size: 341581 (from 9181 darts); Path2 size: 344135 (from 2554 deformations). +[TIME] is_contractible: 0.828873 seconds +[TIME] are_freely_homotopic: 1.65824 seconds +Random seed: 824313550: Path1 size: 111707 (from 6305 darts); Path2 size: 114165 (from 2458 deformations). +[TIME] is_contractible: 0.296571 seconds +[TIME] are_freely_homotopic: 0.598192 seconds +Random seed: 1290684516: Path1 size: 285513 (from 797 darts); Path2 size: 291355 (from 5842 deformations). +[TIME] is_contractible: 0.605756 seconds +[TIME] are_freely_homotopic: 1.24273 seconds +Random seed: 326598709: Path1 size: 12753 (from 7482 darts); Path2 size: 17702 (from 4949 deformations). +[TIME] is_contractible: 0.024112 seconds +[TIME] are_freely_homotopic: 0.058651 seconds +Random seed: 2086734682: Path1 size: 261253 (from 1027 darts); Path2 size: 263576 (from 2323 deformations). +[TIME] is_contractible: 0.618294 seconds +[TIME] are_freely_homotopic: 1.25177 seconds +Random seed: 132606227: Path1 size: 18513 (from 7955 darts); Path2 size: 28416 (from 9903 deformations). +[TIME] is_contractible: 0.052058 seconds +[TIME] are_freely_homotopic: 0.130877 seconds +Random seed: 121475808: Path1 size: 158453 (from 7060 darts); Path2 size: 163209 (from 4756 deformations). +[TIME] is_contractible: 0.358461 seconds +[TIME] are_freely_homotopic: 0.750459 seconds +Random seed: 1769936895: Path1 size: 101060 (from 2871 darts); Path2 size: 103049 (from 1989 deformations). +[TIME] is_contractible: 0.281742 seconds +[TIME] are_freely_homotopic: 0.608572 seconds +Random seed: 2059751412: Path1 size: 19681 (from 3639 darts); Path2 size: 22059 (from 2378 deformations). +[TIME] is_contractible: 0.043818 seconds +[TIME] are_freely_homotopic: 0.09175 seconds +Random seed: 1990948225: Path1 size: 636056 (from 8889 darts); Path2 size: 637157 (from 1101 deformations). +[TIME] is_contractible: 1.43374 seconds +[TIME] are_freely_homotopic: 2.91012 seconds +Random seed: 1730451011: Path1 size: 26136 (from 9419 darts); Path2 size: 29879 (from 3743 deformations). +[TIME] is_contractible: 0.068484 seconds +[TIME] are_freely_homotopic: 0.145167 seconds +Random seed: 684989631: Path1 size: 10689 (from 8597 darts); Path2 size: 15705 (from 5016 deformations). +[TIME] is_contractible: 0.033721 seconds +[TIME] are_freely_homotopic: 0.083634 seconds +Random seed: 428735279: Path1 size: 28682 (from 279 darts); Path2 size: 32541 (from 3859 deformations). +[TIME] is_contractible: 0.068278 seconds +[TIME] are_freely_homotopic: 0.139902 seconds +Random seed: 61851330: Path1 size: 13712 (from 780 darts); Path2 size: 16507 (from 2795 deformations). +[TIME] is_contractible: 0.030123 seconds +[TIME] are_freely_homotopic: 0.06685 seconds +Random seed: 642424623: Path1 size: 36802 (from 1199 darts); Path2 size: 39073 (from 2271 deformations). +[TIME] is_contractible: 0.085301 seconds +[TIME] are_freely_homotopic: 0.192078 seconds +Random seed: 1090558461: Path1 size: 131822 (from 800 darts); Path2 size: 135049 (from 3227 deformations). +[TIME] is_contractible: 0.330327 seconds +[TIME] are_freely_homotopic: 0.657221 seconds +Random seed: 481514882: Path1 size: 15369 (from 9986 darts); Path2 size: 15546 (from 177 deformations). +[TIME] is_contractible: 0.040625 seconds +[TIME] are_freely_homotopic: 0.080504 seconds +Random seed: 1980511917: Path1 size: 1197160 (from 7912 darts); Path2 size: 1204876 (from 7716 deformations). +[TIME] is_contractible: 2.66886 seconds +[TIME] are_freely_homotopic: 5.37277 seconds +Random seed: 1842672511: Path1 size: 47253 (from 7272 darts); Path2 size: 47995 (from 742 deformations). +[TIME] is_contractible: 0.133238 seconds +[TIME] are_freely_homotopic: 0.264456 seconds +Random seed: 697653306: Path1 size: 48388 (from 5105 darts); Path2 size: 49535 (from 1147 deformations). +[TIME] is_contractible: 0.099999 seconds +[TIME] are_freely_homotopic: 0.198439 seconds +Random seed: 1633707128: Path1 size: 1329710 (from 5106 darts); Path2 size: 1332418 (from 2708 deformations). +[TIME] is_contractible: 3.19551 seconds +[TIME] are_freely_homotopic: 6.3238 seconds +Random seed: 60068853: Path1 size: 398055 (from 7741 darts); Path2 size: 398563 (from 508 deformations). +[TIME] is_contractible: 0.898438 seconds +[TIME] are_freely_homotopic: 1.81173 seconds +Random seed: 989827132: Path1 size: 10626 (from 2147 darts); Path2 size: 14753 (from 4127 deformations). +[TIME] is_contractible: 0.021253 seconds +[TIME] are_freely_homotopic: 0.049661 seconds +Random seed: 624504064: Path1 size: 38241 (from 1344 darts); Path2 size: 47721 (from 9480 deformations). +[TIME] is_contractible: 0.098851 seconds +[TIME] are_freely_homotopic: 0.226109 seconds +Random seed: 332973462: Path1 size: 713191 (from 9221 darts); Path2 size: 718785 (from 5594 deformations). +[TIME] is_contractible: 1.57574 seconds +[TIME] are_freely_homotopic: 3.37537 seconds +Random seed: 1786994212: Path1 size: 17118 (from 1919 darts); Path2 size: 19578 (from 2460 deformations). +[TIME] is_contractible: 0.042418 seconds +[TIME] are_freely_homotopic: 0.089777 seconds +Random seed: 1475222584: Path1 size: 20334 (from 824 darts); Path2 size: 20581 (from 247 deformations). +[TIME] is_contractible: 0.049075 seconds +[TIME] are_freely_homotopic: 0.087179 seconds +Random seed: 656214858: Path1 size: 425156 (from 1998 darts); Path2 size: 425864 (from 708 deformations). +[TIME] is_contractible: 0.998048 seconds +[TIME] are_freely_homotopic: 1.96725 seconds +Random seed: 9811463: Path1 size: 681002 (from 297 darts); Path2 size: 685169 (from 4167 deformations). +[TIME] is_contractible: 1.56764 seconds +[TIME] are_freely_homotopic: 3.13846 seconds +Random seed: 1499084921: Path1 size: 14736 (from 1862 darts); Path2 size: 23593 (from 8857 deformations). +[TIME] is_contractible: 0.032963 seconds +[TIME] are_freely_homotopic: 0.083728 seconds +Random seed: 675748919: Path1 size: 66104 (from 3072 darts); Path2 size: 73386 (from 7282 deformations). +[TIME] is_contractible: 0.144509 seconds +[TIME] are_freely_homotopic: 0.312302 seconds +Random seed: 446853816: Path1 size: 126934 (from 4202 darts); Path2 size: 133243 (from 6309 deformations). +[TIME] is_contractible: 0.304479 seconds +[TIME] are_freely_homotopic: 0.637488 seconds +Random seed: 570468812: Path1 size: 173684 (from 8352 darts); Path2 size: 182567 (from 8883 deformations). +[TIME] is_contractible: 0.380653 seconds +[TIME] are_freely_homotopic: 0.806827 seconds +Random seed: 1475889916: Path1 size: 216994 (from 8386 darts); Path2 size: 220747 (from 3753 deformations). +[TIME] is_contractible: 0.51478 seconds +[TIME] are_freely_homotopic: 1.05948 seconds +Random seed: 1221641326: Path1 size: 13280 (from 7778 darts); Path2 size: 16356 (from 3076 deformations). +[TIME] is_contractible: 0.030476 seconds +[TIME] are_freely_homotopic: 0.066812 seconds +Random seed: 71936334: Path1 size: 24361 (from 7218 darts); Path2 size: 31632 (from 7271 deformations). +[TIME] is_contractible: 0.057538 seconds +[TIME] are_freely_homotopic: 0.129382 seconds +Random seed: 22866134: Path1 size: 287887 (from 7232 darts); Path2 size: 290771 (from 2884 deformations). +[TIME] is_contractible: 0.643613 seconds +[TIME] are_freely_homotopic: 1.31868 seconds +Random seed: 1682518789: Path1 size: 13682 (from 3962 darts); Path2 size: 21002 (from 7320 deformations). +[TIME] is_contractible: 0.032396 seconds +[TIME] are_freely_homotopic: 0.08104 seconds +Random seed: 1690300033: Path1 size: 43631 (from 7154 darts); Path2 size: 51969 (from 8338 deformations). +[TIME] is_contractible: 0.085418 seconds +[TIME] are_freely_homotopic: 0.192622 seconds +Random seed: 1556202589: Path1 size: 38593 (from 3967 darts); Path2 size: 42276 (from 3683 deformations). +[TIME] is_contractible: 0.095875 seconds +[TIME] are_freely_homotopic: 0.202057 seconds +Random seed: 1080932390: Path1 size: 52163 (from 2436 darts); Path2 size: 61186 (from 9023 deformations). +[TIME] is_contractible: 0.1213 seconds +[TIME] are_freely_homotopic: 0.267168 seconds +Random seed: 568510672: Path1 size: 30870 (from 712 darts); Path2 size: 31893 (from 1023 deformations). +[TIME] is_contractible: 0.073838 seconds +[TIME] are_freely_homotopic: 0.169932 seconds +Random seed: 476818107: Path1 size: 23218 (from 1296 darts); Path2 size: 26791 (from 3573 deformations). +[TIME] is_contractible: 0.048905 seconds +[TIME] are_freely_homotopic: 0.106194 seconds +Random seed: 1231940380: Path1 size: 39019 (from 244 darts); Path2 size: 39369 (from 350 deformations). +[TIME] is_contractible: 0.106431 seconds +[TIME] are_freely_homotopic: 0.193006 seconds +Random seed: 259400406: Path1 size: 18964 (from 2460 darts); Path2 size: 27272 (from 8308 deformations). +[TIME] is_contractible: 0.056686 seconds +[TIME] are_freely_homotopic: 0.13645 seconds +Random seed: 1176742988: Path1 size: 11732 (from 9607 darts); Path2 size: 20138 (from 8406 deformations). +[TIME] is_contractible: 0.035749 seconds +[TIME] are_freely_homotopic: 0.106614 seconds +Random seed: 776901128: Path1 size: 2756 (from 2068 darts); Path2 size: 8825 (from 6069 deformations). +[TIME] is_contractible: 0.006236 seconds +[TIME] are_freely_homotopic: 0.024911 seconds +Random seed: 682675560: Path1 size: 85872 (from 5031 darts); Path2 size: 86320 (from 448 deformations). +[TIME] is_contractible: 0.209328 seconds +[TIME] are_freely_homotopic: 0.422786 seconds +Random seed: 566519663: Path1 size: 18111 (from 1151 darts); Path2 size: 21500 (from 3389 deformations). +[TIME] is_contractible: 0.040477 seconds +[TIME] are_freely_homotopic: 0.086777 seconds +Random seed: 1095996006: Path1 size: 39323 (from 4324 darts); Path2 size: 42317 (from 2994 deformations). +[TIME] is_contractible: 0.11067 seconds +[TIME] are_freely_homotopic: 0.242744 seconds +Random seed: 1705041849: Path1 size: 110949 (from 6948 darts); Path2 size: 115416 (from 4467 deformations). +[TIME] is_contractible: 0.280661 seconds +[TIME] are_freely_homotopic: 0.58945 seconds +Random seed: 1443122557: Path1 size: 271220 (from 1555 darts); Path2 size: 276460 (from 5240 deformations). +[TIME] is_contractible: 0.598784 seconds +[TIME] are_freely_homotopic: 1.22255 seconds +Random seed: 1096168385: Path1 size: 135663 (from 360 darts); Path2 size: 143683 (from 8020 deformations). +[TIME] is_contractible: 0.312725 seconds +[TIME] are_freely_homotopic: 0.664022 seconds +Random seed: 439840688: Path1 size: 44947 (from 3080 darts); Path2 size: 48769 (from 3822 deformations). +[TIME] is_contractible: 0.085369 seconds +[TIME] are_freely_homotopic: 0.185623 seconds +Random seed: 176471338: Path1 size: 17174 (from 7199 darts); Path2 size: 22804 (from 5630 deformations). +[TIME] is_contractible: 0.040513 seconds +[TIME] are_freely_homotopic: 0.091902 seconds +Random seed: 724801413: Path1 size: 19647 (from 8219 darts); Path2 size: 22235 (from 2588 deformations). +[TIME] is_contractible: 0.052287 seconds +[TIME] are_freely_homotopic: 0.112104 seconds +Random seed: 36963316: Path1 size: 400748 (from 7330 darts); Path2 size: 408506 (from 7758 deformations). +[TIME] is_contractible: 0.876389 seconds +[TIME] are_freely_homotopic: 1.7828 seconds +Random seed: 1527565741: Path1 size: 71523 (from 3702 darts); Path2 size: 71930 (from 407 deformations). +[TIME] is_contractible: 0.14962 seconds +[TIME] are_freely_homotopic: 0.338061 seconds +Random seed: 914933755: Path1 size: 223197 (from 9382 darts); Path2 size: 228220 (from 5023 deformations). +[TIME] is_contractible: 0.533326 seconds +[TIME] are_freely_homotopic: 1.09191 seconds +Random seed: 1521965457: Path1 size: 2601935 (from 6638 darts); Path2 size: 2603641 (from 1706 deformations). +[TIME] is_contractible: 5.50732 seconds +[TIME] are_freely_homotopic: 10.8151 seconds +Random seed: 2046362967: Path1 size: 516647 (from 6827 darts); Path2 size: 521009 (from 4362 deformations). +[TIME] is_contractible: 1.14199 seconds +[TIME] are_freely_homotopic: 2.2921 seconds +Random seed: 663235010: Path1 size: 1042972 (from 3550 darts); Path2 size: 1044599 (from 1627 deformations). +[TIME] is_contractible: 2.29914 seconds +[TIME] are_freely_homotopic: 4.62039 seconds +Random seed: 2118300716: Path1 size: 104943 (from 6476 darts); Path2 size: 114537 (from 9594 deformations). +[TIME] is_contractible: 0.231351 seconds +[TIME] are_freely_homotopic: 0.498831 seconds +Random seed: 2032286680: Path1 size: 1513 (from 964 darts); Path2 size: 9121 (from 7608 deformations). +[TIME] is_contractible: 0.004627 seconds +[TIME] are_freely_homotopic: 0.031175 seconds +Random seed: 1954718906: Path1 size: 142475 (from 2023 darts); Path2 size: 145066 (from 2591 deformations). +[TIME] is_contractible: 0.343284 seconds +[TIME] are_freely_homotopic: 0.726973 seconds +Random seed: 422276677: Path1 size: 6627 (from 6403 darts); Path2 size: 10613 (from 3986 deformations). +[TIME] is_contractible: 0.019339 seconds +[TIME] are_freely_homotopic: 0.049796 seconds +Random seed: 1328445502: Path1 size: 448219 (from 7293 darts); Path2 size: 449595 (from 1376 deformations). +[TIME] is_contractible: 0.946231 seconds +[TIME] are_freely_homotopic: 1.917 seconds +Random seed: 233652024: Path1 size: 219376 (from 8135 darts); Path2 size: 223420 (from 4044 deformations). +[TIME] is_contractible: 0.51011 seconds +[TIME] are_freely_homotopic: 1.05122 seconds +Random seed: 1984406757: Path1 size: 370410 (from 9137 darts); Path2 size: 371342 (from 932 deformations). +[TIME] is_contractible: 0.889112 seconds +[TIME] are_freely_homotopic: 1.78276 seconds +Random seed: 1805171553: Path1 size: 18643 (from 3244 darts); Path2 size: 19126 (from 483 deformations). +[TIME] is_contractible: 0.041526 seconds +[TIME] are_freely_homotopic: 0.08436 seconds +Random seed: 519182547: Path1 size: 17322 (from 5722 darts); Path2 size: 18198 (from 876 deformations). +[TIME] is_contractible: 0.032815 seconds +[TIME] are_freely_homotopic: 0.066431 seconds +Random seed: 538307140: Path1 size: 16556 (from 4339 darts); Path2 size: 25713 (from 9157 deformations). +[TIME] is_contractible: 0.039275 seconds +[TIME] are_freely_homotopic: 0.101854 seconds +Random seed: 945348024: Path1 size: 8885 (from 8534 darts); Path2 size: 13720 (from 4835 deformations). +[TIME] is_contractible: 0.018419 seconds +[TIME] are_freely_homotopic: 0.046641 seconds +Random seed: 928636710: Path1 size: 43760 (from 3689 darts); Path2 size: 51887 (from 8127 deformations). +[TIME] is_contractible: 0.116647 seconds +[TIME] are_freely_homotopic: 0.262684 seconds +Random seed: 1389758013: Path1 size: 33747 (from 3227 darts); Path2 size: 41820 (from 8073 deformations). +[TIME] is_contractible: 0.077442 seconds +[TIME] are_freely_homotopic: 0.17862 seconds +Random seed: 440615746: Path1 size: 73982 (from 7794 darts); Path2 size: 79198 (from 5216 deformations). +[TIME] is_contractible: 0.194931 seconds +[TIME] are_freely_homotopic: 0.409284 seconds +Random seed: 989452973: Path1 size: 138225 (from 3498 darts); Path2 size: 141825 (from 3600 deformations). +[TIME] is_contractible: 0.298229 seconds +[TIME] are_freely_homotopic: 0.628531 seconds +Random seed: 1545034495: Path1 size: 25385 (from 8559 darts); Path2 size: 34450 (from 9065 deformations). +[TIME] is_contractible: 0.058727 seconds +[TIME] are_freely_homotopic: 0.138786 seconds +Random seed: 1533279853: Path1 size: 737872 (from 1987 darts); Path2 size: 744717 (from 6845 deformations). +[TIME] is_contractible: 1.68372 seconds +[TIME] are_freely_homotopic: 3.4144 seconds +Random seed: 1357804745: Path1 size: 11975 (from 3879 darts); Path2 size: 20410 (from 8435 deformations). +[TIME] is_contractible: 0.027492 seconds +[TIME] are_freely_homotopic: 0.075561 seconds +All the 100 tests OK: each pair of paths were homotopic. +Number of contractible paths: 2 among 100 (i.e. 2%). diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-polygonal-schema.txt b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-polygonal-schema.txt new file mode 100644 index 00000000000..227835c0777 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-polygonal-schema.txt @@ -0,0 +1,819 @@ +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 5.1e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 1.2e-05 seconds +[TIME] are_freely_homotopic: 0.001005 seconds +Random seed: 407428646: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 9e-06 seconds +[TIME] are_freely_homotopic: 0.000968 seconds +Random seed: 1051319270: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 8e-06 seconds +[TIME] are_freely_homotopic: 0.001003 seconds +Random seed: 1723844934: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 8e-06 seconds +[TIME] are_freely_homotopic: 0.000963 seconds +Random seed: 1027388982: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 7e-06 seconds +[TIME] are_freely_homotopic: 0.000966 seconds +Random seed: 711831886: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 9e-06 seconds +[TIME] are_freely_homotopic: 0.001177 seconds +Random seed: 2010793706: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 7e-06 seconds +[TIME] are_freely_homotopic: 0.000996 seconds +Random seed: 32114464: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 8e-06 seconds +[TIME] are_freely_homotopic: 0.001022 seconds +Random seed: 195228895: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 8e-06 seconds +[TIME] are_freely_homotopic: 0.000979 seconds +Random seed: 1929405609: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations). +[TIME] is_contractible: 7e-06 seconds +[TIME] are_freely_homotopic: 0.000987 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 5.4e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.8e-05 seconds +[TIME] are_freely_homotopic: 0.001095 seconds +Random seed: 1171368432: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.4e-05 seconds +[TIME] are_freely_homotopic: 0.00105 seconds +Random seed: 34571897: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.2e-05 seconds +[TIME] are_freely_homotopic: 0.001062 seconds +Random seed: 1247288983: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.7e-05 seconds +[TIME] are_freely_homotopic: 0.001035 seconds +Random seed: 178150098: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.3e-05 seconds +[TIME] are_freely_homotopic: 0.001049 seconds +Random seed: 1284851902: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.2e-05 seconds +[TIME] are_freely_homotopic: 0.00101 seconds +Random seed: 586309868: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.3e-05 seconds +[TIME] are_freely_homotopic: 0.001002 seconds +Random seed: 1809343951: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.8e-05 seconds +[TIME] are_freely_homotopic: 0.001019 seconds +Random seed: 1595581086: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 2.2e-05 seconds +[TIME] are_freely_homotopic: 0.001037 seconds +Random seed: 47612060: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations). +[TIME] is_contractible: 1.4e-05 seconds +[TIME] are_freely_homotopic: 0.001149 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 9e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 5.6e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2.2e-05 seconds +[TIME] are_freely_homotopic: 0.001108 seconds +Random seed: 374067786: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 1.8e-05 seconds +[TIME] are_freely_homotopic: 0.001021 seconds +Random seed: 391456340: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2.2e-05 seconds +[TIME] are_freely_homotopic: 0.001016 seconds +Random seed: 1273863045: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2.1e-05 seconds +[TIME] are_freely_homotopic: 0.001083 seconds +Random seed: 1519773403: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2e-05 seconds +[TIME] are_freely_homotopic: 0.001038 seconds +Random seed: 1799868058: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2e-05 seconds +[TIME] are_freely_homotopic: 0.001031 seconds +Random seed: 277235164: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 1.9e-05 seconds +[TIME] are_freely_homotopic: 0.001087 seconds +Random seed: 734561593: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2.2e-05 seconds +[TIME] are_freely_homotopic: 0.001032 seconds +Random seed: 21414605: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 2e-05 seconds +[TIME] are_freely_homotopic: 0.001021 seconds +Random seed: 130317551: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations). +[TIME] is_contractible: 1.8e-05 seconds +[TIME] are_freely_homotopic: 0.001027 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 9e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.4e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 6.2e-05 seconds +[TIME] are_freely_homotopic: 0.001295 seconds +Random seed: 827721189: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.6e-05 seconds +[TIME] are_freely_homotopic: 0.001204 seconds +Random seed: 179817563: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.5e-05 seconds +[TIME] are_freely_homotopic: 0.001213 seconds +Random seed: 1778101746: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.9e-05 seconds +[TIME] are_freely_homotopic: 0.001151 seconds +Random seed: 328240899: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.5e-05 seconds +[TIME] are_freely_homotopic: 0.001145 seconds +Random seed: 241402582: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.9e-05 seconds +[TIME] are_freely_homotopic: 0.001107 seconds +Random seed: 773902557: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.7e-05 seconds +[TIME] are_freely_homotopic: 0.001101 seconds +Random seed: 225479303: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.7e-05 seconds +[TIME] are_freely_homotopic: 0.001154 seconds +Random seed: 950681152: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.3e-05 seconds +[TIME] are_freely_homotopic: 0.001134 seconds +Random seed: 380481270: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations). +[TIME] is_contractible: 5.8e-05 seconds +[TIME] are_freely_homotopic: 0.001139 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 9e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.2e-05 seconds +[TIME] Total time for computation of reduced map: 5.9e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.000108 seconds +[TIME] are_freely_homotopic: 0.001324 seconds +Random seed: 129634878: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.000127 seconds +[TIME] are_freely_homotopic: 0.001278 seconds +Random seed: 452917690: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.000103 seconds +[TIME] are_freely_homotopic: 0.001273 seconds +Random seed: 314585648: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.000106 seconds +[TIME] are_freely_homotopic: 0.001214 seconds +Random seed: 1198383543: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 9.7e-05 seconds +[TIME] are_freely_homotopic: 0.001194 seconds +Random seed: 1500775544: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.000102 seconds +[TIME] are_freely_homotopic: 0.001204 seconds +Random seed: 1867790315: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.0001 seconds +[TIME] are_freely_homotopic: 0.001208 seconds +Random seed: 317233466: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0.000106 seconds +[TIME] are_freely_homotopic: 0 seconds +Random seed: 860485872: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0 seconds +[TIME] are_freely_homotopic: 0 seconds +Random seed: 186785431: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations). +[TIME] is_contractible: 0 seconds +[TIME] are_freely_homotopic: 0.001102 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 3e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.1e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.00015 seconds +[TIME] are_freely_homotopic: 0.001414 seconds +Random seed: 1956175858: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000156 seconds +[TIME] are_freely_homotopic: 0.001383 seconds +Random seed: 2005845456: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.00015 seconds +[TIME] are_freely_homotopic: 0.001383 seconds +Random seed: 1292528523: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000164 seconds +[TIME] are_freely_homotopic: 0.001353 seconds +Random seed: 895083270: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000151 seconds +[TIME] are_freely_homotopic: 0.001377 seconds +Random seed: 1540167906: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000148 seconds +[TIME] are_freely_homotopic: 0.00132 seconds +Random seed: 562183336: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000189 seconds +[TIME] are_freely_homotopic: 0.001327 seconds +Random seed: 421041639: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000153 seconds +[TIME] are_freely_homotopic: 0.001346 seconds +Random seed: 1020347916: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000148 seconds +[TIME] are_freely_homotopic: 0.001338 seconds +Random seed: 788223553: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations). +[TIME] is_contractible: 0.000149 seconds +[TIME] are_freely_homotopic: 0.001316 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.4e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000503 seconds +[TIME] are_freely_homotopic: 0.00274 seconds +Random seed: 43424588: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000515 seconds +[TIME] are_freely_homotopic: 0.00225 seconds +Random seed: 573264075: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000503 seconds +[TIME] are_freely_homotopic: 0.002229 seconds +Random seed: 1527608505: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000487 seconds +[TIME] are_freely_homotopic: 0.002148 seconds +Random seed: 836582892: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000506 seconds +[TIME] are_freely_homotopic: 0.002183 seconds +Random seed: 1873914203: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.0005 seconds +[TIME] are_freely_homotopic: 0.002198 seconds +Random seed: 701716257: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000524 seconds +[TIME] are_freely_homotopic: 0.002243 seconds +Random seed: 1041502320: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000476 seconds +[TIME] are_freely_homotopic: 0.002138 seconds +Random seed: 453945061: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000519 seconds +[TIME] are_freely_homotopic: 0.00216 seconds +Random seed: 1711098650: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations). +[TIME] is_contractible: 0.000508 seconds +[TIME] are_freely_homotopic: 0.002289 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.5e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001098 seconds +[TIME] are_freely_homotopic: 0.003557 seconds +Random seed: 1244268897: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001039 seconds +[TIME] are_freely_homotopic: 0.003471 seconds +Random seed: 1196854613: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001114 seconds +[TIME] are_freely_homotopic: 0.003608 seconds +Random seed: 371870391: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001052 seconds +[TIME] are_freely_homotopic: 0.0035 seconds +Random seed: 1678709996: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001065 seconds +[TIME] are_freely_homotopic: 0.003567 seconds +Random seed: 169242704: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001091 seconds +[TIME] are_freely_homotopic: 0.003504 seconds +Random seed: 1844556362: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001089 seconds +[TIME] are_freely_homotopic: 0.003487 seconds +Random seed: 2053640443: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001035 seconds +[TIME] are_freely_homotopic: 0.003462 seconds +Random seed: 1974056470: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001044 seconds +[TIME] are_freely_homotopic: 0.003641 seconds +Random seed: 1751977721: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations). +[TIME] is_contractible: 0.001071 seconds +[TIME] are_freely_homotopic: 0.003581 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 5e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.2e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001588 seconds +[TIME] are_freely_homotopic: 0.004812 seconds +Random seed: 1252487160: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001464 seconds +[TIME] are_freely_homotopic: 0.00467 seconds +Random seed: 13701413: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001528 seconds +[TIME] are_freely_homotopic: 0.004638 seconds +Random seed: 510220869: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001537 seconds +[TIME] are_freely_homotopic: 0.004624 seconds +Random seed: 1182277397: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001567 seconds +[TIME] are_freely_homotopic: 0.004616 seconds +Random seed: 1096764957: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.0015 seconds +[TIME] are_freely_homotopic: 0.004668 seconds +Random seed: 331987761: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001511 seconds +[TIME] are_freely_homotopic: 0.004656 seconds +Random seed: 2143485603: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001499 seconds +[TIME] are_freely_homotopic: 0.004802 seconds +Random seed: 1248377376: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001506 seconds +[TIME] are_freely_homotopic: 0.004569 seconds +Random seed: 519811081: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations). +[TIME] is_contractible: 0.001547 seconds +[TIME] are_freely_homotopic: 0.004533 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 5.5e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.005356 seconds +[TIME] are_freely_homotopic: 0.013876 seconds +Random seed: 1666928446: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.005086 seconds +[TIME] are_freely_homotopic: 0.013546 seconds +Random seed: 1181327034: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.005001 seconds +[TIME] are_freely_homotopic: 0.013021 seconds +Random seed: 1346202096: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.004986 seconds +[TIME] are_freely_homotopic: 0.013122 seconds +Random seed: 828629303: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.005043 seconds +[TIME] are_freely_homotopic: 0.01331 seconds +Random seed: 1857214345: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.00499 seconds +[TIME] are_freely_homotopic: 0.013371 seconds +Random seed: 164145942: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.005031 seconds +[TIME] are_freely_homotopic: 0.009351 seconds +Random seed: 1551241558: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.004947 seconds +[TIME] are_freely_homotopic: 0.012935 seconds +Random seed: 1186302198: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.005056 seconds +[TIME] are_freely_homotopic: 0.013268 seconds +Random seed: 1147150342: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations). +[TIME] is_contractible: 0.00501 seconds +[TIME] are_freely_homotopic: 0.012934 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 1e-05 seconds +[TIME] Simplification in one face: 5e-06 seconds +[TIME] Face quadrangulation: 2.2e-05 seconds +[TIME] Total time for computation of reduced map: 6e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945958: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010521 seconds +[TIME] are_freely_homotopic: 0.028003 seconds +Random seed: 92918279: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010399 seconds +[TIME] are_freely_homotopic: 0.02753 seconds +Random seed: 596408825: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010433 seconds +[TIME] are_freely_homotopic: 0.027865 seconds +Random seed: 898032342: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010353 seconds +[TIME] are_freely_homotopic: 0.023407 seconds +Random seed: 1328207231: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010198 seconds +[TIME] are_freely_homotopic: 0.028186 seconds +Random seed: 2051608229: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010343 seconds +[TIME] are_freely_homotopic: 0.027859 seconds +Random seed: 588608644: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010273 seconds +[TIME] are_freely_homotopic: 0.029628 seconds +Random seed: 66849970: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010566 seconds +[TIME] are_freely_homotopic: 0.027236 seconds +Random seed: 2130416677: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.010242 seconds +[TIME] are_freely_homotopic: 0.026748 seconds +Random seed: 1280279108: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations). +[TIME] is_contractible: 0.01086 seconds +[TIME] are_freely_homotopic: 0.028129 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 9e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.6e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945959: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015946 seconds +[TIME] are_freely_homotopic: 0.043957 seconds +Random seed: 1536606275: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015459 seconds +[TIME] are_freely_homotopic: 0.041385 seconds +Random seed: 2080252105: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.016125 seconds +[TIME] are_freely_homotopic: 0.038053 seconds +Random seed: 1598541528: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015935 seconds +[TIME] are_freely_homotopic: 0.043414 seconds +Random seed: 974598622: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015291 seconds +[TIME] are_freely_homotopic: 0.04098 seconds +Random seed: 1923233325: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015353 seconds +[TIME] are_freely_homotopic: 0.042937 seconds +Random seed: 1140340946: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.017732 seconds +[TIME] are_freely_homotopic: 0.045088 seconds +Random seed: 1573867023: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015587 seconds +[TIME] are_freely_homotopic: 0.041879 seconds +Random seed: 1467028679: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.015839 seconds +[TIME] are_freely_homotopic: 0.041111 seconds +Random seed: 1979862163: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations). +[TIME] is_contractible: 0.016299 seconds +[TIME] are_freely_homotopic: 0.045976 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 0 seconds +[TIME] Simplification in one face: 0 seconds +[TIME] Face quadrangulation: 0 seconds +[TIME] Total time for computation of reduced map: 0 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945960: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.056463 seconds +[TIME] are_freely_homotopic: 0.17237 seconds +Random seed: 579143103: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.054943 seconds +[TIME] are_freely_homotopic: 0.180977 seconds +Random seed: 1329965305: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.055873 seconds +[TIME] are_freely_homotopic: 0.171254 seconds +Random seed: 46115850: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.053753 seconds +[TIME] are_freely_homotopic: 0.171383 seconds +Random seed: 1372864308: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.055899 seconds +[TIME] are_freely_homotopic: 0.171538 seconds +Random seed: 824893981: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.054506 seconds +[TIME] are_freely_homotopic: 0.178545 seconds +Random seed: 87947492: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.05419 seconds +[TIME] are_freely_homotopic: 0.171793 seconds +Random seed: 1798052437: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.055006 seconds +[TIME] are_freely_homotopic: 0.185616 seconds +Random seed: 1637566832: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.055066 seconds +[TIME] are_freely_homotopic: 0.174076 seconds +Random seed: 228920755: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations). +[TIME] is_contractible: 0.055227 seconds +[TIME] are_freely_homotopic: 0.189212 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 1.7e-05 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 6.5e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945963: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.113193 seconds +[TIME] are_freely_homotopic: 0.251366 seconds +Random seed: 474217776: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.053804 seconds +[TIME] are_freely_homotopic: 0.188959 seconds +Random seed: 225712445: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.065313 seconds +[TIME] are_freely_homotopic: 0.319781 seconds +Random seed: 558926877: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.11272 seconds +[TIME] are_freely_homotopic: 0.339641 seconds +Random seed: 489485133: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.112057 seconds +[TIME] are_freely_homotopic: 0.347156 seconds +Random seed: 1250371909: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.109281 seconds +[TIME] are_freely_homotopic: 0.340843 seconds +Random seed: 1461432881: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.108663 seconds +[TIME] are_freely_homotopic: 0.344816 seconds +Random seed: 900599167: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.12226 seconds +[TIME] are_freely_homotopic: 0.366892 seconds +Random seed: 332938818: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.116914 seconds +[TIME] are_freely_homotopic: 0.375243 seconds +Random seed: 1170036586: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations). +[TIME] is_contractible: 0.109202 seconds +[TIME] are_freely_homotopic: 0.342457 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 1.2e-05 seconds +[TIME] Simplification in one face: 6e-06 seconds +[TIME] Face quadrangulation: 3.2e-05 seconds +[TIME] Total time for computation of reduced map: 8.6e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945969: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.165865 seconds +[TIME] are_freely_homotopic: 0.524276 seconds +Random seed: 1226891914: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.161986 seconds +[TIME] are_freely_homotopic: 0.52858 seconds +Random seed: 1375369512: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.164922 seconds +[TIME] are_freely_homotopic: 0.531664 seconds +Random seed: 457873843: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.166501 seconds +[TIME] are_freely_homotopic: 0.529451 seconds +Random seed: 1433095951: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.165578 seconds +[TIME] are_freely_homotopic: 0.532124 seconds +Random seed: 1454564469: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.166458 seconds +[TIME] are_freely_homotopic: 0.537297 seconds +Random seed: 1770807796: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.165786 seconds +[TIME] are_freely_homotopic: 0.532855 seconds +Random seed: 1798074289: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.165027 seconds +[TIME] are_freely_homotopic: 0.55081 seconds +Random seed: 138710538: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.166903 seconds +[TIME] are_freely_homotopic: 0.535346 seconds +Random seed: 1787667944: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations). +[TIME] is_contractible: 0.16556 seconds +[TIME] are_freely_homotopic: 0.542188 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 1.2e-05 seconds +[TIME] Simplification in one face: 6e-06 seconds +[TIME] Face quadrangulation: 3.1e-05 seconds +[TIME] Total time for computation of reduced map: 8.2e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574945979: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.565789 seconds +[TIME] are_freely_homotopic: 1.7571 seconds +Random seed: 644792205: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.555874 seconds +[TIME] are_freely_homotopic: 1.73021 seconds +Random seed: 602587674: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.545865 seconds +[TIME] are_freely_homotopic: 1.78313 seconds +Random seed: 581717819: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.567576 seconds +[TIME] are_freely_homotopic: 1.75944 seconds +Random seed: 1562933709: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.584859 seconds +[TIME] are_freely_homotopic: 1.77367 seconds +Random seed: 196412346: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.525251 seconds +[TIME] are_freely_homotopic: 1.71673 seconds +Random seed: 872074059: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.568166 seconds +[TIME] are_freely_homotopic: 1.64886 seconds +Random seed: 721079285: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.538682 seconds +[TIME] are_freely_homotopic: 1.71856 seconds +Random seed: 169285406: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.575029 seconds +[TIME] are_freely_homotopic: 1.67964 seconds +Random seed: 417147589: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations). +[TIME] is_contractible: 0.548759 seconds +[TIME] are_freely_homotopic: 1.75386 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 3e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.4e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574946010: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.07172 seconds +[TIME] are_freely_homotopic: 3.30467 seconds +Random seed: 370928264: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.00794 seconds +[TIME] are_freely_homotopic: 3.21761 seconds +Random seed: 527719483: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.04292 seconds +[TIME] are_freely_homotopic: 3.43482 seconds +Random seed: 1799719226: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.10887 seconds +[TIME] are_freely_homotopic: 3.44661 seconds +Random seed: 1931996536: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.10033 seconds +[TIME] are_freely_homotopic: 3.49517 seconds +Random seed: 2105171859: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.10725 seconds +[TIME] are_freely_homotopic: 3.48497 seconds +Random seed: 1990690710: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.13176 seconds +[TIME] are_freely_homotopic: 3.46857 seconds +Random seed: 993120350: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.11183 seconds +[TIME] are_freely_homotopic: 3.52759 seconds +Random seed: 886380626: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.12338 seconds +[TIME] are_freely_homotopic: 3.41028 seconds +Random seed: 157399348: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations). +[TIME] is_contractible: 1.0625 seconds +[TIME] are_freely_homotopic: 3.4078 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 9e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.6e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574946072: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.61675 seconds +[TIME] are_freely_homotopic: 5.23394 seconds +Random seed: 1590578674: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.76362 seconds +[TIME] are_freely_homotopic: 5.39348 seconds +Random seed: 472245139: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.70443 seconds +[TIME] are_freely_homotopic: 5.38821 seconds +Random seed: 429234277: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.79035 seconds +[TIME] are_freely_homotopic: 5.44008 seconds +Random seed: 1271064050: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.79136 seconds +[TIME] are_freely_homotopic: 5.56954 seconds +Random seed: 1099653011: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.7848 seconds +[TIME] are_freely_homotopic: 5.48245 seconds +Random seed: 1494765157: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.7496 seconds +[TIME] are_freely_homotopic: 5.512 seconds +Random seed: 22424818: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.72438 seconds +[TIME] are_freely_homotopic: 5.4148 seconds +Random seed: 1046116947: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.65999 seconds +[TIME] are_freely_homotopic: 5.21928 seconds +Random seed: 782410053: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations). +[TIME] is_contractible: 1.59595 seconds +[TIME] are_freely_homotopic: 4.85017 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 8e-06 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2e-05 seconds +[TIME] Total time for computation of reduced map: 5.7e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574946169: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.66762 seconds +[TIME] are_freely_homotopic: 17.7623 seconds +Random seed: 1473356665: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.35138 seconds +[TIME] are_freely_homotopic: 17.0192 seconds +Random seed: 1977994873: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.6751 seconds +[TIME] are_freely_homotopic: 17.2393 seconds +Random seed: 1879243257: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.67143 seconds +[TIME] are_freely_homotopic: 16.4106 seconds +Random seed: 1229375161: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.66773 seconds +[TIME] are_freely_homotopic: 17.6798 seconds +Random seed: 1461417625: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.63388 seconds +[TIME] are_freely_homotopic: 16.511 seconds +Random seed: 468007748: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.64777 seconds +[TIME] are_freely_homotopic: 17.7845 seconds +Random seed: 448609289: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.57198 seconds +[TIME] are_freely_homotopic: 16.1655 seconds +Random seed: 1489170401: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.58956 seconds +[TIME] are_freely_homotopic: 17.3209 seconds +Random seed: 1788684157: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations). +[TIME] is_contractible: 5.61045 seconds +[TIME] are_freely_homotopic: 16.1997 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 9e-06 seconds +[TIME] Simplification in one face: 5e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 5.7e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574946480: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 11.2896 seconds +[TIME] are_freely_homotopic: 33.2624 seconds +Random seed: 99584895: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.8629 seconds +[TIME] are_freely_homotopic: 32.7729 seconds +Random seed: 912045122: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.6456 seconds +[TIME] are_freely_homotopic: 32.64 seconds +Random seed: 595863310: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.7267 seconds +[TIME] are_freely_homotopic: 32.7883 seconds +Random seed: 1309255323: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.7952 seconds +[TIME] are_freely_homotopic: 33.4828 seconds +Random seed: 1248795693: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.8942 seconds +[TIME] are_freely_homotopic: 33.3988 seconds +Random seed: 2034370714: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 11.1634 seconds +[TIME] are_freely_homotopic: 33.8661 seconds +Random seed: 1340254186: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.8488 seconds +[TIME] are_freely_homotopic: 32.7967 seconds +Random seed: 803460071: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.805 seconds +[TIME] are_freely_homotopic: 32.5927 seconds +Random seed: 2000292971: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations). +[TIME] is_contractible: 10.6542 seconds +[TIME] are_freely_homotopic: 33.3069 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== +Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1 +[TIME] Simplification in one vertex: 1e-05 seconds +[TIME] Simplification in one face: 4e-06 seconds +[TIME] Face quadrangulation: 2.1e-05 seconds +[TIME] Total time for computation of reduced map: 6e-05 seconds +Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1 +Random seed: 1574947086: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.8741 seconds +[TIME] are_freely_homotopic: 51.2028 seconds +Random seed: 1043134997: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.4561 seconds +[TIME] are_freely_homotopic: 50.1288 seconds +Random seed: 439762399: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.031 seconds +[TIME] are_freely_homotopic: 51.1833 seconds +Random seed: 1662380910: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.4791 seconds +[TIME] are_freely_homotopic: 51.4586 seconds +Random seed: 185618813: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.5506 seconds +[TIME] are_freely_homotopic: 49.4669 seconds +Random seed: 652798972: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.4287 seconds +[TIME] are_freely_homotopic: 50.4364 seconds +Random seed: 2005222812: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 17.0067 seconds +[TIME] are_freely_homotopic: 51.1537 seconds +Random seed: 1669933756: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.4827 seconds +[TIME] are_freely_homotopic: 51.8852 seconds +Random seed: 485850944: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 17.0735 seconds +[TIME] are_freely_homotopic: 51.4021 seconds +Random seed: 325794698: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations). +[TIME] is_contractible: 16.1387 seconds +[TIME] are_freely_homotopic: 51.3036 seconds +All the 10 tests OK: each pair of paths were homotopic. +Number of contractible paths: 0 among 10 (i.e. 0%). +============== diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-quadrangulation-computation.txt b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-quadrangulation-computation.txt new file mode 100644 index 00000000000..89c33e9a85d --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/graphs/res-quadrangulation-computation.txt @@ -0,0 +1,265 @@ +Mesh data/big/803_neptune_4Mtriangles_manifold.off +[TIME] Simplification in one vertex: 5.77141 seconds +[TIME] Simplification in one face: 6.60485 seconds +[TIME] Face quadrangulation: 1.14649 seconds +[TIME] Total time for computation of reduced map: 13.5703 seconds +Initial map: #Darts=12023616, #0-cells=2003932, #1-cells=6011808, #2-cells=4007872, #ccs=1 +Reduced map: #Darts=24, #0-cells=2, #1-cells=12, #2-cells=6, #ccs=1 +Mesh data/big/blade-several-cc.off +[TIME] Simplification in one vertex: 1.96106 seconds +[TIME] Simplification in one face: 2.84259 seconds +[TIME] Face quadrangulation: 0.554043 seconds +[TIME] Total time for computation of reduced map: 5.37898 seconds +Initial map: #Darts=5296164, #0-cells=882954, #1-cells=2648082, #2-cells=1765388, #ccs=295 +Reduced map: #Darts=13112, #0-cells=3538, #1-cells=6556, #2-cells=3278, #ccs=295 +Mesh data/big/Drum_Dancer_2670868.off +[TIME] Simplification in one vertex: 3.26392 seconds +[TIME] Simplification in one face: 1.45876 seconds +[TIME] Total time for computation of reduced map: 4.72275 seconds +Initial map: #Darts=8012604, #0-cells=1335436, #1-cells=4006302, #2-cells=2670868, #ccs=1 +Reduced map: #Darts=0, #0-cells=0, #1-cells=0, #2-cells=0, #ccs=0 +Mesh data/big-genus/obj10.off +[TIME] Simplification in one vertex: 0.054267 seconds +[TIME] Simplification in one face: 0.081982 seconds +[TIME] Face quadrangulation: 0.017711 seconds +[TIME] Total time for computation of reduced map: 0.154715 seconds +Initial map: #Darts=205662, #0-cells=33871, #1-cells=102831, #2-cells=68554, #ccs=1 +Reduced map: #Darts=1632, #0-cells=2, #1-cells=816, #2-cells=408, #ccs=1 +Mesh data/big-genus/obj11.off +[TIME] Simplification in one vertex: 0.108287 seconds +[TIME] Simplification in one face: 0.143657 seconds +[TIME] Face quadrangulation: 0.031098 seconds +[TIME] Total time for computation of reduced map: 0.284387 seconds +Initial map: #Darts=334926, #0-cells=55617, #1-cells=167463, #2-cells=111642, #ccs=1 +Reduced map: #Darts=824, #0-cells=2, #1-cells=412, #2-cells=206, #ccs=1 +Mesh data/big-genus/obj12.off +[TIME] Simplification in one vertex: 0.095036 seconds +[TIME] Simplification in one face: 0.163535 seconds +[TIME] Face quadrangulation: 0.030391 seconds +[TIME] Total time for computation of reduced map: 0.290279 seconds +Initial map: #Darts=310740, #0-cells=50528, #1-cells=155370, #2-cells=103580, #ccs=1 +Reduced map: #Darts=5056, #0-cells=2, #1-cells=2528, #2-cells=1264, #ccs=1 +Mesh data/big-genus/obj13.off +[TIME] Simplification in one vertex: 0.047877 seconds +[TIME] Simplification in one face: 0.075205 seconds +[TIME] Face quadrangulation: 0.013692 seconds +[TIME] Total time for computation of reduced map: 0.137383 seconds +Initial map: #Darts=172800, #0-cells=28564, #1-cells=86400, #2-cells=57600, #ccs=1 +Reduced map: #Darts=952, #0-cells=2, #1-cells=476, #2-cells=238, #ccs=1 +Mesh data/big-genus/obj14.off +[TIME] Simplification in one vertex: 0.274628 seconds +[TIME] Simplification in one face: 0.325655 seconds +[TIME] Face quadrangulation: 0.070724 seconds +[TIME] Total time for computation of reduced map: 0.67383 seconds +Initial map: #Darts=694992, #0-cells=115612, #1-cells=347496, #2-cells=231664, #ccs=1 +Reduced map: #Darts=888, #0-cells=2, #1-cells=444, #2-cells=222, #ccs=1 +Mesh data/big-genus/obj15.off +[TIME] Simplification in one vertex: 1.27469 seconds +[TIME] Simplification in one face: 1.51623 seconds +[TIME] Face quadrangulation: 0.339918 seconds +[TIME] Total time for computation of reduced map: 3.14391 seconds +Initial map: #Darts=3298422, #0-cells=548955, #1-cells=1649211, #2-cells=1099474, #ccs=1 +Reduced map: #Darts=3136, #0-cells=2, #1-cells=1568, #2-cells=784, #ccs=1 +Mesh data/big-genus/obj16.off +[TIME] Simplification in one vertex: 0.002664 seconds +[TIME] Simplification in one face: 0.003016 seconds +[TIME] Face quadrangulation: 0.000657 seconds +[TIME] Total time for computation of reduced map: 0.006399 seconds +Initial map: #Darts=16326, #0-cells=2491, #1-cells=8163, #2-cells=5442, #ccs=1 +Reduced map: #Darts=928, #0-cells=2, #1-cells=464, #2-cells=232, #ccs=1 +Mesh data/big-genus/obj17.off +[TIME] Simplification in one vertex: 0.007386 seconds +[TIME] Simplification in one face: 0.008476 seconds +[TIME] Face quadrangulation: 0.00218 seconds +[TIME] Total time for computation of reduced map: 0.018229 seconds +Initial map: #Darts=38292, #0-cells=5488, #1-cells=19146, #2-cells=12764, #ccs=1 +Reduced map: #Darts=3584, #0-cells=2, #1-cells=1792, #2-cells=896, #ccs=1 +Mesh data/big-genus/obj1.off +[TIME] Simplification in one vertex: 0.001849 seconds +[TIME] Simplification in one face: 0.002086 seconds +[TIME] Face quadrangulation: 0.000568 seconds +[TIME] Total time for computation of reduced map: 0.004556 seconds +Initial map: #Darts=11532, #0-cells=1684, #1-cells=5766, #2-cells=3844, #ccs=1 +Reduced map: #Darts=960, #0-cells=2, #1-cells=480, #2-cells=240, #ccs=1 +Mesh data/big-genus/obj2.off +[TIME] Simplification in one vertex: 0.002474 seconds +[TIME] Simplification in one face: 0.002939 seconds +[TIME] Face quadrangulation: 0.000663 seconds +[TIME] Total time for computation of reduced map: 0.006134 seconds +Initial map: #Darts=16188, #0-cells=2460, #1-cells=8094, #2-cells=5396, #ccs=1 +Reduced map: #Darts=960, #0-cells=2, #1-cells=480, #2-cells=240, #ccs=1 +Mesh data/big-genus/obj3.off +[TIME] Simplification in one vertex: 0.356866 seconds +[TIME] Simplification in one face: 0.519399 seconds +[TIME] Face quadrangulation: 0.106446 seconds +[TIME] Total time for computation of reduced map: 0.987253 seconds +Initial map: #Darts=1037988, #0-cells=172466, #1-cells=518994, #2-cells=345996, #ccs=1 +Reduced map: #Darts=2136, #0-cells=2, #1-cells=1068, #2-cells=534, #ccs=1 +Mesh data/big-genus/obj5.off +[TIME] Simplification in one vertex: 0.020143 seconds +[TIME] Simplification in one face: 0.035718 seconds +[TIME] Face quadrangulation: 0.005571 seconds +[TIME] Total time for computation of reduced map: 0.061761 seconds +Initial map: #Darts=97644, #0-cells=15520, #1-cells=48822, #2-cells=32548, #ccs=1 +Reduced map: #Darts=3024, #0-cells=2, #1-cells=1512, #2-cells=756, #ccs=1 +Mesh data/big-genus/obj6.off +[TIME] Simplification in one vertex: 0.001718 seconds +[TIME] Simplification in one face: 0.00174 seconds +[TIME] Face quadrangulation: 0.000691 seconds +[TIME] Total time for computation of reduced map: 0.004214 seconds +Initial map: #Darts=9186, #0-cells=1311, #1-cells=4593, #2-cells=3062, #ccs=1 +Reduced map: #Darts=888, #0-cells=2, #1-cells=444, #2-cells=222, #ccs=1 +Mesh data/big-genus/obj7.off +[TIME] Simplification in one vertex: 0.001889 seconds +[TIME] Simplification in one face: 0.002058 seconds +[TIME] Face quadrangulation: 0.000642 seconds +[TIME] Total time for computation of reduced map: 0.00465 seconds +Initial map: #Darts=11520, #0-cells=1608, #1-cells=5760, #2-cells=3840, #ccs=1 +Reduced map: #Darts=1256, #0-cells=2, #1-cells=628, #2-cells=314, #ccs=1 +Mesh data/big-genus/obj8.off +[TIME] Simplification in one vertex: 0.005149 seconds +[TIME] Simplification in one face: 0.007093 seconds +[TIME] Face quadrangulation: 0.000993 seconds +[TIME] Total time for computation of reduced map: 0.013347 seconds +Initial map: #Darts=29676, #0-cells=4716, #1-cells=14838, #2-cells=9892, #ccs=1 +Reduced map: #Darts=928, #0-cells=2, #1-cells=464, #2-cells=232, #ccs=1 +Mesh data/big-genus/obj9.off +[TIME] Simplification in one vertex: 0.105654 seconds +[TIME] Simplification in one face: 0.138156 seconds +[TIME] Face quadrangulation: 0.031414 seconds +[TIME] Total time for computation of reduced map: 0.276585 seconds +Initial map: #Darts=334212, #0-cells=55498, #1-cells=167106, #2-cells=111404, #ccs=1 +Reduced map: #Darts=824, #0-cells=2, #1-cells=412, #2-cells=206, #ccs=1 +Mesh data/big-genus-with-holes/obj10-1.000000-2.off +[TIME] Simplification in one vertex: 0.051923 seconds +[TIME] Simplification in one face: 0.07859 seconds +[TIME] Face quadrangulation: 0.017452 seconds +[TIME] Total time for computation of reduced map: 0.148973 seconds +Initial map: #Darts=197493, #0-cells=33955, #1-cells=100736, #2-cells=65831, #ccs=1 +Reduced map: #Darts=2594, #0-cells=211, #1-cells=1297, #2-cells=690, #ccs=1 +Mesh data/big-genus-with-holes/obj1-1.000000-2.off +[TIME] Simplification in one vertex: 0.001813 seconds +[TIME] Simplification in one face: 0.001997 seconds +[TIME] Face quadrangulation: 0.000637 seconds +[TIME] Total time for computation of reduced map: 0.004537 seconds +Initial map: #Darts=11079, #0-cells=1687, #1-cells=5650, #2-cells=3693, #ccs=1 +Reduced map: #Darts=892, #0-cells=5, #1-cells=446, #2-cells=203, #ccs=1 +Mesh data/big-genus-with-holes/obj11-1.000000-2.off +[TIME] Simplification in one vertex: 0.097106 seconds +[TIME] Simplification in one face: 0.14531 seconds +[TIME] Face quadrangulation: 0.031042 seconds +[TIME] Total time for computation of reduced map: 0.275295 seconds +Initial map: #Darts=321591, #0-cells=55737, #1-cells=164019, #2-cells=107197, #ccs=1 +Reduced map: #Darts=3050, #0-cells=367, #1-cells=1525, #2-cells=956, #ccs=1 +Mesh data/big-genus-with-holes/obj12-1.000000-2.off +[TIME] Simplification in one vertex: 0.088681 seconds +[TIME] Simplification in one face: 0.144801 seconds +[TIME] Face quadrangulation: 0.031967 seconds +[TIME] Total time for computation of reduced map: 0.267131 seconds +Initial map: #Darts=298413, #0-cells=50589, #1-cells=152202, #2-cells=99471, #ccs=1 +Reduced map: #Darts=5672, #0-cells=161, #1-cells=2836, #2-cells=1413, #ccs=1 +Mesh data/big-genus-with-holes/obj13-1.000000-2.off +[TIME] Simplification in one vertex: 0.049629 seconds +[TIME] Simplification in one face: 0.075687 seconds +[TIME] Face quadrangulation: 0.014603 seconds +[TIME] Total time for computation of reduced map: 0.140701 seconds +Initial map: #Darts=165912, #0-cells=28588, #1-cells=84592, #2-cells=55304, #ccs=1 +Reduced map: #Darts=1742, #0-cells=90, #1-cells=871, #2-cells=545, #ccs=1 +Mesh data/big-genus-with-holes/obj14-1.000000-2.off +[TIME] Simplification in one vertex: 0.244695 seconds +[TIME] Simplification in one face: 0.340334 seconds +[TIME] Face quadrangulation: 0.071015 seconds +[TIME] Total time for computation of reduced map: 0.659971 seconds +Initial map: #Darts=667356, #0-cells=115730, #1-cells=340370, #2-cells=222452, #ccs=1 +Reduced map: #Darts=5712, #0-cells=638, #1-cells=2856, #2-cells=1998, #ccs=1 +Mesh data/big-genus-with-holes/obj15-1.000000-2.off +[TIME] Simplification in one vertex: 1.34474 seconds +[TIME] Simplification in one face: 1.54192 seconds +[TIME] Face quadrangulation: 0.348176 seconds +[TIME] Total time for computation of reduced map: 3.25409 seconds +Initial map: #Darts=3167334, #0-cells=549481, #1-cells=1615459, #2-cells=1055778, #ccs=1 +Reduced map: #Darts=26678, #0-cells=3121, #1-cells=13339, #2-cells=9436, #ccs=1 +Mesh data/big-genus-with-holes/obj16-1.000000-2.off +[TIME] Simplification in one vertex: 0.002708 seconds +[TIME] Simplification in one face: 0.002982 seconds +[TIME] Face quadrangulation: 0.000796 seconds +[TIME] Total time for computation of reduced map: 0.006591 seconds +Initial map: #Darts=15681, #0-cells=2493, #1-cells=7993, #2-cells=5227, #ccs=1 +Reduced map: #Darts=880, #0-cells=9, #1-cells=440, #2-cells=201, #ccs=1 +Mesh data/big-genus-with-holes/obj17-1.000000-2.off +[TIME] Simplification in one vertex: 0.007083 seconds +[TIME] Simplification in one face: 0.010609 seconds +[TIME] Face quadrangulation: 0.002437 seconds +[TIME] Total time for computation of reduced map: 0.020382 seconds +Initial map: #Darts=36780, #0-cells=5494, #1-cells=18750, #2-cells=12260, #ccs=1 +Reduced map: #Darts=3372, #0-cells=19, #1-cells=1686, #2-cells=775, #ccs=1 +Mesh data/big-genus-with-holes/obj2-1.000000-2.off +[TIME] Simplification in one vertex: 0.002827 seconds +[TIME] Simplification in one face: 0.002946 seconds +[TIME] Face quadrangulation: 0.000779 seconds +[TIME] Total time for computation of reduced map: 0.006666 seconds +Initial map: #Darts=15555, #0-cells=2468, #1-cells=7932, #2-cells=5185, #ccs=1 +Reduced map: #Darts=948, #0-cells=13, #1-cells=474, #2-cells=225, #ccs=1 +Mesh data/big-genus-with-holes/obj3-1.000000-2.off +[TIME] Simplification in one vertex: 0.385589 seconds +[TIME] Simplification in one face: 0.519306 seconds +[TIME] Face quadrangulation: 0.111635 seconds +[TIME] Total time for computation of reduced map: 1.02332 seconds +Initial map: #Darts=996714, #0-cells=172645, #1-cells=508357, #2-cells=332238, #ccs=1 +Reduced map: #Darts=9820, #0-cells=1247, #1-cells=4910, #2-cells=3131, #ccs=1 +Mesh data/big-genus-with-holes/obj5-1.000000-2.off +[TIME] Simplification in one vertex: 0.019963 seconds +[TIME] Simplification in one face: 0.035344 seconds +[TIME] Face quadrangulation: 0.0059 seconds +[TIME] Total time for computation of reduced map: 0.061693 seconds +Initial map: #Darts=93777, #0-cells=15548, #1-cells=47826, #2-cells=31259, #ccs=1 +Reduced map: #Darts=3200, #0-cells=61, #1-cells=1600, #2-cells=787, #ccs=1 +Mesh data/big-genus-with-holes/obj6-1.000000-2.off +[TIME] Simplification in one vertex: 0.001449 seconds +[TIME] Simplification in one face: 0.00172 seconds +[TIME] Face quadrangulation: 0.000585 seconds +[TIME] Total time for computation of reduced map: 0.003816 seconds +Initial map: #Darts=8826, #0-cells=1315, #1-cells=4501, #2-cells=2942, #ccs=1 +Reduced map: #Darts=822, #0-cells=7, #1-cells=411, #2-cells=186, #ccs=1 +Mesh data/big-genus-with-holes/obj7-1.000000-2.off +[TIME] Simplification in one vertex: 0.001814 seconds +[TIME] Simplification in one face: 0.001931 seconds +[TIME] Face quadrangulation: 0.000688 seconds +[TIME] Total time for computation of reduced map: 0.004506 seconds +Initial map: #Darts=11064, #0-cells=1614, #1-cells=5646, #2-cells=3688, #ccs=1 +Reduced map: #Darts=1146, #0-cells=4, #1-cells=573, #2-cells=257, #ccs=1 +Mesh data/big-genus-with-holes/obj8-1.000000-2.off +[TIME] Simplification in one vertex: 0.004751 seconds +[TIME] Simplification in one face: 0.00573 seconds +[TIME] Face quadrangulation: 0.00114 seconds +[TIME] Total time for computation of reduced map: 0.011759 seconds +Initial map: #Darts=28500, #0-cells=4727, #1-cells=14534, #2-cells=9500, #ccs=1 +Reduced map: #Darts=918, #0-cells=20, #1-cells=459, #2-cells=211, #ccs=1 +Mesh data/big-genus-with-holes/obj9-1.000000-2.off +[TIME] Simplification in one vertex: 0.096304 seconds +[TIME] Simplification in one face: 0.148061 seconds +[TIME] Face quadrangulation: 0.030264 seconds +[TIME] Total time for computation of reduced map: 0.276335 seconds +Initial map: #Darts=320889, #0-cells=55616, #1-cells=163663, #2-cells=106963, #ccs=1 +Reduced map: #Darts=3042, #0-cells=362, #1-cells=1521, #2-cells=959, #ccs=1 +Mesh data/big/happy.off +[TIME] Simplification in one vertex: 1.40868 seconds +[TIME] Simplification in one face: 1.77778 seconds +[TIME] Face quadrangulation: 0.340586 seconds +[TIME] Total time for computation of reduced map: 3.54039 seconds +Initial map: #Darts=3263148, #0-cells=543652, #1-cells=1631574, #2-cells=1087716, #ccs=1 +Reduced map: #Darts=832, #0-cells=2, #1-cells=416, #2-cells=208, #ccs=1 +Mesh data/big/iphigenia.off +[TIME] Simplification in one vertex: 0.760665 seconds +[TIME] Simplification in one face: 1.06874 seconds +[TIME] Face quadrangulation: 0.192173 seconds +[TIME] Total time for computation of reduced map: 2.03018 seconds +Initial map: #Darts=2110536, #0-cells=351750, #1-cells=1055268, #2-cells=703512, #ccs=1 +Reduced map: #Darts=32, #0-cells=2, #1-cells=16, #2-cells=8, #ccs=1 +Mesh data/big/xyzrgb_statuette.off +[TIME] Simplification in one vertex: 14.6903 seconds +[TIME] Simplification in one face: 16.1494 seconds +[TIME] Face quadrangulation: 2.88612 seconds +[TIME] Total time for computation of reduced map: 33.841 seconds +Initial map: #Darts=30000000, #0-cells=4999996, #1-cells=15000000, #2-cells=10000000, #ccs=1 +Reduced map: #Darts=24, #0-cells=2, #1-cells=12, #2-cells=6, #ccs=1 diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/path_homotopy_with_schema.cpp b/Surface_mesh_topology/benchmark/Surface_mesh_topology/path_homotopy_with_schema.cpp new file mode 100644 index 00000000000..025f4fefd83 --- /dev/null +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/path_homotopy_with_schema.cpp @@ -0,0 +1,168 @@ +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////////// +[[ noreturn ]] void usage(int /*argc*/, char** argv) +{ + std::cout<<"usage: "<(std::stoi(std::string(argv[++i]))); + } + else if (arg=="-nbedges") + { + if (i==argc-1) + { error_command_line(argc, argv, "Error: no number after -nbedges option."); } + withE=true; + E=static_cast(std::stoi(std::string(argv[++i]))); + } + else if (arg=="-nbtests") + { + if (i==argc-1) + { error_command_line(argc, argv, "Error: no number after -nbtests option."); } + N=static_cast(std::stoi(std::string(argv[++i]))); + } + else if (arg=="-seed") + { + if (i==argc-1) + { error_command_line(argc, argv, "Error: no number after -seed option."); } + random=CGAL::Random(static_cast(std::stoi(std::string(argv[++i])))); // initialize the random generator with the given seed + } + else if (arg=="-time") + { time=true; } + else if (arg=="-h" || arg=="--help" || arg=="-?") + { usage(argc, argv); } + else if (arg[0]=='-') + { std::cout<<"Unknown option "< cm; + cm.add_facet(scheme); + std::cout<<"Initial map: "; + cm.display_characteristics(std::cout) << ", valid=" + << cm.is_valid() << std::endl; + + Curves_on_surface_topology > smct(cm, time); + smct.compute_minimal_quadrangulation(time); + std::cout<<"Reduced map: "; + smct.get_minimal_quadrangulation().display_characteristics(std::cout) + << ", valid="<< smct.get_minimal_quadrangulation().is_valid() << std::endl; + + unsigned int nbcontractible=0; + std::vector errors_seeds; + + for (unsigned int i=0; i::max())); + } + std::cout<<"Random seed: "<(random.get_int + (10, std::max(std::size_t(11), + cm.number_of_darts()/10))); } + + if (!withD) + { D=static_cast(random.get_int + (10, std::max(std::size_t(11), + cm.number_of_darts()/10))); } + + + + Path_on_surface> path1(cm); + path1.generate_random_closed_path(E, random); + + std::cout<<"Path1 size: "<> deformed_path1(path1); + deformed_path1.update_path_randomly(D, random); + std::cout<<"Path2 size: "< +#include +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +int main(int argc, char** argv) +{ + std::string file; + for (unsigned i=1; i cst(map, true); + std::cout << "Mesh " << file << std::endl; + cst.compute_minimal_quadrangulation(true); + + std::cout<<"Initial map: "; + map.display_characteristics(std::cout)< res-quadrangulation-computation.txt +fi + +# Bench 2 +if [ ${BENCH} = ALL -o ${BENCH} = 2 ] +then + all_files="data/big/happy.off data/big-genus/obj9.off" + rm -f res-path-homotopy.txt + for file in ${all_files} + do + ./path_homotopy -L 100 10000 -D 100 10000 -N 100 $file -time >> res-path-homotopy.txt + done +fi + +# Bench 3 +if [ ${BENCH} = ALL -o ${BENCH} = 3 ] +then + rm -f res-polygonal-schema.txt + for k in 10 20 30 100 200 300 1000 2000 3000 10000 20000 30000 100000 200000 300000 1000000 2000000 3000000 10000000 20000000 30000000 + do + ./path_homotopy_with_schema "a b -a -b c d -c -d e f -e -f g h -g -h i j -i -j" -nbedges ${k} -nbdefo 100 -nbtests 10 -time >> res-polygonal-schema.txt + done +fi diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h new file mode 100644 index 00000000000..3333408992a --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h @@ -0,0 +1,39 @@ + +namespace CGAL { +namespace Surface_mesh_topology { + /*! + \ingroup PkgSurfaceMeshTopologyClasses + + The class `Curves_on_surface_topology` provides methods to test homotopy on paths. Each object of this class is constructed from an external mesh, either a \ref CombinatorialMap "2D combinatorial map" or a model of a FaceGraph. It maintains a correspondence between this mesh and an internal representation, computed the first time an homotopy test is called. The user must not modify the input surface as long as homotopy tests are performed with this `Curves_on_surface_topology`. + + \tparam Mesh a model of `CombinatorialMap` or of `FaceGraph` + */ + template + class Curves_on_surface_topology + { + public: + + /*! creates a `Curves_on_surface_topology` object using `amesh` as input. + */ + Curves_on_surface_topology(const Mesh& amesh); + + /*! returns `true` if the closed paths `p1` and `p2` are freely homotopic. + * @pre `p1` and `p2` must be two paths on `amesh`. + */ + bool are_freely_homotopic(const Path_on_surface& p1, + const Path_on_surface& p2) const; + + /*! returns `true` if the paths `p1` and `p2` are homotopic with fixed endpoints. The paths `p1` and `p2` must have the same endpoints but must not be closed. Equivalent to `Curves_on_surface_topology::is_contractible(q)` where `q` is the concatenation of `p1` and the reverse of `p2`. + * @pre `p1` and `p2` must be two paths on `amesh`. + */ + bool are_homotopic_with_fixed_endpoints(const Path_on_surface& p1, + const Path_on_surface& p2) const; + + /*! returns `true` if the closed path `p` is contractible. + * @pre `p` must be a closed path on `amesh`. + */ + bool is_contractible(const Path_on_surface& p) const; + }; + +} +} diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Path_on_surface.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Path_on_surface.h new file mode 100644 index 00000000000..bc14ea01857 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Path_on_surface.h @@ -0,0 +1,93 @@ + +namespace CGAL { +namespace Surface_mesh_topology { + /*! + \ingroup PkgSurfaceMeshTopologyClasses + + The class `Path_on_surface` represents a walk in a mesh which is either a model of `CombinatorialMap`, a model of `GeneralizedMap` or a model of a `FaceGraph`. Each object of this class is constructed from an external mesh on which the path should lie. A path is represented as a sequence of darts or halfedges, each one representing an oriented edge in the path. The class `Path_on_surface` behaves as a container for this sequence of darts/halfedges. Elements are added in the path one at a time to the path thanks to the `push_back()` method. + + \tparam Mesh a model of `CombinatorialMap`, `GeneralizedMap` or of `FaceGraph` + */ + template + class Path_on_surface + { + public: + /*! + %halfedge_descriptor type. A handle to Dart for combinatorial/generalized maps, or a halfedge descriptor for models of FaceGraph. + */ + typedef unspecified_type halfedge_descriptor; + + /// creates an empty path object which lies on `amesh`. + Path_on_surface(const Mesh& amesh); + + /// returns `true` iff this path is empty + bool is_empty() const; + + /// returns `true` iff this path is closed. + bool is_closed() const; + + /// returns `true` iff this path does not pass twice through a same edge or a same vertex. + bool is_simple() const; + + /// returns the length of the path, i.e. its number of edges. + std::size_t length() const; + + /// returns the ith dart of the path. + /// @pre i<`length()`. + halfedge_descriptor operator[] (std::size_t i) const; + + /// clears this path. + void clear(); + + /// returns `true` iff `hd` can be added at the end of this path. + bool can_be_pushed(halfedge_descriptor hd) const; + + /// adds `hd` at the end of this path. + /// @pre `can_be_pushed(hd)` + void push_back(halfedge_descriptor hd); + + /// returns `true` iff the dart/halfedge with index `i` can be added at the end of this path. + /// If Mesh is a `Polyhedron_3`, takes time proportional to the number of darts/halfedges. + bool can_be_pushed_by_index(std::size_t i) const; + + /// adds the dart/halfedge with index `i` at the end of this path. + /// If Mesh is a `Polyhedron_3`, takes time proportional to the number of halfedges. + /// @pre `can_be_pushed_by_index(i)` + void push_back_by_index(std::size_t i); + + /// adds successively all dart/halfedges in `l` (a sequence of indices), at the end of the path. + /// If Mesh is a `Polyhedron_3`, takes time proportional to the number of halfedges. + /// For each index `i`, `can_be_pushed_by_index(i)` should be true. + void push_back_by_index(std::initializer_list l); + + /// adds the dart/halfedge obtained by turning `nb` times around the target vertex of the last dart/halfedge in this path, in the positive circular order. To extend with a positive 1 turn thus amounts to extend with the `next()` pointer. (A zero turn corresponds to the `opposite()` pointer.) + /// @pre !`is_empty()` + void extend_positive_turn(std::size_t nb); + + /// adds the dart/halfedge obtained by turning `nb` times around the target vertex of the last dart/halfedge in this path, in the negative circular order. To extend with a negative 1 turn thus amounts to extend with the composite pointer: `opposite(prev(opposite()))`. + /// @pre !`is_empty()` + void extend_negative_turn(std::size_t nb); + + /// returns `true` iff the dart/halfedge with label `l` can be added at the end of this path. + /// @pre Mesh must be a model of `PolygonalSchema` concept. + bool can_be_pushed_by_label(const std::string& l) const; + + /// adds successively all darts/halfedges in `s` (a sequence of labels separated by spaces) at the end of this path. For each label, l, `can_be_pushed_by_label(l)` should be true. + /// @pre Mesh must be a model of `PolygonalSchema` concept. + void push_back_by_label(const std::string& s); + + /// concatenates `other` to this path. + /// @pre the last vertex of this path should coincide with the first vertex of `other`. + Self& operator+=(const Self& other); + + /// reverses this path (i.e. negates its orientation). + void reverse(); + + /// creates a random open path with `length` darts/halfedges. + void generate_random_path(std::size_t length, Random& random=get_default_random()); + + /// creates a random closed path with at least `length` darts/halfedges. + void generate_random_closed_path(std::size_t length, Random& random=get_default_random()); + }; +} +} diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema.h new file mode 100644 index 00000000000..31a267f6833 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema.h @@ -0,0 +1,32 @@ + +namespace CGAL { +namespace Surface_mesh_topology { + /*! + \ingroup PkgSurfaceMeshTopologyClasses + + The class `Polygonal_schema_with_combinatorial_map` is a model of `PolygonalSchema` using `Combinatorial_map` as underlying model. + + \tparam Items a model of the `PolygonalSchemaItems` concept. Equal to `Polygonal_schema_min_items` by default. + + \tparam Alloc has to match the standard allocator requirements. The `rebind` mechanism `Alloc` will be used to create appropriate allocators internally with value type `Dart`. Equal to `CGAL_ALLOCATOR(int)` from `` by default. + */ + template + class Polygonal_schema_with_combinatorial_map: public CGAL::Combinatorial_map<2, Items, Alloc> + { + }; + + /*! + \ingroup PkgSurfaceMeshTopologyClasses + + The class `Polygonal_schema_with_generalized_map` is a model of `PolygonalSchema` using `Generalized_map` as underlying model. + + \tparam Items a model of the `PolygonalSchemaItems` concept. Equal to `Polygonal_schema_min_items` by default. + + \tparam Alloc has to match the standard allocator requirements. The `rebind` mechanism `Alloc` will be used to create appropriate allocators internally with value type `Dart`. Equal to `CGAL_ALLOCATOR(int)` from `` by default. + */ + template + class Polygonal_schema_with_generalized_map: public CGAL::Generalized_map<2, Items, Alloc> + { + }; +} +} diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h new file mode 100644 index 00000000000..db4bfee78f9 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h @@ -0,0 +1,39 @@ + +namespace CGAL { +namespace Surface_mesh_topology { +/*! +\ingroup PkgSurfaceMeshTopologyClasses + +The class `Polygonal_schema_min_items` defines a struct with a std::string as the information associated with darts, and no attribute is enabled. + +\cgalModels `PolygonalSchemaItems` + +\cgalHeading{Example} + +The following example shows one implementation of the `Polygonal_schema_min_items` class. + +\code{.cpp} + +struct Polygonal_schema_min_items +{ + template + struct Dart_wrapper + { + struct Info_for_darts + { std::string m_label; }; + typedef Info_for_darts Dart_info; + }; +}; + +\endcode + +\sa `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map` +\sa `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map` + +*/ +struct Polygonal_schema_min_items { + +}; /* end Linear_cell_complex_min_items */ + +} /* end namespace Surface_mesh_topology */ +} /* end namespace CGAL */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h new file mode 100644 index 00000000000..ea0e0480c2f --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h @@ -0,0 +1,17 @@ +namespace CGAL { + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `paths`. +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the flag CGAL_USE_BASIC_VIEWER is defined at compile time. +\tparam Mesh either a 2D linear cell complex or a model of the FaceGraph concept. +\param amesh the mesh to draw. +\param apaths the paths to draw, which should lie on `amesh`. +*/ +template +void draw(const Mesh& amesh, + const std::vector >& apaths); + +} /* namespace CGAL */ + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h new file mode 100644 index 00000000000..6159fca89b3 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h @@ -0,0 +1,65 @@ +/*! + \ingroup PkgSurfaceMeshTopologyConcepts + \cgalConcept + + The concept `PolygonalSchema` defines a 2D polygonal schema, i.e. a combinatorial surface with labeled edges. A PolygonalSchema is created incrementally by adding facets one at a time. A label is any word, that does not contain a space. + + PolygonalSchema::Dart_info should be a class having a public data member std::string m_label. + PolygonalSchema::dimension should be equal to 2. + + \cgalRefines GenericMap + + \cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`\endlink + \cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map`\endlink + */ + +class PolygonalSchema +{ +public: + /// creates an empty `PolygonalSchema` object. + PolygonalSchema(); + + /// starts a new facet. + void init_facet(); + + /// finishes the current facet. Returns the first dart of this facet. + /// @pre A facet is under creation. + Dart_handle finish_facet(); + + /// adds one edge to the current facet, given by its label `l` (any string containing no space, using minus sign for orientation). + /// Since the surface is oriented, each label can be used only twice with opposite signs. If this method is called with a label already used, with same sign, an error message is given and this label is ignored. + /// @pre A facet is under creation. + void add_edge_to_facet(const std::string& l); + + /// adds the given edges to the current facet. + /// `s` is a sequence of labels, separated by spaces. All the corresponding edges are added into the current facet. + /// @pre A facet is under creation. + void add_edges_to_facet(const std::string& s); + + /// adds directly one facet giving the sequence of labels `s` of all its edges (labels are separated by spaces). + void add_facet(const std::string& s); + + /// returns the label of dart `dh`. + std::string get_label(Dart_handle dh) const; + + /// returns dart with label `s`, NULL if this label is not used. + Dart_handle get_dart_labeled(const std::string & s) const; + + /// returns true iff the facet containing `dh` is perforated. + bool is_perforated(Dart_const_handle dh) const; + + /// Shortcut for is_perforated(get_dart_labeled(s)). + bool is_perforated(const std::string & s) const; + + /// perforates the facet containing `dh`. Returns the number of darts of the face; 0 if the facet was already perforated. + size_type perforate_facet(Dart_handle dh); + + /// Shortcut for perforate_facet(get_dart_labeled(s)). + size_type perforate_facet(const std::string & s); + + /// fills the facet containing `dh`. Returns the number of darts of the face; 0 if the facet was already filled. + size_type fill_facet(Dart_handle dh); + + /// Shortcut for fill_facet(get_dart_labeled(s)). + size_type fill_facet(const std::string & s); +}; diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h new file mode 100644 index 00000000000..ec6d956b8f1 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h @@ -0,0 +1,15 @@ +/*! + \ingroup PkgSurfaceMeshTopologyConcepts + \cgalConcept + + The concept `PolygonalSchemaItems` allows to customize a PolygonalSchema by choosing the information associated with darts, and by enabling and disabling some attributes. `%Dart_wrapper::%Dart_info`, should be a class having a public data member std::string m_label. + + \cgalRefines GenericMapItems + + \cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_min_items `CGAL::Surface_mesh_topology::Polygonal_schema_min_items`\endlink + */ + +class PolygonalSchemaItems +{ +public: +}; diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Doxyfile.in b/Surface_mesh_topology/doc/Surface_mesh_topology/Doxyfile.in new file mode 100644 index 00000000000..7b169ab8389 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Doxyfile.in @@ -0,0 +1,3 @@ +@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + +PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Surface Mesh Topology" diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt new file mode 100644 index 00000000000..6918bfb43cd --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt @@ -0,0 +1,49 @@ +/// \defgroup PkgSurfaceMeshTopology Surface Mesh Topology Reference + +/// \defgroup PkgSurfaceMeshTopologyConcepts Concepts +/// \ingroup PkgSurfaceMeshTopology + +/// \defgroup PkgSurfaceMeshTopologyClasses Classes +/// \ingroup PkgSurfaceMeshTopology + +/*! + \code + #include + \endcode +*/ +/// \defgroup PkgDrawFaceGraphWithPaths Draw a Mesh with Paths +/// \ingroup PkgSurfaceMeshTopology + + +/*! +\addtogroup PkgSurfaceMeshTopology +\cgalPkgDescriptionBegin{Surface Mesh Topology,PkgSurfaceMeshTopologySummary} +\cgalPkgPicture{surface-mesh-topology-logo.png} +\cgalPkgSummaryBegin +\cgalPkgAuthor{Guillaume Damiand, Francis Lazarus} +\cgalPkgDesc{This package provides methods for testing if two (closed) paths on a combinatorial surface are homotopic. The user can choose between free homotopy and homotopy with fixed endpoints. A contractibility test is also provided; it amounts to test homotopy with the constant path. After an initialization step that takes linear time in the size of the input surface, the homotopy tests are performed in linear time in the size of the input curves.} +\cgalPkgManuals{Chapter_Surface_Mesh_Topology,PkgSurfaceMeshTopology} +\cgalPkgSummaryEnd +\cgalPkgShortInfoBegin +\cgalPkgSince{5.1} +\cgalPkgBib{cgal:dl-smtopology} +\cgalPkgLicense{\ref licensesGPL "GPL"} +\cgalPkgShortInfoEnd +\cgalPkgDescriptionEnd + +\cgalClassifedRefPages + +\cgalCRPSection{Concepts} +- `PolygonalSchema` +- `PolygonalSchemaItems` + +\cgalCRPSection{Classes} +- `CGAL::Surface_mesh_topology::Curves_on_surface_topology` +- `CGAL::Surface_mesh_topology::Path_on_surface` +- `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map` +- `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map` +- `CGAL::Surface_mesh_topology::Polygonal_schema_min_items` + +\cgalCRPSubsection{Draw a Mesh with Paths} +- \link PkgDrawFaceGraphWithPaths CGAL::draw() \endlink +*/ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt new file mode 100644 index 00000000000..8891b136db9 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt @@ -0,0 +1,200 @@ +namespace CGAL { +/*! + +\mainpage User Manual +\anchor Chapter_Surface_Mesh_Topology +\anchor ChapterSurfaceMeshTopology + +\cgalAutoToc +\author Guillaume Damiand and Francis Lazarus + +This package provides an algorithm to test if a curve on a combinatorial surface can be continuously deformed into another curve. + +\section SMTopology Introduction + +Given a curve drawn on a surface one can ask if the curve can be continuously deformed to a point (i.e. a zero length curve). In other words, does there exist a continuous sequence of curves on the surface that starts with the input curve and ends to a point? Curves that deform to a point are said contractible. Any curve on a sphere is contractible but this is not true for all curves on a torus or on a surface with more complicated topology. The algorithms in this package are purely topological and do not assume any geometry on the input surface. In particular, the surface is not necessarily embedded in a Euclidean space. + +The algorithm implemented in this package builds a data structure to efficiently answer queries of the following forms: +- Given a combinatorial surface \f$\cal{M}\f$ and a closed curve specified as a sequence of edges of \f$\cal{M}\f$, decide if the curve is contractible on \f$\cal{M}\f$, +- Given a combinatorial surface \f$\cal{M}\f$ and two closed curves on \f$\cal{M}\f$, decide if the two curves are related by a continuous transformation, +- Given a combinatorial surface \f$\cal{M}\f$ and two non-necessarily closed curves on \f$\cal{M}\f$, decide if the two curves are related by a continuous transformation that fixes the curve extremities. The curves should have common endpoints, otherwise the answer to the query is trivially negative. + +The second query asks if the curves are freely homotopic while the third one asks if the curves are homotopic with fixed endpoints. The three queries are globally referred to as homotopy tests. \cgalFigureRef{fig_sm_topology_homotopy} below illustrates the three types of queries. + +\cgalFigureBegin{fig_sm_topology_homotopy, free-vs-fixed-endpoints.svg} + On the upper left surface the green curve is contractible. The red and blue curves share the same (green) endpoint. (Being closed, their two endpoints coincide.) Although these last two curves are not homotopic with fixed endpoints they are freely homotopic as shown by the suggested continuous transformation of the blue curve. +\cgalFigureEnd + +The algorithms used are based on a paper by Erickson and Whittlesey \cgalCite{ew-tcsr-13}, providing a linear time algorithm for the above homotopy tests. This is a simplified version of the linear time algorithm by Lazarus and Rivaud \cgalCite{lr-hts-12}. + +\section SMTopology_HowToUse API Description + +\subsection SMTopology_Input Specifying the Input Surface and Curves + +The homotopy tests are performed on a input surface represented as a model of `CombinatorialMap` or any model of `FaceGraph`. Note that combinatorial maps are based on darts and FaceGraphs are based on halfedges. To avoid repetitions we use the terms darts and halfedges interchangeably in the sequel. +The input surface is supposed to be connected and orientable. +The main class for this package is `Surface_mesh_topology::Curves_on_surface_topology`. Its constructor takes the input surface. An internal representation of the surface (described below) is computed the first time an homotopy test is called. + +Each curve on this surface is contained in an instance of the class `Surface_mesh_topology::Path_on_surface`. An object in this class behaves as a list. This list is initially empty and the halfedges corresponding to the sequence of consecutive oriented edges of an input curve should be pushed back in this list. The class provides four ways for extending a nonempty path. +- Simply push the next halfedge using the \ref Surface_mesh_topology::Path_on_surface::push_back "push_back()" member function. +- The user may push the index of the next halfedge instead of the halfedge itself with the member function \ref Surface_mesh_topology::Path_on_surface::push_back_by_index "push_back_by_index()". This may however be at the cost of an overhead computation mapping the index to the actual dart. +- The path may be extended with the member function \ref Surface_mesh_topology::Path_on_surface::extend_positive_turn "extend_positive_turn()" by specifying the next halfedge thanks to a number of positive turns with respect to the previous dart/halfedge in the path. Calling this previous halfedge `h`, extending by a positive one turn is thus equivalent to extend the path with `next(h)`. An analogous member function \ref Surface_mesh_topology::Path_on_surface::extend_negative_turn "extend_negative_turn()" is provided for convenience. +- Finally, when the input surface is a model of `PolygonalSchema`, which is a model of `GenericMap` with labeled edges as explained in section \ref SMTopology_Schema, the user may push the label of the next halfedge instead of the halfedge itself with the member function \ref Surface_mesh_topology::Path_on_surface::push_back_by_label "push_back_by_label()". + +In the first two cases, the source vertex of the added dart should coincide with the target vertex of the last dart in the path. The user is responsible for ensuring this condition. The member functions \ref Surface_mesh_topology::Path_on_surface::can_be_pushed "can_be_pushed()", \ref Surface_mesh_topology::Path_on_surface::can_be_pushed_by_index "can_be_pushed_by_index()" and \ref Surface_mesh_topology::Path_on_surface::can_be_pushed_by_label "can_be_pushed_by_label()" return `true` if and only if the condition is satisfied. + +\subsection SMTopology_Schema Polygonal Schema Helper +\subsubsection SMTopology_PL Polygonal Schema +Specifying a path on a combinatorial surface might be a tedious task. Indeed, knowing in advance the pointer, index or turn of each consecutive halfedge in a path is not always easy. In order to facilitate this task, we provide an intuitive model of `CombinatorialMap` called `Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`, a model of the `PolygonalSchema` concept. In this model, a surface is viewed as a collection of clockwise oriented polygonal facets with labeled boundary (oriented) edges. Boundary edges with the same label are glued together to form a surface. Each label should appear at most twice in the collection and a label that appears only once corresponds to a boundary edge. The label of the opposite of an oriented edge is preceded by a minus. For example, the opposite of 'a1' is '-a1'. Since we are dealing with orientable surfaces only, each label that appears twice must appear once with a minus. +The user can add facets to the surface one at a time. Each facet is specified by the sequence of its oriented edge labels given as a string where the labels are words (any sequence of characters, except space) separated by blank spaces. In the next figure we see three examples of combinatorial maps described by a collection of facets with labeled edges. +\cgalFigureBegin{fig_sm_incremental-builder, incremental-builder.svg} + Left, a surface described by a single facet with eight edges pairwise identified. The resulting (topological) surface is shown in \cgalFigureRef{fig_cut-open}. Middle, a surface described by three labeled quadrilaterals. Right, a single labeled facet. The corresponding surface is topologically equivalent to the middle example. +\cgalFigureEnd +The code for creating the above left and middle examples appear in the \ref SMTopology_Example_II "polygonal schema examples" below. +The class provides the following functionalities. +- \ref PolygonalSchema::add_facet "add_facet(s)" adds a polygon to the current collection of polygons. If the polygon has "n" sides, "s" is a sequence of "n" edge labels possibly preceded by a minus and separated by blanks. +- alternatively, the user can add a facet by adding edge labels one at a time using the member functions \ref PolygonalSchema::init_facet "init_facet()", \ref PolygonalSchema::add_edges_to_facet "add_edges_to_facet()" and \ref PolygonalSchema::finish_facet "finish_facet()" + +\subsubsection SMTopology_PL_with_Boundary Polygonal Schema with Boundary +As noted in the previous section \ref SMTopology_PL "Polygonal Schema", every label that appears only once in a polygonal schema corresponds to a boundary edge. The Polygonal Schema helper offers another mechanism to create surfaces with boundary. Each facet already added to a polygonal schema may be perforated to create a hole in the surface. The edges of a perforated facet thus becomes boundary edges. The reverse operation consists in filling the supposedly perforated facet. The class provides the following interface. +- \ref PolygonalSchema::perforate_facet "perforate_facet (h)" perforates the facet identified by the halfedge `h`. If `s` is the label of the oriented edge corresponding to `h`, one may equivalently call perforate_facet (s). +- Similarly, \ref PolygonalSchema::fill_facet "fill_facet (h or s)" turns a facet into a plain one. +- The member functions \ref PolygonalSchema::get_dart_labeled "get_dart_labeled(s)" and \ref PolygonalSchema::get_label "get_label(h)" allow to easily pass from a halfedge to its label and vice versa. + +As an example, one may perforate all the facets of a polygonal schema \f$\cal{M}\f$ to obtain a "skeleton" surface equivalent to a thickening of the graph composed of the edges of \f$\cal{M}\f$. + +\subsubsection SMTopology_Curves_on_PS Curves on Polygonal Schema +A `Surface_mesh_topology::Curves_on_surface_topology` can be constructed with a `Surface_mesh_topology::Polygonal_schema_with_combinatorial_map` as input surface. In this case, every halfedge has a label (possibly preceded by a minus) and a path can be specified by the sequence of labels corresponding to its halfedge sequence. A repeated call to the function \ref Surface_mesh_topology::Path_on_surface::push_back_by_label "push_back_by_label()" allows the user to specify the path in this way. + +\subsection SMTopology_DS Data Structure Presentation + +\subsubsection SMTopology_Build Building the Internal Surface Representation + +A common first step in the homotopy test algorithms is to simplify the input combinatorial surface. This preprocessing step is done once and for all for a given mesh, the first time an homotopy test is called. The simplified surface is a quadrangulation, every face of which is a quadrilateral, stored in a `Surface_mesh_topology::Curves_on_surface_topology`. It has 2 vertices and \f$2g\f$ quadrilaterals where \f$g\f$ is the genus of +the input surface. This is otherwise independent of the size of input surface, +\note The user must not modify the input surface as long as homotopy tests are performed with this `Surface_mesh_topology::Curves_on_surface_topology`. + +Each time a `Surface_mesh_topology::Path_on_surface` is provided for a homotopy test, it is first transformed to an equivalent path in the quadrangulation stored by the `Surface_mesh_topology::Curves_on_surface_topology`. This transformation is transparent to the user who has never access to the quadrangulation. + +\subsection SMTopology_Queries Testing Homotopy + +Given two `Surface_mesh_topology::Path_on_surface` \f$p_1\f$ and \f$p_2\f$, the class `Surface_mesh_topology::Curves_on_surface_topology` provides the following three functions: + +- \ref Surface_mesh_topology::Curves_on_surface_topology::is_contractible "is_contractible"(\f$p_1\f$) returns `true` if the closed curve \f$p_1\f$ is contractible. + +- \ref Surface_mesh_topology::Curves_on_surface_topology::are_freely_homotopic "are_freely_homotopic"(\f$p_1\f$, \f$p_2\f$) returns `true` if the closed curves \f$p_1\f$ and \f$p_2\f$ are freely homotopic. + +- \ref Surface_mesh_topology::Curves_on_surface_topology::are_homotopic_with_fixed_endpoints "are_homotopic_with_fixed_endpoints"(\f$p_1\f$, \f$p_2\f$) returns `true` if the paths \f$p_1\f$ and \f$p_2\f$ are homotopic with fixed endpoints. This call is equivalent to \ref Surface_mesh_topology::Curves_on_surface_topology::is_contractible "is_contractible"(\f$p_1\cdot \overline{p_2}\f$), where \f$p_1\cdot \overline{p_2}\f$ is the concatenation of \f$p_1\f$ and the reverse of \f$p_2\f$. + + + +\section SMTopology_Examples Examples +\subsection SMTopology_Example_I Simple Example +The following example shows how to load an off file and how to create three closed paths on this surface. Contractibility and free homotopy tests are then performed. The example also shows how to use the \cgal viewer if \cgal was compiled with Qt5. +\cgalExample{Surface_mesh_topology/basic_example_surface_mesh_topology.cpp} + +\subsection SMTopology_Example_II Polygonal Schema Examples +Here, we show with two examples how to create a surface from a list of faces specified by edge label sequences. +In this first example, we build a genus two torus surface from a single face, also called a polygonal schema. See left \cgalFigureRef{fig_sm_incremental-builder} for an illustration. Two closed paths are then created. The paths are freely homotopic but not homotopic with fixed endpoint. +\cgalExample{Surface_mesh_topology/path_homotopy_with_symbols.cpp} + +In this second example, we build a genus two torus surface from a set of three squares. See middle \cgalFigureRef{fig_sm_incremental-builder} for an illustration. The first two faces are added each with a single call to the member function `add_facet()`. The third face is build incrementally by adding its edge labels one at a time. We then create a contractible closed path. +\cgalExample{Surface_mesh_topology/path_homotopy_with_symbols_2.cpp} + +\subsection SMTopology_Example_III Open Path Example + +In this third example, we create non closed paths on the same mesh as in the first example and perform homotopy tests with fixed endpoints. Here, a `Surface_mesh` is used as an alternative to a `CombinatorialMap`. +\cgalExample{Surface_mesh_topology/open_path_homotopy.cpp} + +\section SMTopology_Benchmarks Benchmarks + +The machine used is a PC running Ubuntu 18.04 with an Intel CPU Core i7-4790 CPU clocked at 3.60GHz with 32GB of RAM. + +\subsection SMTopology_bench1 Combinatorial Surface Topology Computation Time + +The first time an homotopy test is called, we build a special quadrangulation of the surface as internal representation (as explained in Section \ref SMTopology_Theory "Implementation Details"). The complexity of this operation is linear in the number of darts of the input surface, as we can see in \cgalFigureRef{fig_sm_topology_bench1}. + +For this benchmark, we computed 38 `Surface_mesh_topology::Curves_on_surface_topology` objects for different input surfaces with different number of darts (between 8,000 and 30,000,000). We show in the figure the computation time of the quadrangulation according to the number of darts of the input surface. We remind that this computation needs be done only once if you want to perform several path homotopy tests on the same surface. + +\cgalFigureBegin{fig_sm_topology_bench1, computation-time-reduce-surface.svg} + Computation time of `Surface_mesh_topology::Curves_on_surface_topology` constructions, according to the number of darts or the input surface. +\cgalFigureEnd + +\subsection SMTopology_bench2 Path Homotopy Tests + +In this second benchmark, we use two surfaces as input (with respectively 543,652 vertices, 1,631,574 edges and 1,087,716 faces, and 55,498 vertices, 167,106 edges and 111,404 faces). We generate 100 random pairs of closed paths on each surface. The first path is generated randomly, with a lower bound for its length given by a random number between 100 and 10,000: passed the lower bound, the path is randomly extended until it returns to its origin vertex. The second path is generated from a sequence of elementary deformations of the first path, so that the two paths are homotopic. The number of elementary deformations is a random number between 100 and 10,000. + +The computation time of the 200 `are_freely_homotopic()` tests are given in \cgalFigureRef{fig_sm_topology_bench2}, according to the number of darts of the two input paths. + +\cgalFigureBegin{fig_sm_topology_bench2, computation-time-path-homotopy.svg} + Computation time of `are_freely_homotopic()` tests, according to the number of darts or the input paths. +\cgalFigureEnd + +The third benchmark is similar to the previous one, except that we use a genus 5 surface with one vertex, 10 edges and 1 face. The length of the paths to be tested is varied between 10 and 30,000,000. The computation time of the `are_freely_homotopic()` tests are given in \cgalFigureRef{fig_sm_topology_bench3}. The free homotopy test takes 17 seconds for paths of length 10,000,000. +\cgalFigureBegin{fig_sm_topology_bench3, computation-time-polygonal-schema.svg} + Computation time of `are_freely_homotopic()` tests, according to the number of darts or the input paths for random paths on the canonical reduced surface of genus five. +\cgalFigureEnd + +Note that the linear time implementation of the algorithms is remarkably observed in each benchmark. + +\section SMTopology_Theory Implementation Details + +\subsection SMTopology_Quad_System Reducing to a Quadrangulation + +A quadrangulation is a combinatorial map whose faces are quadrilaterals, i.e. have four sides. +For efficiency of the homotopy test, the input combinatorial surface \f$\cal{M}\f$ is first turned into a quadrangulation with only two vertices. The transformation is performed as follows. +-# A spanning tree of the graph composed of the vertices and edges of \f$\cal{M}\f$ is computed. See \cgalFigureRef{fig_spanning_tree}. + \cgalFigureBegin{fig_spanning_tree,spanning_tree.svg} + Left, a combinatorial map with three faces (red, yellow, green). Right, a spanning tree of its graph. + \cgalFigureEnd + +-# The edges of the spanning are contracted. The resulting surface has the same topology as \f$\cal{M}\f$ and has a single vertex. + \cgalFigureBegin{fig_contract_tree,contract_tree.svg} + The contraction of a spanning tree merges all the vertices into a single vertex. + \cgalFigureEnd + +-# The faces are merged into a single face by iteratively erasing edges incident to distinct faces. Those edges corresponds to a spanning tree of the dual combinatorial map. + \cgalFigureBegin{fig_merge_faces,merge_faces.svg} + The green, red and yellow faces are merged by removing edges. The resulting reduced surface has a single vertex and a single face. + \cgalFigureEnd +Cutting through the graph of the reduced surface, we obtain a face that can be flattened into the plane. + \cgalFigureBegin{fig_cut-open,cut-open.svg} + If \f$\cal{M}\f$ is obtained by gluing \f$g\f$ tori, i.e. \f$\cal{M}\f$ has genus \f$g\f$, the cut-open reduced surface has \f$4g\f$ sides. + \cgalFigureEnd + +-# A vertex is introduced in the middle of this unique face and joined by new edges to the corners of this face to form a triangulation with \f$4g\f$ triangles. Gluing back along the (old) edges of the reduced surface and deleting them amounts to merge the triangles by pairs. We thus obtain a quadrangulated surface \f$\cal{Q}\f$ with \f$2g\f$ quadrilaterals, \f$4g\f$ edges and 2 vertices. + \cgalFigureBegin{fig_quad_mesh,quad_mesh.svg} + Triangles of the same color are merged into quadrilaterals. All the light blue vertices correspond to a same vertex on the glued surface. + \cgalFigureEnd + +This quadrangulation \f$\cal{Q}\f$ is stored in a `Surface_mesh_topology::Curves_on_surface_topology`. In order to perform a homotopy test, each input curve \f$C\f$ is transformed into a (closed) path in \f$\cal{Q}\f$ as follows. If an edge of \f$C\f$ is part of the contracted spanning tree, we simply ignore that edge. Otherwise the edge can be replaced by two consecutive edges of \f$\cal{Q}\f$ to obtain a new path \f$C'\f$ in the vertex-edge graph of \f$\cal{Q}\f$ so that \f$C'\f$ is a continuous deformation of \f$C\f$. Hence, deciding if \f$C\f$ is contractible in \f$\cal{M}\f$ is equivalent to test if \f$C'\f$ is contractible in \f$\cal{Q}\f$. + +\subsection SMTopology_Canonical Canonical Form + +In order to test if two input curves \f$C\f$ and \f$D\f$ in \f$\cal{M}\f$ are homotopic they are first replaced by curves \f$C'\f$ and \f$D'\f$ in \f$\cal{Q}\f$ as above. Those curves are further transformed into canonical forms that only depend on their homotopy classes. The transformation to canonical form relies on three basic operations that we now describe. +-# A bracket in a curve is a subsequence of edges along a row of quadrilaterals, surrounded by two edges along the end sides of the row. A bracket can be flattened by replacing the corresponding subpath with a shorter subpath going along the other long side of the row. See \cgalFigureRef{fig_bracket}. +\cgalFigureBegin{fig_bracket,bracket.svg} + Left, a blue curve in a quadrangulation (for clarity the quadrangulation has more than two vertices). Middle, a bracket of the blue curve. Right, the bracket has been flattened. + \cgalFigureEnd + +-# A spur in a curve is a subsequence of two opposite edges. A spur can be deleted to shorten the curve. See \cgalFigureRef{fig_spur}. +\cgalFigureBegin{fig_spur,spur.svg} + Removing a spur. + \cgalFigureEnd + +-# A right L-shape in a curve is a subsequence of edges going along the exterior side of a sequence of quadrilaterals forming an L, with the interior of the L to its right. This notion takes into account the traversal direction of the curve. A right L-shape subpath can be pushed to the right by replacing it with the other side of the L-shaped sequence of quadrilaterals. See \cgalFigureRef{fig_push_right} +\cgalFigureBegin{fig_push_right,push_right.svg} + Pushing an L-shaped subpath to its right. + \cgalFigureEnd + +The canonical form of a curve is obtained by flattening its brackets, removing its spurs and pushing its right L-shapes to the right until the curve has no more brackets, spurs or L-shapes. This can be done in time proportional to the number of edges of the curve. Note that the above three operations preserve the homotopy class of the curve. + +\subsection SMTopology_Homotopy_Test Homotopy Test +It can be proven that the canonical form is uniquely defined and only depends on the homotopy class of the curve. Hence, the curves \f$C'\f$ and \f$D'\f$ in \f$\cal{Q}\f$ are homotopic if and only if their canonical forms are equal. Since each curve is defined as a sequence of (oriented) edges up to a cyclic permutation, we resort to the Knuth-Morris-Pratt algorithm to decide in linear time if the canonical forms are the same up to a cyclic permutation. + +\section Implementation History + +The code was developed in 2018 by Guillaume Damiand and Francis Lazarus. Felix Castillon contributed to the extension of the homotopy test to the case of surfaces with boundaries. + +*/ +} /* namespace CGAL */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/dependencies b/Surface_mesh_topology/doc/Surface_mesh_topology/dependencies new file mode 100644 index 00000000000..e85e0d8ae54 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/dependencies @@ -0,0 +1,7 @@ +Combinatorial_map +Generalized_map +Linear_cell_complex +BGL +Surface_mesh +Polyhedron +Manual diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt new file mode 100644 index 00000000000..fbddaf77299 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/examples.txt @@ -0,0 +1,7 @@ +/*! +\example Surface_mesh_topology/path_homotopy.cpp +\example Surface_mesh_topology/basic_example_surface_mesh_topology.cpp +\example Surface_mesh_topology/path_homotopy_with_symbols.cpp +\example Surface_mesh_topology/path_homotopy_with_symbols_2.cpp +\example Surface_mesh_topology/open_path_homotopy.cpp +*/ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/bracket.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/bracket.svg new file mode 100644 index 00000000000..15e65f2d0d9 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/bracket.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-path-homotopy.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-path-homotopy.svg new file mode 100644 index 00000000000..0fda5aa847d --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-path-homotopy.svg @@ -0,0 +1,378 @@ + + + +Gnuplot +Produced by GNUPLOT 5.2 patchlevel 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 25 + + + + + 30 + + + + + 35 + + + + + 40 + + + + + 45 + + + + + 50 + + + + + 5,000,000 + + + + + 10,000,000 + + + + + 15,000,000 + + + + + 20,000,000 + + + + + + + + + Time (sec) + + + + + Path lengths + + + + + Homotopy test + + + Homotopy test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Model Fit + + + Model Fit + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-polygonal-schema.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-polygonal-schema.svg new file mode 100644 index 00000000000..d42c30329da --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-polygonal-schema.svg @@ -0,0 +1,378 @@ + + + +Gnuplot +Produced by GNUPLOT 5.2 patchlevel 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 10 + + + + + 20 + + + + + 30 + + + + + 40 + + + + + 50 + + + + + 60 + + + + + 10,000,000 + + + + + 20,000,000 + + + + + 30,000,000 + + + + + 40,000,000 + + + + + 50,000,000 + + + + + 60,000,000 + + + + + + + + + Time (sec) + + + + + Path lengths + + + + + Homotopy test + + + Homotopy test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Model Fit + + + Model Fit + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-reduce-surface.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-reduce-surface.svg new file mode 100644 index 00000000000..2f8b003cf27 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/computation-time-reduce-surface.svg @@ -0,0 +1,210 @@ + + + +Gnuplot +Produced by GNUPLOT 5.2 patchlevel 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 5 + + + + + 10 + + + + + 15 + + + + + 20 + + + + + 25 + + + + + 30 + + + + + 35 + + + + + 5,000,000 + + + + + 10,000,000 + + + + + 15,000,000 + + + + + 20,000,000 + + + + + 25,000,000 + + + + + 30,000,000 + + + + + + + + + Time (sec) + + + + + #Darts + + + + + Reduce surface computation + + + Reduce surface computation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Model Fit + + + Model Fit + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/contract_tree.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/contract_tree.svg new file mode 100644 index 00000000000..02ecc2bbd4e --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/contract_tree.svg @@ -0,0 +1,1859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/cut-open.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/cut-open.svg new file mode 100644 index 00000000000..4cf61a9a2a8 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/cut-open.svg @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/free-vs-fixed-endpoints.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/free-vs-fixed-endpoints.svg new file mode 100644 index 00000000000..8f249be4c02 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/free-vs-fixed-endpoints.svg @@ -0,0 +1,831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/incremental-builder.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/incremental-builder.svg new file mode 100644 index 00000000000..9422459c757 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/incremental-builder.svg @@ -0,0 +1,1105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + a + -a + b + -b + c + -c + d + -d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + -a + b + -b + d + -d + c + -c + e + -e + f + -f + + + + + + + + + + + + + + + + + + + + a + -a + b + -b + d + -d + f + -f + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/merge_faces.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/merge_faces.svg new file mode 100644 index 00000000000..32edc6a221a --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/merge_faces.svg @@ -0,0 +1,2414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/push_right.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/push_right.svg new file mode 100644 index 00000000000..a680eaf47c1 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/push_right.svg @@ -0,0 +1,1596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/quad_mesh.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/quad_mesh.svg new file mode 100644 index 00000000000..47f854abe36 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/quad_mesh.svg @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/spanning_tree.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/spanning_tree.svg new file mode 100644 index 00000000000..840be4fbf26 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/spanning_tree.svg @@ -0,0 +1,1459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/spur.svg b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/spur.svg new file mode 100644 index 00000000000..b8cdcc207a0 --- /dev/null +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/spur.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/fig/surface-mesh-topology-logo.png b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/surface-mesh-topology-logo.png new file mode 100644 index 00000000000..1c704fb7d71 Binary files /dev/null and b/Surface_mesh_topology/doc/Surface_mesh_topology/fig/surface-mesh-topology-logo.png differ diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt new file mode 100644 index 00000000000..3f17e082fff --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.1...3.15) +project(Surface_mesh_topology_Examples) + +if(NOT POLICY CMP0070 AND POLICY CMP0053) + # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. + cmake_policy(SET CMP0053 OLD) +endif() + +if(POLICY CMP0071) + cmake_policy(SET CMP0071 NEW) +endif() + +find_package(CGAL QUIET COMPONENTS Qt5) +if(CGAL_Qt5_FOUND) + add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) +endif() + +if ( NOT CGAL_FOUND ) + message(FATAL_ERROR "This program requires the CGAL library, and will not be compiled.") +endif() + +# add_definitions(-DCGAL_TRACE_PATH_TESTS) +# add_definitions(-DCGAL_TRACE_CMAP_TOOLS) +# add_definitions("-Wall -Wextra") +# add_definitions("-D_GLIBCXX_DEBUG") + +set(SOURCE_FILES + basic_example_surface_mesh_topology.cpp + basic_example_torus.cpp + map_2_constructor.cpp + open_path_homotopy.cpp + path_homotopy.cpp + path_homotopy_with_symbols.cpp + path_homotopy_with_symbols_2.cpp + surface_mesh_topology_with_sm_and_polyhedron.cpp + ) + +foreach(cppfile ${SOURCE_FILES}) + create_single_source_cgal_program("${cppfile}") +endforeach() + +if(CGAL_Qt5_FOUND) + target_link_libraries(basic_example_surface_mesh_topology PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(basic_example_torus PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(open_path_homotopy PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(path_homotopy PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(surface_mesh_topology_with_sm_and_polyhedron PUBLIC CGAL::CGAL_Qt5) +endif() diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/basic_example_surface_mesh_topology.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/basic_example_surface_mesh_topology.cpp new file mode 100644 index 00000000000..048fb5a736d --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/basic_example_surface_mesh_topology.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(14); // Its starting dart + for (int i=0; i<7; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ p.push_back_by_index({202, 206, 335, 317, 322, 69, 62, 414}); } + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_index(470); // Its starting dart + for (int i=0; i<13; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "data/double-torus.off")) + { + std::cout<<"ERROR reading file data/double-torus.off"< cst(lcc); + Path_on_surface p1(lcc), p2(lcc), p3(lcc); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + bool res1=cst.is_contractible(p1); + std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT") + <<" contractible."< > paths={p1, p2, p3}; + CGAL::draw(lcc, paths); // Enable only if CGAL was compiled with Qt5 +#endif // CGAL_USE_BASIC_VIEWER + + return EXIT_SUCCESS; +} +/////////////////////////////////////////////////////////////////////////////// + diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/basic_example_torus.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/basic_example_torus.cpp new file mode 100644 index 00000000000..e8a697ccf32 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/basic_example_torus.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(0); // Its starting dart + for (int i=0; i<4; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index(1); // Its starting dart + for (int i=0; i<4; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "data/torus_quad.off")) + { + std::cout<<"ERROR reading file data/torus_quad.off"< cst(lcc); + Path_on_surface p1(lcc), p2(lcc); + create_path_1(p1); + create_path_2(p2); + + bool res1=cst.is_contractible(p1); + std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT") + <<" contractible."< > paths={p1, p2}; + CGAL::draw(lcc, paths); // Enable only if CGAL was compiled with Qt5 +#endif // CGAL_USE_BASIC_VIEWER + + return EXIT_SUCCESS; +} +/////////////////////////////////////////////////////////////////////////////// + diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/data/3torus.off b/Surface_mesh_topology/examples/Surface_mesh_topology/data/3torus.off new file mode 100644 index 00000000000..059026db6b3 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/data/3torus.off @@ -0,0 +1,44 @@ +OFF +19 23 0 +-0.32821 0.728949 0.785375 +-0.253234 0.54351 0.0549907 +-0.844014 0.631231 -0.911234 +-1.50977 0.904391 -1.14708 +-0.390354 -0.366081 -0.611454 +-0.60245 -1.09023 -0.547515 +-0.888454 0.366475 0.427312 +-1.47923 0.454195 -0.538913 +-1.02557 -0.543117 -0.239133 +1.3173 0.119589 -0.65761 +0.876658 -0.199807 -0.131025 +-0.083217 -0.804717 -0.0759778 +0.053903 0.104874 0.590467 +0.569521 0.23883 -0.666502 +0.938527 -0.503249 0.961862 +1.44104 -0.487296 1.52816 +1.25068 0.439809 0.0253912 +0.427929 0.74449 0.746884 +1.31255 0.136367 1.11828 +4 0 1 2 3 +4 3 2 4 5 +4 1 6 7 2 +4 2 7 8 4 +4 4 8 6 1 +4 6 0 3 7 +4 7 3 5 8 +4 8 5 0 6 +4 9 10 11 5 +4 5 11 12 0 +4 10 13 4 11 +4 11 4 1 12 +4 12 1 13 10 +4 13 9 5 4 +4 1 0 9 13 +4 0 12 14 15 +4 15 14 10 9 +4 10 16 17 12 +4 12 17 18 14 +4 14 18 16 10 +4 16 9 0 17 +4 17 0 15 18 +4 18 15 9 16 diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/data/double-torus-3-holes.off b/Surface_mesh_topology/examples/Surface_mesh_topology/data/double-torus-3-holes.off new file mode 100644 index 00000000000..5092e984fb3 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/data/double-torus-3-holes.off @@ -0,0 +1,431 @@ +OFF +228 201 0 +1.62473 1.92519 0.645116 +1.59856 2.45453 0.105686 +1.36768 2.78362 0.507687 +1.44616 2.17973 0.956047 +2.17131 1.2071 0.731432 +1.62939 1.58636 0.364889 +2.16529 1.64517 1.09374 +2.90357 1.7785 1.18875 +2.54642 2.28757 1.81061 +2.92369 2.93613 1.71623 +3.40711 2.24707 0.874502 +2.57252 0.388793 0.240254 +1.95128 0.746801 0.480583 +2.91289 1.10083 0.628296 +3.41972 1.32982 0.115897 +3.38094 2.77641 0.335073 +3.39492 1.75991 -0.50561 +2.11625 -0.453389 -0.597175 +1.94988 -0.216593 0.101481 +2.95902 0.366033 -0.409339 +0.778032 -0.784465 -1.08886 +1.05833 -0.966152 -0.410409 +1.95041 -0.216224 -1.29583 +-1.05316 0.711603 -0.210338 +-1.28047 0.320835 -0.153469 +-0.980005 -0.0806305 -0.505709 +-0.97055 -0.110718 -0.522061 +-0.571926 -0.261335 -0.874081 +-0.418901 0.471953 -0.770442 +-0.672026 1.354 0.506539 +-1.41031 1.22067 0.411524 +-0.441144 1.02491 0.104538 +-0.136133 1.41281 1.23539 +-0.678049 1.79208 0.868843 +-0.131474 1.07398 0.955159 +0.108702 1.44301 2.10774 +0.034051 1.76883 1.42941 +-0.111327 0.982712 1.85689 +0.344842 2.07115 2.89611 +0.511204 1.83436 2.19745 +-0.277795 1.46577 2.75733 +1.00166 3.15596 2.99873 +1.12643 2.44998 2.75813 +-0.0562639 2.6432 3.1855 +1.89383 3.89949 2.10802 +2.06519 3.26051 2.47436 +0.715229 3.78364 2.68913 +1.49846 4.06987 1.48631 +2.35696 3.74549 0.728177 +2.84521 3.54002 1.26787 +-0.0555178 2.64372 1.2094 +0.34537 2.07152 1.49879 +0.736163 2.26094 1.4298 +0.449736 2.88861 1.1202 +-1.90166 1.23926 2.10589 +-1.90141 1.221 2.09078 +-1.92107 1.27736 1.16019 +-1.92646 1.66935 1.48438 +-1.35974 0.859992 2.47243 +-0.618163 0.753727 2.36929 +-0.608846 0.076062 1.80884 +-1.04378 -0.00248243 1.75286 +-1.0988 0.14376 1.8749 +-1.32934 0.452132 2.1346 +-1.35435 0.467997 2.14823 +2.3923 1.1754 -1.39739 +2.88437 0.691855 -1.08767 +2.853 2.13918 -0.872153 +2.11142 2.24544 -0.769017 +1.60459 2.01646 -0.256618 +1.38456 1.55616 -0.507466 +1.77106 1.5334 -1.15706 +1.14842 0.928019 -1.29583 +1.54952 0.355974 -1.58522 +0.982056 1.16481 -0.597175 +0.476802 0.919923 -0.507977 +0.366832 0.549191 -1.15785 +1.45921 1.23034 0.170868 +1.14789 0.927649 0.101481 +1.54878 0.355452 0.390874 +1.04352 0.11056 0.480072 +0.757098 0.738236 0.170472 +0.53559 0.0606295 0.730511 +0.125578 0.21555 1.09259 +0.0471035 0.819441 0.644228 +0.364231 0.699617 0.364176 +1.1683 -0.595421 0.239464 +0.382565 -0.672659 0.626872 +-0.00520413 -1.0707 0.113969 +-0.403829 -0.92008 0.46599 +-0.405416 -0.901236 0.496048 +-0.620442 -0.621786 0.997254 +-0.25169 -0.433009 1.18697 +-0.105304 0.544637 1.49459 +-0.653543 -0.51838 1.12035 +-1.39111 2.30732 2.68795 +-0.899037 1.82378 2.99766 +-1.46576 2.63314 2.00961 +-0.622986 3.45256 2.19745 +-0.457151 3.2154 2.89611 +-1.41963 1.89834 0.971979 +-1.07926 2.61038 1.36002 +-0.45802 2.25237 1.11969 +-0.456624 3.21576 1.49879 +0.324963 3.59459 1.36081 +0.434933 3.96532 2.01068 +0.957671 2.93854 0.869764 +1.1107 3.67183 0.973404 +-0.031132 0.869992 -0.257539 +0.491605 -0.156789 -1.39846 +1.12903 2.29956 1.2361 +1.74495 3.43218 0.413301 +2.10211 2.92311 -0.208562 +2.84039 3.05644 -0.113547 +-0.400567 -0.900322 -0.507746 +-0.446838 -0.882839 -0.466885 +-0.396754 -0.907847 -0.229717 +-0.561015 -0.673257 -0.516099 +-1.70695 0.944633 0.59665 +-1.3247 0.440138 -0.0497789 +-1.90392 1.27273 1.13283 +-1.74516 1.06687 0.748005 +1.01646 2.07925 2.10825 +1.91216 2.52722 2.37072 +-2.23628 -0.701564 0.707986 +-2.26637 -0.154647 0.171488 +-2.52431 0.161632 0.57852 +-2.43579 -0.456935 1.02281 +-1.94973 -0.658965 1.58028 +-2.38146 -0.524773 1.93784 +-2.0187 -0.118527 2.47749 +-1.35085 -0.32611 1.92438 +-1.65871 -1.41097 0.797358 +-2.2107 -1.03858 0.417248 +-1.69178 -0.975244 1.17325 +-0.951822 -0.815367 1.29474 +-1.2075 -2.2147 0.295123 +-1.85706 -1.87983 0.527054 +-0.900662 -1.4894 0.713261 +-0.38062 -1.22792 0.21422 +-1.61356 -3.06634 -0.584539 +-1.81155 -2.84761 0.123141 +-0.795936 -2.20965 -0.351752 +-2.94201 -3.4398 -1.13026 +-2.67155 -3.6283 -0.438035 +-1.76955 -2.81704 -1.29261 +-4.33495 -2.96364 -0.94302 +-4.14862 -3.61261 -0.579731 +-3.24614 -2.80771 -1.4398 +-4.87804 -2.00991 -0.265205 +-5.23892 -2.68267 -0.19436 +-4.21019 -2.2175 -0.818312 +-4.53711 -1.36078 0.485927 +-5.27707 -1.52065 0.364442 +-4.27916 -1.67706 0.0788946 +-4.01819 -1.29744 1.24193 +-4.57018 -0.925055 0.861821 +-3.99261 -1.63446 0.951193 +-3.79724 -1.27678 2.13389 +-3.86477 -0.934793 1.451 +-3.99559 -1.74565 1.86358 +-3.60475 -0.648909 2.95275 +-3.40675 -0.867637 2.24507 +-4.2088 -1.28183 2.78076 +-2.98275 0.471686 3.09898 +-2.82311 -0.233732 2.84451 +-4.04074 -0.0902782 3.24548 +-2.08027 1.27659 2.23891 +-1.89394 0.627623 2.6022 +-3.28688 1.10378 2.78944 +-2.46853 1.44822 1.60043 +-3.98134 -0.0470402 1.2433 +-3.56274 -0.618335 1.53699 +-3.17192 -0.410747 1.48287 +-3.47605 0.221349 1.17333 +-1.37052 -1.38906 -1.35352 +-0.863465 -1.86766 -1.03464 +-0.955208 -0.407325 -0.787544 +-1.71325 -0.328896 -0.703447 +-2.23329 -0.59037 -0.204406 +-2.43165 -1.05924 -0.47471 +-2.02009 -1.0542 -1.12159 +-2.62414 -1.68711 -1.29357 +-2.18815 -2.24574 -1.5863 +-2.82214 -1.46838 -0.585887 +-3.32743 -1.73677 -0.515917 +-3.40578 -2.10229 -1.18533 +-2.36412 -1.40123 0.208179 +-2.66615 -1.71769 0.122188 +-2.24755 -2.28898 0.415877 +-2.75284 -2.55737 0.485847 +-3.05697 -1.92527 0.176307 +-3.45917 -1.98288 0.359816 +-3.84743 -1.81125 -0.27866 +-3.27284 -2.63185 0.723104 +-3.70458 -2.49765 1.08066 +-3.7931 -1.87909 0.636369 +-2.59319 -3.26279 0.231378 +-3.3976 -3.37799 0.598396 +-3.76036 -3.78424 0.0587442 +-4.66433 -3.50327 0.807404 +-4.06545 -3.17041 1.1515 +-4.46448 -2.68115 1.78115 +-3.96252 -2.18138 1.48769 +-5.20443 -2.84103 1.65966 +-5.27368 -1.9287 2.44672 +-4.51564 -2.00713 2.36263 +-5.1504 -3.30124 0.249929 +-5.74894 -2.56735 1.1944 +-5.36542 -0.468358 2.69382 +-4.85836 -0.946965 3.0127 +-5.82568 -1.55631 2.06661 +-5.43295 -0.126368 2.01093 +-5.84827 -1.1081 1.44496 +-5.32823 -0.846626 0.945918 +-5.02139 -0.121326 1.36406 +-4.37183 -0.456187 1.13212 +-4.41734 0.511591 1.53604 +-4.61533 0.730319 2.24372 +-3.6357 0.926767 1.4278 +-3.55734 1.29228 2.09721 +-2.95605 0.295824 0.936075 +-2.83129 1.04197 1.06078 +-2.76972 -0.353144 1.29936 +-2.90146 -0.599248 2.1751 +-2.16344 0.83439 0.507675 +-1.76441 0.345132 -0.121971 +-5.77902 -2.02043 0.6579 +4 0 1 2 3 +4 4 5 0 6 +4 7 8 9 10 +4 11 12 4 13 +4 14 10 15 16 +4 17 18 11 19 +4 20 21 17 22 +6 23 24 25 26 27 28 +4 29 30 23 31 +4 32 33 29 34 +4 35 36 32 37 +4 38 39 35 40 +4 41 42 38 43 +4 44 45 41 46 +4 47 48 49 44 +4 50 51 52 53 +4 54 55 56 57 +7 58 59 60 61 62 63 64 +4 65 66 16 67 +4 68 69 70 71 +4 65 67 68 71 +4 72 73 65 71 +4 74 75 76 72 +4 70 74 72 71 +4 74 70 77 78 +4 78 79 80 81 +4 75 74 78 81 +4 82 83 84 85 +4 80 82 85 81 +4 82 80 86 87 +6 87 88 89 90 91 92 +4 83 82 87 92 +4 60 93 83 92 +5 92 91 94 61 60 +4 58 64 55 54 +4 95 96 58 54 +4 97 98 99 95 +4 57 97 95 54 +4 97 57 100 101 +4 101 102 50 103 +4 98 97 101 103 +4 104 105 98 103 +4 53 104 103 50 +4 104 53 106 107 +4 105 104 107 47 +4 46 105 47 44 +4 99 98 105 46 +4 43 99 46 41 +4 96 95 99 43 +4 40 96 43 38 +4 59 58 96 40 +4 37 59 40 35 +4 93 60 59 37 +4 34 93 37 32 +4 84 83 93 34 +4 28 108 31 23 +4 73 72 76 109 +4 22 73 109 20 +4 66 65 73 22 +4 19 66 22 17 +4 14 16 66 19 +4 13 14 19 11 +4 7 10 14 13 +4 6 7 13 4 +4 106 53 52 110 +4 2 106 110 3 +4 107 106 2 111 +4 48 47 107 111 +4 112 68 67 113 +4 112 113 48 111 +4 112 111 2 1 +4 69 68 112 1 +4 69 1 0 5 +4 77 70 69 5 +4 77 5 4 12 +4 79 78 77 12 +4 79 12 11 18 +4 86 80 79 18 +4 86 18 17 21 +4 88 87 86 21 +4 88 21 20 114 +5 88 114 115 116 89 +5 27 26 117 115 114 +5 30 118 119 24 23 +7 100 57 56 120 121 118 30 +4 100 30 29 33 +4 102 101 100 33 +4 102 33 32 36 +4 51 50 102 36 +4 51 36 35 39 +4 122 52 51 39 +4 122 39 38 42 +4 123 42 41 45 +4 9 8 123 45 +4 9 45 44 49 +4 15 10 9 49 +4 15 49 48 113 +4 67 16 15 113 +4 124 125 126 127 +4 128 129 130 131 +4 132 133 124 134 +5 135 131 62 61 94 +4 136 137 132 138 +4 139 90 89 116 +4 140 141 136 142 +4 143 144 140 145 +4 146 147 143 148 +4 149 150 146 151 +4 152 153 149 154 +4 155 156 152 157 +4 158 159 155 160 +4 161 162 158 163 +4 164 165 161 166 +4 167 168 164 169 +5 170 120 56 55 167 +4 171 172 173 174 +5 175 176 115 117 177 +4 178 179 180 181 +4 175 177 178 181 +4 182 183 175 181 +4 184 185 186 182 +4 180 184 182 181 +4 184 180 187 188 +4 188 189 190 191 +4 185 184 188 191 +4 192 193 185 191 +4 194 195 196 192 +4 190 194 192 191 +4 194 190 197 198 +4 198 199 200 201 +4 195 194 198 201 +4 202 203 195 201 +4 204 205 206 202 +4 200 204 202 201 +4 204 200 207 208 +4 209 210 205 211 +4 212 213 214 215 +4 215 216 171 217 +4 218 212 215 217 +4 219 220 218 217 +4 174 219 217 171 +4 219 174 221 222 +4 220 219 222 170 +4 169 220 170 167 +4 163 210 166 161 +4 206 205 210 163 +4 160 206 163 158 +4 203 202 206 160 +4 157 203 160 155 +4 196 195 203 157 +4 154 196 157 152 +4 193 192 196 154 +4 151 193 154 149 +4 186 185 193 151 +4 148 186 151 146 +4 183 182 186 148 +4 145 183 148 143 +4 176 175 183 145 +4 142 176 145 140 +5 139 116 115 176 142 +4 138 139 142 136 +6 135 94 91 90 139 138 +4 134 135 138 132 +4 128 131 135 134 +4 127 128 134 124 +4 129 128 127 223 +4 223 173 224 129 +4 221 174 173 223 +4 126 221 223 127 +4 222 221 126 225 +5 170 222 225 121 120 +6 226 178 177 25 24 119 +5 226 119 118 121 225 +4 226 225 126 125 +4 179 178 226 125 +4 179 125 124 133 +4 187 180 179 133 +4 187 133 132 137 +4 189 188 187 137 +4 189 137 136 141 +4 197 190 189 141 +4 197 141 140 144 +4 199 198 197 144 +4 199 144 143 147 +4 207 200 199 147 +4 207 147 146 150 +4 227 208 207 150 +4 227 150 149 153 +4 214 213 227 153 +4 214 153 152 156 +4 216 215 214 156 +4 216 156 155 159 +4 172 171 216 159 +4 172 159 158 162 +4 224 173 172 162 +4 224 162 161 165 +4 130 129 224 165 +4 130 165 164 168 +5 131 130 168 63 62 +5 167 55 64 63 168 +4 177 117 26 25 diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/data/double-torus.off b/Surface_mesh_topology/examples/Surface_mesh_topology/data/double-torus.off new file mode 100644 index 00000000000..8057aeea46f --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/data/double-torus.off @@ -0,0 +1,453 @@ +OFF +231 220 0 +-0.955208 -0.407325 -0.787544 +-2.08027 1.27659 2.23891 +-1.89394 0.627623 2.6022 +-1.35085 -0.32611 1.92438 +-2.0187 -0.118527 2.47749 +-2.98275 0.471686 3.09898 +-2.82311 -0.233732 2.84451 +-2.38146 -0.524773 1.93784 +-2.90146 -0.599248 2.1751 +-3.60475 -0.648909 2.95275 +-3.40675 -0.867637 2.24507 +-3.17192 -0.410747 1.48287 +-3.56274 -0.618335 1.53699 +-3.79724 -1.27678 2.13389 +-3.86477 -0.934793 1.451 +-3.98134 -0.0470402 1.2433 +-4.37183 -0.456187 1.13212 +-4.01819 -1.29744 1.24193 +-4.57018 -0.925055 0.861821 +-5.02139 -0.121326 1.36406 +-5.32823 -0.846626 0.945918 +-4.53711 -1.36078 0.485927 +-5.27707 -1.52065 0.364442 +-5.84827 -1.1081 1.44496 +-5.77902 -2.02043 0.6579 +-4.87804 -2.00991 -0.265205 +-5.23892 -2.68267 -0.19436 +-5.74894 -2.56735 1.1944 +-5.1504 -3.30124 0.249929 +-4.33495 -2.96364 -0.94302 +-4.14862 -3.61261 -0.579731 +-4.66433 -3.50327 0.807404 +-3.76036 -3.78424 0.0587442 +-2.94201 -3.4398 -1.13026 +-2.67155 -3.6283 -0.438035 +-3.3976 -3.37799 0.598396 +-2.59319 -3.26279 0.231378 +-1.61356 -3.06634 -0.584539 +-1.81155 -2.84761 0.123141 +-2.75284 -2.55737 0.485847 +-2.24755 -2.28898 0.415877 +-1.2075 -2.2147 0.295123 +-1.85706 -1.87983 0.527054 +-2.66615 -1.71769 0.122188 +-2.36412 -1.40123 0.208179 +-1.65871 -1.41097 0.797358 +-2.2107 -1.03858 0.417248 +-2.43165 -1.05924 -0.47471 +-2.23329 -0.59037 -0.204406 +-2.23628 -0.701564 0.707986 +-2.26637 -0.154647 0.171488 +-1.71325 -0.328896 -0.703447 +-1.76441 0.345132 -0.121971 +-2.52431 0.161632 0.57852 +-2.16344 0.83439 0.507675 +-2.46853 1.44822 1.60043 +-2.83129 1.04197 1.06078 +-2.95605 0.295824 0.936075 +-2.43579 -0.456935 1.02281 +-2.76972 -0.353144 1.29936 +-3.47605 0.221349 1.17333 +-1.94973 -0.658965 1.58028 +-1.69178 -0.975244 1.17325 +-0.951822 -0.815367 1.29474 +-0.900662 -1.4894 0.713261 +-0.38062 -1.22792 0.21422 +-0.795936 -2.20965 -0.351752 +-0.863465 -1.86766 -1.03464 +-1.76955 -2.81704 -1.29261 +-1.37052 -1.38906 -1.35352 +-2.18815 -2.24574 -1.5863 +-3.24614 -2.80771 -1.4398 +-2.62414 -1.68711 -1.29357 +-3.40578 -2.10229 -1.18533 +-4.21019 -2.2175 -0.818312 +-3.32743 -1.73677 -0.515917 +-3.84743 -1.81125 -0.27866 +-4.27916 -1.67706 0.0788946 +-3.45917 -1.98288 0.359816 +-3.7931 -1.87909 0.636369 +-3.99261 -1.63446 0.951193 +-3.70458 -2.49765 1.08066 +-3.96252 -2.18138 1.48769 +-3.99559 -1.74565 1.86358 +-4.46448 -2.68115 1.78115 +-4.51564 -2.00713 2.36263 +-4.2088 -1.28183 2.78076 +-5.27368 -1.9287 2.44672 +-4.85836 -0.946965 3.0127 +-4.04074 -0.0902782 3.24548 +-5.36542 -0.468358 2.69382 +-4.45934 0.481017 2.95179 +-3.28688 1.10378 2.78944 +-4.61533 0.730319 2.24372 +-3.55734 1.29228 2.09721 +-3.6357 0.926767 1.4278 +-4.41734 0.511591 1.53604 +-5.43295 -0.126368 2.01093 +-5.82568 -1.55631 2.06661 +-5.20443 -2.84103 1.65966 +-4.06545 -3.17041 1.1515 +-3.27284 -2.63185 0.723104 +-3.05697 -1.92527 0.176307 +-2.82214 -1.46838 -0.585887 +-2.02009 -1.0542 -1.12159 +2.84039 3.05644 -0.113547 +2.853 2.13918 -0.872153 +3.39492 1.75991 -0.50561 +3.38094 2.77641 0.335073 +2.35696 3.74549 0.728177 +2.84521 3.54002 1.26787 +3.40711 2.24707 0.874502 +2.92369 2.93613 1.71623 +1.89383 3.89949 2.10802 +2.06519 3.26051 2.47436 +2.54642 2.28757 1.81061 +1.91216 2.52722 2.37072 +1.00166 3.15596 2.99873 +1.12643 2.44998 2.75813 +1.52439 2.12918 1.85781 +1.01646 2.07925 2.10825 +0.344842 2.07115 2.89611 +0.511204 1.83436 2.19745 +0.736163 2.26094 1.4298 +0.34537 2.07152 1.49879 +0.108702 1.44301 2.10774 +0.034051 1.76883 1.42941 +-0.0555178 2.64372 1.2094 +-0.45802 2.25237 1.11969 +-0.136133 1.41281 1.23539 +-0.678049 1.79208 0.868843 +-1.07926 2.61038 1.36002 +-1.41963 1.89834 0.971979 +-0.672026 1.354 0.506539 +-1.41031 1.22067 0.411524 +-1.92646 1.66935 1.48438 +-1.05316 0.711603 -0.210338 +-0.571926 -0.261335 -0.874081 +-0.400567 -0.900322 -0.507746 +-0.00520413 -1.0707 0.113969 +0.778032 -0.784465 -1.08886 +1.05833 -0.966152 -0.410409 +0.382565 -0.672659 0.626872 +1.1683 -0.595421 0.239464 +2.11625 -0.453389 -0.597175 +1.94988 -0.216593 0.101481 +1.04352 0.11056 0.480072 +1.54878 0.355452 0.390874 +2.57252 0.388793 0.240254 +1.95128 0.746801 0.480583 +1.14789 0.927649 0.101481 +1.45921 1.23034 0.170868 +2.17131 1.2071 0.731432 +1.62939 1.58636 0.364889 +1.38456 1.55616 -0.507466 +1.60459 2.01646 -0.256618 +1.62473 1.92519 0.645116 +1.59856 2.45453 0.105686 +2.11142 2.24544 -0.769017 +2.10211 2.92311 -0.208562 +1.36768 2.78362 0.507687 +1.74495 3.43218 0.413301 +1.49846 4.06987 1.48631 +1.1107 3.67183 0.973404 +0.957671 2.93854 0.869764 +1.44616 2.17973 0.956047 +1.12903 2.29956 1.2361 +0.449736 2.88861 1.1202 +1.9344 1.97426 1.49574 +2.16529 1.64517 1.09374 +2.90357 1.7785 1.18875 +2.91289 1.10083 0.628296 +3.41972 1.32982 0.115897 +2.95902 0.366033 -0.409339 +2.88437 0.691855 -1.08767 +1.95041 -0.216224 -1.29583 +2.3923 1.1754 -1.39739 +1.54952 0.355974 -1.58522 +0.491605 -0.156789 -1.39846 +1.14842 0.928019 -1.29583 +0.366832 0.549191 -1.15785 +-0.418901 0.471953 -0.770442 +0.476802 0.919923 -0.507977 +-0.031132 0.869992 -0.257539 +-0.441144 1.02491 0.104538 +0.364231 0.699617 0.364176 +0.0471035 0.819441 0.644228 +-0.131474 1.07398 0.955159 +0.125578 0.21555 1.09259 +-0.105304 0.544637 1.49459 +-0.111327 0.982712 1.85689 +-0.608846 0.076062 1.80884 +-0.618163 0.753727 2.36929 +-0.277795 1.46577 2.75733 +-1.35974 0.859992 2.47243 +-0.899037 1.82378 2.99766 +-0.0562639 2.6432 3.1855 +-1.39111 2.30732 2.68795 +-0.457151 3.2154 2.89611 +0.715229 3.78364 2.68913 +-0.622986 3.45256 2.19745 +0.434933 3.96532 2.01068 +0.324963 3.59459 1.36081 +-0.456624 3.21576 1.49879 +-1.46576 2.63314 2.00961 +-1.90166 1.23926 2.10589 +-0.25169 -0.433009 1.18697 +0.53559 0.0606295 0.730511 +0.757098 0.738236 0.170472 +0.982056 1.16481 -0.597175 +1.77106 1.5334 -1.15706 +-0.561015 -0.673257 -0.516099 +-0.97055 -0.110718 -0.522061 +-1.90141 1.221 2.09078 +-1.35435 0.467997 2.14823 +-1.32934 0.452132 2.1346 +-1.0988 0.14376 1.8749 +-1.74516 1.06687 0.748005 +-1.70695 0.944633 0.59665 +-1.3247 0.440138 -0.0497789 +-1.28047 0.320835 -0.153469 +-0.446838 -0.882839 -0.466885 +-0.396754 -0.907847 -0.229717 +-0.653543 -0.51838 1.12035 +-0.620442 -0.621786 0.997254 +-0.403829 -0.92008 0.46599 +-1.90392 1.27273 1.13283 +-1.92107 1.27736 1.16019 +-1.04378 -0.00248243 1.75286 +-0.980005 -0.0806305 -0.505709 +-0.405416 -0.901236 0.496048 +4 0 229 212 211 +5 1 2 215 214 213 +5 3 216 215 2 4 +4 4 2 5 6 +4 4 6 8 7 +4 8 6 9 10 +4 8 10 12 11 +4 12 10 13 14 +4 12 14 16 15 +4 16 14 17 18 +4 16 18 20 19 +4 20 18 21 22 +4 20 22 24 23 +4 24 22 25 26 +4 24 26 28 27 +4 28 26 29 30 +4 28 30 32 31 +4 32 30 33 34 +4 32 34 36 35 +4 36 34 37 38 +4 36 38 40 39 +4 40 38 41 42 +4 40 42 44 43 +4 44 42 45 46 +4 44 46 48 47 +4 48 46 49 50 +4 48 50 52 51 +4 52 50 53 54 +5 52 54 217 218 219 +6 52 219 220 229 0 51 +5 55 226 217 54 56 +4 56 54 53 57 +4 53 58 59 57 +4 57 59 11 60 +4 59 7 8 11 +4 7 59 58 61 +4 58 49 62 61 +4 61 62 63 3 +4 62 45 64 63 +6 63 64 65 230 224 223 +4 64 41 66 65 +5 65 66 67 221 222 +4 66 37 68 67 +4 67 68 70 69 +4 68 33 71 70 +4 70 71 73 72 +4 71 29 74 73 +4 73 74 76 75 +4 74 25 77 76 +4 76 77 79 78 +4 77 21 80 79 +4 79 80 82 81 +4 80 17 83 82 +4 82 83 85 84 +4 83 13 86 85 +4 85 86 88 87 +4 86 9 89 88 +4 88 89 91 90 +4 89 5 92 91 +4 91 92 94 93 +4 92 1 55 94 +4 94 55 56 95 +4 95 56 57 60 +4 60 15 96 95 +4 95 96 93 94 +4 93 96 19 97 +4 19 96 15 16 +4 97 19 20 23 +4 23 98 90 97 +4 97 90 91 93 +4 90 98 87 88 +4 87 98 27 99 +4 27 98 23 24 +4 99 27 28 31 +4 31 100 84 99 +4 99 84 85 87 +4 84 100 81 82 +4 81 100 35 101 +4 35 100 31 32 +4 101 35 36 39 +4 39 102 78 101 +4 101 78 79 81 +4 78 102 75 76 +4 75 102 43 103 +4 43 102 39 40 +4 103 43 44 47 +4 47 104 72 103 +4 103 72 73 75 +4 72 104 69 70 +4 69 104 51 0 +4 51 104 47 48 +5 69 0 211 221 67 +4 15 60 11 12 +5 55 1 213 227 226 +4 1 92 5 2 +4 5 89 9 6 +4 9 86 13 10 +4 13 83 17 14 +4 17 80 21 18 +4 21 77 25 22 +4 25 74 29 26 +4 29 71 33 30 +4 33 68 37 34 +4 37 66 41 38 +4 65 222 225 230 +4 41 64 45 42 +5 63 223 228 216 3 +4 45 62 49 46 +4 61 3 4 7 +4 49 58 53 50 +4 106 105 108 107 +4 108 105 109 110 +4 108 110 112 111 +4 112 110 113 114 +4 112 114 116 115 +4 116 114 117 118 +4 116 118 120 119 +4 120 118 121 122 +4 120 122 124 123 +4 124 122 125 126 +4 124 126 128 127 +4 128 126 129 130 +4 128 130 132 131 +4 132 130 133 134 +7 132 134 218 217 226 227 135 +5 134 136 220 219 218 +5 137 138 221 211 212 +5 139 225 222 221 138 +4 139 138 140 141 +4 139 141 143 142 +4 143 141 144 145 +4 143 145 147 146 +4 147 145 148 149 +4 147 149 151 150 +4 151 149 152 153 +4 151 153 155 154 +4 155 153 156 157 +4 155 157 159 158 +4 159 157 160 161 +4 159 161 109 105 +4 159 105 106 158 +4 109 161 163 162 +4 163 161 160 164 +4 160 165 166 164 +4 164 166 123 167 +4 166 119 120 123 +4 119 166 165 168 +4 165 156 169 168 +4 168 169 170 115 +4 169 152 171 170 +4 170 171 172 111 +4 171 148 173 172 +4 172 173 174 107 +4 173 144 175 174 +4 174 175 177 176 +4 175 140 178 177 +4 177 178 180 179 +4 178 137 181 180 +4 180 181 183 182 +4 181 136 184 183 +4 183 184 186 185 +4 184 133 187 186 +4 186 187 189 188 +4 187 129 190 189 +4 189 190 192 191 +4 190 125 193 192 +4 192 193 195 194 +4 193 121 196 195 +4 195 196 198 197 +4 196 117 199 198 +4 198 199 201 200 +4 199 113 162 201 +4 201 162 163 202 +4 202 163 164 167 +4 167 127 203 202 +4 202 203 200 201 +4 200 203 131 204 +4 131 203 127 128 +4 204 131 132 135 +4 135 205 197 204 +4 204 197 198 200 +4 197 205 194 195 +4 194 205 213 214 +5 206 191 228 223 224 +4 191 206 188 189 +4 188 206 142 207 +6 142 206 224 230 225 139 +4 207 142 143 146 +4 146 208 185 207 +4 207 185 186 188 +4 185 208 182 183 +4 182 208 150 209 +4 150 208 146 147 +4 209 150 151 154 +4 154 210 179 209 +4 209 179 180 182 +4 179 210 176 177 +4 176 210 158 106 +4 158 210 154 155 +4 176 106 107 174 +7 194 214 215 216 228 191 192 +4 205 135 227 213 +4 127 167 123 124 +4 162 113 110 109 +4 113 199 117 114 +4 117 196 121 118 +4 121 193 125 122 +4 125 190 129 126 +4 129 187 133 130 +4 133 184 136 134 +6 136 181 137 212 229 220 +4 137 178 140 138 +4 140 175 144 141 +4 144 173 148 145 +4 172 107 108 111 +4 148 171 152 149 +4 170 111 112 115 +4 152 169 156 153 +4 168 115 116 119 +4 156 165 160 157 diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/data/elephant-with-holes.off b/Surface_mesh_topology/examples/Surface_mesh_topology/data/elephant-with-holes.off new file mode 100644 index 00000000000..a4041f2a4f0 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/data/elephant-with-holes.off @@ -0,0 +1,7265 @@ +OFF +2798 4463 0 + +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.220496 0.208803 0.0718273 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-05 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-05 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.297683 -0.291436 -0.0450671 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.13998 -0.205302 -0.190755 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.24372 -0.401046 -0.225417 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +0.181641 -0.136376 0.0700095 +-0.0985707 -0.0477827 -0.098696 +0.286002 0.0789154 0.0896861 +0.309738 -0.0894098 0.0874741 +0.220704 0.448894 0.117889 +0.047335 -0.0888232 0.265922 +0.172006 0.242405 0.105809 +0.283677 -0.0568988 0.0744319 +0.0958416 -0.324563 -0.0739969 +0.00993129 -0.0278328 -0.0155697 +0.137574 -0.108705 0.207737 +0.262967 -0.0160504 0.0796628 +0.222165 -0.00765217 0.131632 +0.215089 0.0116198 0.126655 +0.344989 -0.280039 -0.276203 +-0.311345 -0.301149 -0.0633156 +-0.298437 -0.298535 -0.0585809 +-0.254096 -0.191499 0.0837602 +0.0761558 -0.344791 -0.0536197 +0.218046 0.211438 0.0580939 +0.0876406 0.00969553 -0.149119 +0.23393 -0.0149701 -0.10397 +0.209378 -0.187531 -0.0743719 +0.216481 0.0416846 0.126455 +0.143956 0.303159 0.203618 +0.19948 -0.240785 -0.114164 +0.286002 0.0789154 0.0896861 +0.217938 0.25177 0.117669 +0.144424 0.408706 0.223131 +0.234086 0.289095 0.199595 +0.260427 0.269097 0.206442 +0.26654 -0.211351 -0.150233 +0.119959 0.124948 0.0613596 +0.127454 0.104238 0.0219653 +-0.267819 -0.241114 -0.0357093 +0.163143 -0.233988 -0.192556 +0.161209 0.00758193 -0.157082 +0.200684 0.169917 0.154336 +0.265642 -0.321399 -0.233195 +-0.291326 -0.23573 -0.0313163 +0.355354 -0.294774 -0.257468 +0.24497 -0.0122967 -0.113875 +0.304942 -0.268737 -0.28762 +-0.345548 -0.417553 -0.216974 +0.161752 -0.208101 -0.1989 +0.33579 -0.291676 -0.2964 +-0.304665 -0.364526 -0.223447 +-0.0814148 -0.0448428 -0.0722969 +0.221779 0.470802 0.0892895 +0.156487 -0.13924 0.256434 +0.015326 -0.129347 0.142131 +0.170691 0.206066 0.147249 +-0.293564 -0.290291 -0.0772666 +0.290218 0.138764 0.11928 +0.178601 -0.140578 0.237092 +-0.227331 -0.265687 0.0979085 +-0.332554 -0.290038 -0.0650158 +0.229872 0.295702 0.229994 +0.112679 0.0343949 0.172228 +0.0422003 -0.0728232 0.283477 +0.266185 -0.201338 -0.169529 +0.0606107 -0.0431898 0.263976 +0.0689625 -0.0703705 0.29266 +0.160239 0.479513 0.0724411 +0.253586 0.0320272 0.0977802 +0.0843142 0.0418575 -0.0419302 +-0.31358 -0.30952 -0.0911544 +0.20517 0.444041 0.0615 +-0.312242 -0.307406 -0.0760424 +0.209982 -0.159856 0.187271 +0.211408 0.277777 0.0261684 +0.0315681 -0.295788 -0.0489563 +0.168396 -0.264129 0.0198747 +0.280108 -0.155995 0.136908 +0.0557269 -0.0839063 0.29826 +-0.280983 -0.308012 -0.105167 +0.288054 0.130079 0.0326142 +0.282604 0.11846 0.0804122 +-0.29694 -0.227134 0.00135872 +0.211416 0.21985 0.0506815 +3 568 1200 1210 +3 893 134 1151 +3 2085 16 2088 +3 1312 1311 325 +3 1019 1025 1020 +3 1220 1219 727 +3 975 1216 179 +3 525 527 182 +3 527 2718 182 +3 1564 1546 1563 +3 665 666 630 +3 1117 1210 239 +3 276 5 277 +3 5 280 277 +3 614 945 946 +3 232 270 272 +3 2510 1719 2511 +3 2184 2183 2182 +3 10 203 275 +3 913 92 2048 +3 523 2666 2667 +3 2107 2109 2102 +3 1353 1355 757 +3 1340 1353 757 +3 981 95 979 +3 1654 1655 30 +3 1659 1655 1654 +3 2032 2033 292 +3 738 739 458 +3 992 2153 2152 +3 2146 992 2152 +3 211 37 212 +3 2164 2167 467 +3 2668 254 2671 +3 213 547 935 +3 1433 1432 439 +3 975 2117 95 +3 452 1011 1010 +3 1758 1763 511 +3 1562 2716 1974 +3 51 1461 1462 +3 2066 51 1462 +3 2323 2329 1359 +3 2022 1475 73 +3 326 323 1734 +3 924 925 173 +3 520 562 696 +3 1972 244 1971 +3 1123 351 349 +3 1864 1863 131 +3 79 26 1575 +3 1465 1656 172 +3 1920 1921 2564 +3 20 103 102 +3 291 2719 1909 +3 1727 1728 334 +3 687 1172 1170 +3 1171 687 1170 +3 1465 65 1656 +3 67 898 120 +3 257 1720 338 +3 1319 1320 445 +3 797 394 472 +3 1316 741 719 +3 1492 2720 1491 +3 276 10 275 +3 274 276 275 +3 255 256 75 +3 677 674 710 +3 1217 941 1215 +3 1573 1574 1946 +3 90 2041 966 +3 715 723 2721 +3 84 1950 2205 +3 204 151 63 +3 1968 1966 1967 +3 75 258 1594 +3 256 258 75 +3 673 2722 1480 +3 293 16 294 +3 16 2085 294 +3 547 213 907 +3 378 380 379 +3 268 266 293 +3 266 16 293 +3 1070 647 1794 +3 113 196 193 +3 1496 2519 2207 +3 209 543 235 +3 1948 1574 26 +3 361 71 362 +3 665 648 664 +3 81 165 155 +3 1120 632 1156 +3 434 1384 2723 +3 795 794 395 +3 156 2065 154 +3 1475 138 1474 +3 2107 2100 2109 +3 355 2100 2107 +3 560 527 524 +3 63 261 271 +3 134 362 377 +3 376 134 377 +3 115 894 893 +3 374 373 133 +3 82 1279 1286 +3 1790 683 1793 +3 1618 577 701 +3 496 493 495 +3 1824 1246 53 +3 1679 1556 510 +3 1154 1057 1056 +3 41 1796 1799 +3 80 79 83 +3 19 103 116 +3 19 153 103 +3 1004 255 1005 +3 256 255 64 +3 640 881 1638 +3 1989 114 1988 +3 1133 2724 1134 +3 123 1591 1594 +3 161 1862 160 +3 2717 375 374 +3 1768 1861 518 +3 503 504 408 +3 1130 745 302 +3 857 1787 1786 +3 2629 1787 857 +3 1646 1026 1645 +3 155 165 50 +3 741 2725 459 +3 720 2725 741 +3 985 987 60 +3 277 278 10 +3 910 92 909 +3 583 2257 1301 +3 1285 1454 1458 +3 67 120 116 +3 235 530 548 +3 135 362 894 +3 1512 1538 1511 +3 261 1692 265 +3 2047 2048 92 +3 5 270 280 +3 2499 62 243 +3 233 314 316 +3 39 83 79 +3 83 39 102 +3 769 1336 1335 +3 1338 769 1335 +3 167 260 262 +3 935 180 1712 +3 935 936 180 +3 1862 161 162 +3 62 1973 243 +3 311 232 272 +3 429 430 185 +3 1718 1719 342 +3 1146 2385 2386 +3 2411 587 1089 +3 1460 1285 1458 +3 2 1123 1124 +3 1050 2462 2463 +3 2726 986 1704 +3 261 265 271 +3 433 1403 1232 +3 2665 2664 523 +3 116 103 104 +3 161 118 119 +3 70 128 162 +3 62 244 1973 +3 1862 162 1863 +3 2022 2020 2021 +3 251 104 246 +3 251 67 104 +3 978 177 980 +3 260 23 262 +3 1989 1988 923 +3 1696 167 1463 +3 121 1005 75 +3 274 275 63 +3 425 148 2727 +3 2184 2700 2151 +3 809 402 472 +3 1475 234 73 +3 1962 1552 2556 +3 2640 895 888 +3 895 890 888 +3 374 375 132 +3 129 71 361 +3 279 107 290 +3 107 279 316 +3 221 82 1286 +3 73 378 373 +3 2022 2021 138 +3 2185 2622 2183 +3 1121 1414 1413 +3 407 805 804 +3 123 1594 258 +3 890 1959 1957 +3 97 1295 272 +3 919 1739 922 +3 141 2094 2099 +3 22 231 77 +3 334 1466 329 +3 1466 1467 329 +3 1327 1320 718 +3 1567 15 1566 +3 540 91 542 +3 2156 2185 2151 +3 2195 2527 2526 +3 375 71 132 +3 1768 1756 1861 +3 275 203 204 +3 167 81 1463 +3 262 23 263 +3 305 150 934 +3 307 305 934 +3 562 558 174 +3 264 1955 1478 +3 233 313 314 +3 1863 162 131 +3 1866 2343 1455 +3 1440 1444 1439 +3 747 894 115 +3 135 894 747 +3 942 1216 975 +3 976 942 975 +3 439 184 440 +3 1694 151 901 +3 83 165 80 +3 143 360 2106 +3 1302 1303 2229 +3 67 116 104 +3 1031 1026 1646 +3 1216 1217 1215 +3 1316 720 741 +3 913 908 92 +3 816 392 815 +3 503 386 504 +3 754 1173 2091 +3 553 1334 176 +3 553 1333 1334 +3 890 895 1959 +3 630 1120 1125 +3 665 630 1125 +3 1235 1228 1237 +3 2658 2657 1409 +3 495 492 496 +3 1663 1198 1197 +3 1321 445 1320 +3 1376 2728 437 +3 920 919 921 +3 1824 1823 1245 +3 1823 1826 1245 +3 2676 2679 238 +3 990 976 982 +3 1446 2707 1435 +3 261 1690 1689 +3 343 327 1126 +3 1124 1123 350 +3 2013 113 1994 +3 140 1470 1471 +3 1463 1685 1696 +3 208 963 964 +3 316 315 107 +3 316 314 315 +3 2049 2045 206 +3 204 58 901 +3 1742 238 839 +3 539 848 1781 +3 86 340 1722 +3 614 906 615 +3 390 794 797 +3 966 965 964 +3 1984 981 925 +3 981 173 925 +3 1766 2687 2688 +3 275 204 63 +3 517 1665 1664 +3 2715 1675 2714 +3 1675 2715 1562 +3 187 2538 2539 +3 793 390 579 +3 1749 1755 1765 +3 470 807 387 +3 509 508 1552 +3 318 2025 2031 +3 470 471 502 +3 1165 764 1166 +3 1212 1213 940 +3 1860 252 100 +3 1887 593 2217 +3 121 1003 1004 +3 270 97 272 +3 222 1588 1589 +3 47 310 311 +3 532 2671 2672 +3 2671 532 531 +3 785 2197 2196 +3 304 38 308 +3 38 304 317 +3 1559 1675 1558 +3 405 945 614 +3 453 433 1234 +3 522 1487 2683 +3 1242 444 1241 +3 1650 2132 2137 +3 502 386 503 +3 1677 1676 1680 +3 1676 1559 1680 +3 1620 1621 577 +3 457 2729 2604 +3 172 920 921 +3 377 71 375 +3 362 71 377 +3 2478 132 2479 +3 125 1953 1955 +3 1108 2149 285 +3 132 129 2479 +3 75 1005 255 +3 115 893 892 +3 129 132 71 +3 899 136 900 +3 122 75 1594 +3 75 122 121 +3 728 727 736 +3 29 534 536 +3 29 533 534 +3 392 817 815 +3 257 1723 1721 +3 338 1718 1725 +3 1128 328 1126 +3 1728 1466 334 +3 2612 2611 691 +3 1723 1724 256 +3 227 1359 2332 +3 2100 2101 2109 +3 581 1670 1071 +3 1057 1154 632 +3 10 276 277 +3 910 1310 210 +3 1602 706 3 +3 2329 2323 2322 +3 2730 2731 2650 +3 317 315 38 +3 315 314 38 +3 5 269 270 +3 2134 2732 1039 +3 1046 2125 2124 +3 234 1475 139 +3 1771 516 1494 +3 231 22 2727 +3 22 1147 2269 +3 2154 2622 2186 +3 2625 2624 823 +3 233 316 279 +3 808 387 799 +3 502 503 470 +3 1634 1450 485 +3 2733 1633 2734 +3 188 2658 2659 +3 1125 1120 1156 +3 826 831 407 +3 831 1169 407 +3 135 747 745 +3 21 2037 297 +3 2735 746 1007 +3 1743 2676 238 +3 2676 1743 515 +3 376 377 375 +3 1721 1723 64 +3 1701 1700 194 +3 297 2037 2036 +3 894 134 893 +3 24 329 991 +3 1147 77 1015 +3 144 423 792 +3 357 356 299 +3 745 1130 13 +3 2649 2652 413 +3 1198 568 567 +3 1200 568 1198 +3 2319 709 2320 +3 528 181 537 +3 603 1182 391 +3 830 146 828 +3 947 146 830 +3 665 1125 648 +3 337 323 326 +3 1406 1392 1611 +3 2608 1793 683 +3 935 546 936 +3 528 537 526 +3 1712 213 935 +3 331 89 333 +3 2427 774 2432 +3 918 1739 920 +3 1250 307 934 +3 2431 943 774 +3 1131 585 1133 +3 920 172 918 +3 2736 1703 1702 +3 2238 2250 2384 +3 1782 1784 1783 +3 219 848 849 +3 343 1126 1732 +3 800 799 387 +3 289 1061 1060 +3 1100 1927 1930 +3 1737 1736 1103 +3 502 811 835 +3 412 830 2653 +3 1439 1444 477 +3 2677 2675 530 +3 561 733 725 +3 2028 2027 295 +3 184 1124 350 +3 1414 1391 435 +3 463 130 744 +3 892 893 357 +3 893 1151 357 +3 585 1131 802 +3 148 231 2727 +3 2278 706 2279 +3 2737 1619 1618 +3 491 777 2551 +3 1477 2639 143 +3 2642 142 889 +3 370 1938 1256 +3 1214 974 179 +3 381 234 139 +3 1256 1258 1263 +3 891 1957 1178 +3 378 234 380 +3 830 828 410 +3 2662 431 1674 +3 780 1538 1512 +3 2549 2738 1549 +3 811 502 471 +3 1169 831 411 +3 2660 1409 2656 +3 431 2660 2656 +3 1201 1204 1202 +3 391 1180 605 +3 235 543 544 +3 1191 522 1192 +3 1448 187 2582 +3 1750 1766 2688 +3 1070 1066 647 +3 1681 2224 2739 +3 2091 1173 687 +3 816 507 789 +3 290 2031 291 +3 212 340 86 +3 844 845 537 +3 845 844 2740 +3 2712 1048 1116 +3 209 540 541 +3 119 473 117 +3 775 613 406 +3 1299 603 1300 +3 1494 2683 521 +3 405 944 945 +3 948 2652 2741 +3 1635 1446 1634 +3 884 762 878 +3 1394 2567 1673 +3 1327 1321 1320 +3 520 521 1334 +3 449 430 448 +3 1677 1678 1561 +3 1676 1677 1561 +3 1868 839 1869 +3 397 1302 1622 +3 416 2209 1529 +3 2209 416 1500 +3 659 657 662 +3 1445 476 475 +3 1425 1635 1634 +3 615 903 405 +3 835 2625 823 +3 457 739 738 +3 461 1409 2660 +3 726 1010 724 +3 1201 517 1204 +3 831 947 411 +3 403 802 1131 +3 443 440 441 +3 2674 529 2669 +3 569 1208 1206 +3 455 2659 189 +3 591 2609 2608 +3 1131 1133 582 +3 618 1371 1372 +3 562 174 696 +3 1369 1370 642 +3 1771 1494 237 +3 1076 599 617 +3 456 455 189 +3 189 453 450 +3 664 667 627 +3 1011 1328 474 +3 2665 174 2664 +3 456 175 455 +3 604 1337 1336 +3 1606 1436 383 +3 2670 530 2669 +3 739 175 456 +3 474 724 1010 +3 972 1519 1521 +3 524 527 525 +3 769 604 1336 +3 2738 2549 2550 +3 560 558 559 +3 739 456 458 +3 407 807 825 +3 734 737 458 +3 599 2742 1780 +3 1742 1743 238 +3 825 826 407 +3 414 789 507 +3 1430 1635 1425 +3 2263 422 2266 +3 471 470 387 +3 1502 1499 1504 +3 1538 1497 782 +3 544 45 545 +3 490 494 511 +3 781 1538 1528 +3 1197 567 1199 +3 1564 1563 1547 +3 2007 1992 2006 +3 1698 1699 575 +3 543 45 544 +3 271 2685 63 +3 1751 1753 2698 +3 1753 1754 2698 +3 496 499 493 +3 1539 1565 1563 +3 498 491 508 +3 798 2202 2200 +3 1565 1541 500 +3 1708 322 1709 +3 1506 1507 1501 +3 863 1040 1039 +3 1772 2696 2695 +3 596 1057 712 +3 2609 644 678 +3 1489 552 1488 +3 2425 1699 396 +3 2691 2693 2690 +3 237 1745 1771 +3 1745 1746 1771 +3 744 743 135 +3 1058 618 1372 +3 1059 618 1058 +3 735 734 458 +3 794 394 797 +3 1009 452 1010 +3 845 533 537 +3 533 526 537 +3 802 801 171 +3 1316 1317 1329 +3 236 523 529 +3 239 1210 1201 +3 49 728 736 +3 533 532 526 +3 532 533 29 +3 892 1958 891 +3 706 1596 3 +3 209 541 543 +3 538 536 534 +3 220 538 534 +3 2409 2408 1653 +3 538 539 540 +3 220 539 538 +3 209 538 540 +3 936 937 180 +3 542 541 540 +3 2691 2690 2692 +3 214 908 911 +3 170 2743 916 +3 846 535 847 +3 45 200 545 +3 1069 94 653 +3 146 947 831 +3 1481 553 1483 +3 733 49 736 +3 176 1485 1484 +3 1483 553 176 +3 2519 147 2207 +3 656 629 684 +3 564 1750 2697 +3 718 742 474 +3 876 873 756 +3 174 558 560 +3 2724 1305 580 +3 549 1492 1485 +3 1663 1664 1198 +3 716 1220 727 +3 1353 760 1354 +3 1340 760 1353 +3 1322 559 558 +3 445 1322 558 +3 698 1054 596 +3 698 623 1054 +3 1064 647 1066 +3 577 1619 1620 +3 591 643 2609 +3 2581 2580 570 +3 764 604 905 +3 604 764 763 +3 905 615 906 +3 671 688 598 +3 654 637 636 +3 723 715 724 +3 611 610 1167 +3 610 611 2744 +3 835 483 502 +3 688 671 626 +3 1058 588 1059 +3 1796 105 56 +3 805 404 804 +3 627 663 664 +3 891 115 892 +3 1191 566 1190 +3 649 670 666 +3 2597 1792 589 +3 405 614 615 +3 2681 2680 1192 +3 640 1638 882 +3 613 0 614 +3 671 669 626 +3 665 649 666 +3 591 2608 2610 +3 1779 595 1778 +3 689 701 577 +3 701 689 1083 +3 392 789 819 +3 1344 1351 1343 +3 1350 1351 1344 +3 404 2431 818 +3 1300 603 602 +3 1138 609 1208 +3 2139 2138 1032 +3 0 906 614 +3 2608 2609 678 +3 2616 2615 573 +3 2680 1196 2684 +3 1325 447 1324 +3 2306 1194 1189 +3 836 2620 824 +3 2280 706 1601 +3 1138 1137 609 +3 2307 2299 1186 +3 2745 2232 581 +3 608 1492 549 +3 550 1492 1491 +3 735 49 734 +3 1132 1131 582 +3 1166 1167 612 +3 1167 1166 611 +3 2491 2490 1602 +3 613 614 406 +3 1353 1354 761 +3 400 1335 1299 +3 1338 1335 400 +3 142 2107 2102 +3 1332 446 1331 +3 1445 2104 352 +3 134 376 1150 +3 775 551 613 +3 2746 684 629 +3 659 662 663 +3 2696 1751 2697 +3 1057 713 712 +3 645 1172 1173 +3 628 669 671 +3 1660 1661 651 +3 804 387 807 +3 662 658 649 +3 658 670 649 +3 2305 1180 606 +3 656 588 657 +3 629 657 659 +3 702 1083 1082 +3 760 1340 1337 +3 749 2747 1893 +3 1957 891 1958 +3 1168 1169 411 +3 1396 1385 2287 +3 628 671 676 +3 663 662 649 +3 660 2746 629 +3 627 660 659 +3 660 629 659 +3 1887 1889 593 +3 807 407 804 +3 684 619 656 +3 1070 1065 1066 +3 627 659 663 +3 657 588 658 +3 1617 1618 701 +3 875 639 2748 +3 1661 698 651 +3 628 676 661 +3 142 356 2107 +3 1876 1875 886 +3 697 651 698 +3 1830 1232 1829 +3 712 713 633 +3 599 1076 1069 +3 1331 446 1330 +3 2115 673 1480 +3 848 539 220 +3 708 1603 2490 +3 1752 1769 2693 +3 738 737 556 +3 1120 630 1119 +3 1524 1513 1540 +3 956 955 249 +3 483 835 823 +3 1160 1161 1165 +3 1533 1535 784 +3 1698 1615 1977 +3 981 979 173 +3 850 219 849 +3 2749 219 850 +3 723 459 722 +3 459 2725 722 +3 354 2093 2092 +3 459 723 724 +3 1345 759 1347 +3 737 740 556 +3 722 2721 723 +3 734 561 737 +3 561 734 733 +3 1555 509 1962 +3 764 1161 763 +3 947 830 412 +3 49 733 734 +3 1218 727 1219 +3 742 724 474 +3 894 362 134 +3 459 724 742 +3 742 719 741 +3 459 742 741 +3 743 362 135 +3 1890 1891 749 +3 1368 2610 1371 +3 568 796 93 +3 872 753 685 +3 1418 2444 1121 +3 878 877 756 +3 401 767 1350 +3 945 412 946 +3 583 1301 1302 +3 134 1150 1151 +3 764 1165 1161 +3 615 905 902 +3 433 461 1402 +3 773 584 772 +3 756 884 878 +3 408 826 825 +3 796 814 394 +3 1335 768 1299 +3 1009 1221 1222 +3 784 1534 1533 +3 2630 2629 857 +3 2274 1008 2273 +3 1533 415 1535 +3 283 2141 229 +3 1649 2138 2139 +3 351 2096 349 +3 390 793 794 +3 402 797 472 +3 945 947 412 +3 768 2440 1299 +3 1197 1196 241 +3 804 800 387 +3 1169 1168 805 +3 826 146 831 +3 1114 2433 944 +3 2750 812 811 +3 809 472 810 +3 796 393 814 +3 2750 811 471 +3 1196 566 2684 +3 392 816 789 +3 2195 820 788 +3 789 820 819 +3 947 944 411 +3 944 947 945 +3 1169 805 407 +3 1911 2521 1109 +3 481 837 836 +3 15 2553 1569 +3 1562 2715 2716 +3 847 220 846 +3 2156 2151 2701 +3 236 529 2674 +3 2253 2254 856 +3 2132 2128 1034 +3 1125 1156 648 +3 864 1043 1023 +3 2014 2013 927 +3 1152 43 357 +3 866 2254 2713 +3 1039 1040 1022 +3 905 906 764 +3 303 13 1130 +3 2638 2637 298 +3 2308 2309 607 +3 685 753 1888 +3 1874 1875 1346 +3 1129 301 1130 +3 897 115 891 +3 747 115 897 +3 922 1739 1738 +3 745 747 897 +3 211 901 58 +3 1116 861 1115 +3 76 334 1113 +3 908 214 907 +3 908 907 909 +3 990 987 942 +3 1371 1789 1372 +3 1711 1712 180 +3 1063 1111 1112 +3 955 954 249 +3 1470 1472 1471 +3 2651 2606 2650 +3 1849 1850 2391 +3 393 2709 2751 +3 814 393 2751 +3 2654 410 2651 +3 412 2653 948 +3 997 467 994 +3 286 1061 951 +3 70 127 128 +3 2018 336 2019 +3 1601 706 1602 +3 2470 2290 2469 +3 2159 2362 2160 +3 2622 2154 2183 +3 2387 2262 2259 +3 121 1004 1005 +3 245 252 59 +3 467 992 994 +3 2153 992 467 +3 2004 982 2003 +3 1192 2682 2681 +3 1227 1809 1810 +3 917 1654 1653 +3 1096 856 1097 +3 859 1096 1097 +3 1025 1026 1031 +3 2711 2710 1117 +3 2070 1278 2071 +3 2332 2330 2752 +3 1359 2330 2332 +3 1274 1140 1270 +3 984 60 983 +3 1236 1825 1662 +3 2076 1279 226 +3 2378 880 2376 +3 1257 1256 1252 +3 370 1256 1257 +3 1586 1587 1141 +3 1586 465 1587 +3 2083 223 2084 +3 2481 1500 1502 +3 1354 885 761 +3 2040 201 2041 +3 2546 2549 2547 +3 2546 1551 2549 +3 970 969 968 +3 970 968 218 +3 913 419 911 +3 419 913 2753 +3 2753 913 217 +3 56 1797 1796 +3 2130 2133 2131 +3 205 2049 211 +3 761 2217 593 +3 2217 761 874 +3 2053 964 963 +3 542 963 208 +3 332 1856 1855 +3 1313 2052 210 +3 965 541 208 +3 2047 2046 207 +3 1727 334 1726 +3 1311 210 1310 +3 860 1645 1642 +3 278 57 10 +3 57 278 1906 +3 1786 1787 216 +3 1787 968 216 +3 1783 1786 216 +3 987 1217 942 +3 1965 1964 1963 +3 2061 2059 218 +3 2063 967 960 +3 967 962 960 +3 2058 2061 960 +3 2061 2063 960 +3 2063 2061 2062 +3 1595 540 539 +3 1964 912 1963 +3 2061 218 2062 +3 1792 594 1791 +3 1741 1553 2754 +3 1557 1741 2754 +3 916 2743 1965 +3 973 313 230 +3 300 2635 2036 +3 2092 2093 2110 +3 1505 1501 783 +3 1506 1505 1499 +3 2671 254 2672 +3 2617 690 2612 +3 690 2611 2612 +3 1517 1516 54 +3 1512 1516 1517 +3 1509 1507 1506 +3 345 1939 1966 +3 1499 1508 1506 +3 2209 2210 1529 +3 2210 2209 787 +3 667 648 1608 +3 1503 416 972 +3 2207 147 2212 +3 2208 2207 2212 +3 2636 2633 2637 +3 21 295 296 +3 2600 688 626 +3 778 2600 626 +3 2544 1940 2542 +3 1940 1941 2542 +3 313 38 314 +3 313 973 38 +3 973 308 38 +3 1372 1789 594 +3 36 192 1701 +3 978 979 95 +3 1657 8 1655 +3 987 990 60 +3 65 1659 1656 +3 979 921 173 +3 921 924 173 +3 295 2027 292 +3 438 1436 1437 +3 438 2686 1436 +3 192 985 984 +3 1650 1649 1033 +3 974 177 978 +3 177 974 417 +3 686 1171 2755 +3 1672 1051 1642 +3 921 919 924 +3 1018 1020 851 +3 1018 2467 1020 +3 1854 2585 2594 +3 1146 2386 2243 +3 1469 331 333 +3 37 1313 341 +3 1836 1248 1833 +3 1652 4 199 +3 2018 124 1590 +3 124 1592 1590 +3 913 911 908 +3 192 36 985 +3 1703 2726 1704 +3 1729 326 1732 +3 348 33 988 +3 324 348 988 +3 765 1164 1348 +3 1467 991 329 +3 2510 87 2514 +3 985 986 987 +3 988 980 177 +3 989 988 177 +3 989 324 988 +3 2103 353 2104 +3 1715 1714 321 +3 989 177 417 +3 976 990 942 +3 1017 855 1018 +3 951 289 1104 +3 1061 289 951 +3 1927 1926 1101 +3 1970 246 245 +3 246 66 245 +3 2163 995 2165 +3 2162 2172 2173 +3 1907 1903 1904 +3 1907 110 1903 +3 1509 971 1510 +3 1514 1509 1510 +3 69 121 122 +3 1003 121 69 +3 1996 983 2010 +3 2009 1996 2010 +3 2154 994 2148 +3 1930 1928 1931 +3 1933 347 1928 +3 2149 952 2150 +3 40 1968 1967 +3 120 898 1003 +3 69 120 1003 +3 347 1101 2175 +3 2171 2162 2166 +3 2171 2166 995 +3 2612 691 2613 +3 138 2021 2024 +3 999 2175 2170 +3 2258 1143 1578 +3 483 823 2623 +3 999 2168 2166 +3 1002 2153 467 +3 2167 1002 467 +3 2506 163 2505 +3 2163 2164 997 +3 2165 2164 2163 +3 2324 2323 2325 +3 1264 2349 2345 +3 974 2117 975 +3 2044 2040 2041 +3 2044 205 2040 +3 305 307 1007 +3 746 305 1007 +3 305 746 13 +3 2300 1185 2301 +3 728 731 1223 +3 1009 1010 726 +3 729 728 49 +3 49 735 729 +3 1316 1329 720 +3 474 1010 1011 +3 729 735 732 +3 451 729 732 +3 1811 1812 1227 +3 1666 1664 1495 +3 2728 436 185 +3 2023 2024 2021 +3 2024 2023 1471 +3 333 1473 1472 +3 2644 1651 1646 +3 1645 2644 1646 +3 430 449 2728 +3 185 430 2728 +3 453 461 433 +3 693 1110 1080 +3 1014 833 834 +3 1080 1110 832 +3 1913 2523 1911 +3 2628 2339 368 +3 2339 2628 2341 +3 1502 1500 1503 +3 2211 787 2194 +3 1064 1112 647 +3 682 2273 2272 +3 695 833 1014 +3 339 1719 1720 +3 1719 338 1720 +3 2033 2032 2034 +3 2047 92 910 +3 2046 2045 2050 +3 2045 90 2050 +3 1216 1215 179 +3 1651 2140 1647 +3 1649 2139 2140 +3 2139 1032 2140 +3 2756 2460 1029 +3 374 133 2717 +3 865 1021 1020 +3 1045 2125 2120 +3 1221 726 1220 +3 1786 1783 1785 +3 492 1554 496 +3 2272 2273 705 +3 1596 2272 705 +3 379 1150 376 +3 1021 864 1023 +3 1021 1022 864 +3 1223 716 728 +3 852 1018 851 +3 1024 852 851 +3 1023 1024 851 +3 1906 2442 57 +3 852 1017 1018 +3 1773 1267 1257 +3 2757 1773 1257 +3 928 1981 1989 +3 1646 1647 1031 +3 1392 1406 2567 +3 1406 1395 2567 +3 2123 1045 2122 +3 1025 862 1026 +3 27 1575 1573 +3 1801 27 1573 +3 2123 2124 2125 +3 2758 2134 1038 +3 960 419 2753 +3 649 665 664 +3 779 597 1053 +3 622 779 1053 +3 650 2116 1008 +3 2116 2275 1008 +3 419 960 962 +3 859 1092 1094 +3 1096 859 1094 +3 34 1996 1995 +3 1996 195 1995 +3 1982 2000 1999 +3 2000 1983 1999 +3 1035 2133 2130 +3 1034 2128 2127 +3 1805 1731 259 +3 864 1041 1043 +3 1687 152 1686 +3 2461 2460 1028 +3 2674 2669 530 +3 1678 1677 1560 +3 609 2304 1188 +3 235 536 209 +3 2732 863 1039 +3 1038 1039 1022 +3 2759 1680 565 +3 1654 30 1653 +3 2465 1019 2466 +3 1019 2467 2466 +3 2460 2756 1049 +3 1021 865 1022 +3 1022 1040 864 +3 1040 1041 864 +3 1043 854 1023 +3 1020 1021 851 +3 1021 1023 851 +3 1042 854 1043 +3 2760 2253 871 +3 2253 2760 867 +3 1935 1420 2443 +3 1044 1040 863 +3 1679 501 2226 +3 1556 1679 2226 +3 1785 854 1042 +3 1760 1762 1761 +3 1984 1985 2001 +3 2156 2761 2155 +3 2060 2762 958 +3 2763 1034 2127 +3 2124 2123 869 +3 2589 2588 8 +3 1976 2216 2217 +3 874 1976 2217 +3 993 2764 2149 +3 664 663 649 +3 931 1947 1944 +3 196 1854 193 +3 2712 866 2713 +3 1093 855 1017 +3 914 1093 1017 +3 2458 2460 1049 +3 631 1156 1155 +3 1156 632 1155 +3 2183 2154 2182 +3 2118 861 1048 +3 237 521 520 +3 1494 521 237 +3 2003 982 977 +3 2064 2053 963 +3 2509 1714 1717 +3 1981 2014 927 +3 928 2014 1981 +3 1657 1659 65 +3 622 1053 1054 +3 1055 622 1054 +3 658 1055 623 +3 1055 1054 623 +3 588 1055 658 +3 1078 2420 2418 +3 1054 1056 596 +3 1054 1053 1056 +3 1155 626 631 +3 1902 1900 1880 +3 1896 1895 749 +3 1055 588 1058 +3 1056 1053 1154 +3 465 1588 1587 +3 1588 222 1587 +3 1055 1058 622 +3 2354 268 2355 +3 656 655 1059 +3 655 656 619 +3 2088 2089 221 +3 703 1063 2534 +3 2533 703 2534 +3 605 396 576 +3 396 605 1137 +3 1064 1066 1062 +3 664 648 667 +3 1102 1737 1103 +3 288 1102 1103 +3 644 1071 1070 +3 678 644 1070 +3 647 1795 1794 +3 1065 1070 1071 +3 1063 1112 1064 +3 1081 1080 703 +3 702 701 1083 +3 1081 693 1080 +3 577 1979 689 +3 1979 577 1621 +3 1074 1068 590 +3 1068 1074 94 +3 586 1075 1074 +3 1066 1065 1072 +3 1879 1373 636 +3 1879 1894 1373 +3 681 2415 1089 +3 1064 1062 2534 +3 1793 1794 679 +3 170 1091 535 +3 1078 1077 2420 +3 1086 592 1078 +3 681 1086 1078 +3 1505 1504 1499 +3 587 1085 1086 +3 1065 1073 1072 +3 590 1068 1067 +3 1931 1928 1099 +3 2378 2377 748 +3 2377 2378 2376 +3 399 2377 2376 +3 751 644 750 +3 751 1071 644 +3 47 311 272 +3 2534 1063 1064 +3 2533 2534 1062 +3 1133 1135 2724 +3 1133 585 1135 +3 702 2508 574 +3 584 773 1309 +3 1133 1134 582 +3 1134 2724 580 +3 1074 1075 94 +3 1075 646 94 +3 646 653 94 +3 1791 594 1790 +3 2249 2239 2320 +3 2244 2249 2320 +3 1503 971 1570 +3 953 1111 1088 +3 1188 1189 609 +3 1080 832 1063 +3 2421 1077 2422 +3 396 2424 2425 +3 2424 396 1138 +3 2028 2765 25 +3 785 2196 2191 +3 596 712 791 +3 712 711 791 +3 2080 2077 2078 +3 2418 2420 2419 +3 680 2418 2419 +3 2420 1077 2421 +3 2419 2420 2421 +3 617 2422 1076 +3 1086 1067 592 +3 1113 329 335 +3 329 24 335 +3 2722 677 1480 +3 674 677 2722 +3 953 1087 1079 +3 1066 1067 1085 +3 1067 1066 590 +3 1062 1085 587 +3 1062 1066 1085 +3 587 1086 1089 +3 2507 2508 702 +3 832 1111 1063 +3 1085 1067 1086 +3 1436 1606 1437 +3 1732 326 1733 +3 246 1970 2706 +3 251 246 2706 +3 916 1091 170 +3 1112 1111 953 +3 668 1609 1610 +3 1168 806 805 +3 2766 2240 2245 +3 2246 2766 2245 +3 2660 2661 1408 +3 847 535 1091 +3 849 847 1091 +3 849 848 847 +3 849 1091 916 +3 849 916 850 +3 587 2411 2412 +3 1089 1086 681 +3 2523 1014 2521 +3 1644 1027 861 +3 2235 2456 2457 +3 1645 1026 1672 +3 2322 367 1451 +3 1982 927 2000 +3 514 1763 1757 +3 1785 1042 857 +3 1786 1785 857 +3 1583 1584 2631 +3 1141 2631 1584 +3 1095 858 1096 +3 1094 1095 1096 +3 1018 2466 2467 +3 1262 2221 1669 +3 2221 1262 2222 +3 1796 7 105 +3 1924 1923 1104 +3 992 2146 2147 +3 2183 2184 2151 +3 2185 2183 2151 +3 87 2510 2511 +3 182 2718 1855 +3 283 229 282 +3 1805 1725 1718 +3 114 1989 1991 +3 1989 1981 1991 +3 1922 1931 1099 +3 1804 1803 1801 +3 2703 993 2150 +3 790 1500 2481 +3 2172 2162 2171 +3 1103 1106 288 +3 2371 1175 1174 +3 1497 2189 1501 +3 1105 1921 1923 +3 1922 1921 1105 +3 996 2158 2157 +3 1103 469 1589 +3 1100 1924 1925 +3 1918 287 1098 +3 873 1975 756 +3 1923 1932 1105 +3 1421 1420 1934 +3 997 2164 467 +3 887 2642 2643 +3 2201 2200 2202 +3 666 1660 672 +3 630 666 672 +3 1501 1505 1506 +3 2491 1602 3 +3 2413 832 1109 +3 903 904 1114 +3 903 1114 405 +3 944 405 1114 +3 801 818 171 +3 818 2428 171 +3 2433 2432 774 +3 2433 1114 2432 +3 836 837 2434 +3 2307 2308 2312 +3 1214 179 1213 +3 179 1215 1213 +3 1057 632 713 +3 632 1120 713 +3 2277 2276 682 +3 713 1119 1118 +3 1119 713 1120 +3 358 380 1152 +3 1870 388 1869 +3 425 144 426 +3 2273 2275 705 +3 2275 2273 1008 +3 1118 650 1008 +3 1118 1119 650 +3 2659 453 189 +3 1123 2 351 +3 529 2668 2669 +3 478 479 1438 +3 478 386 479 +3 2405 912 2403 +3 2104 1859 352 +3 1416 1674 431 +3 1904 1903 12 +3 1386 2470 2469 +3 352 487 1429 +3 343 1732 1733 +3 326 1730 337 +3 1817 1818 1816 +3 1825 1822 1662 +3 1232 2767 1829 +3 1374 1113 335 +3 150 363 934 +3 363 1250 934 +3 1770 518 1746 +3 2639 2634 2638 +3 360 2639 2638 +3 889 2638 298 +3 93 796 795 +3 1179 109 1129 +3 1493 1193 1494 +3 706 2278 1596 +3 575 2426 2423 +3 575 2425 2426 +3 109 301 1129 +3 300 301 2635 +3 109 1179 896 +3 1474 2768 139 +3 2099 354 2100 +3 301 303 1130 +3 149 303 301 +3 403 801 802 +3 2428 2430 2427 +3 904 2428 2427 +3 585 1136 1135 +3 799 403 2200 +3 587 2412 1062 +3 2411 1090 2412 +3 1534 2190 1497 +3 800 403 799 +3 2233 2228 2230 +3 877 876 756 +3 1136 585 2769 +3 585 802 2769 +3 2108 382 381 +3 1182 603 1183 +3 2667 2666 254 +3 55 2225 1681 +3 465 2145 1588 +3 224 2075 2074 +3 1584 1585 1586 +3 464 1585 1584 +3 311 310 230 +3 310 309 230 +3 1290 1289 228 +3 273 1290 1277 +3 1273 2368 2370 +3 47 369 310 +3 465 1586 1585 +3 2342 2343 158 +3 2346 2342 158 +3 318 2034 2032 +3 1148 2034 318 +3 2220 466 2219 +3 1582 1141 1142 +3 1579 1578 1142 +3 1071 1670 1065 +3 2222 1262 1268 +3 1587 222 1142 +3 1290 228 1277 +3 1286 1279 2075 +3 1260 1269 1270 +3 1269 1274 1270 +3 1667 1668 1261 +3 1361 652 634 +3 1261 1258 1630 +3 1272 1260 1270 +3 225 1269 1268 +3 225 2770 1269 +3 1938 1258 1256 +3 2249 2386 2385 +3 2386 2249 2244 +3 1981 2321 1991 +3 363 150 309 +3 2327 363 309 +3 367 2323 2324 +3 466 2220 1106 +3 1344 1345 766 +3 1151 1152 357 +3 358 1152 1151 +3 274 5 276 +3 274 1153 5 +3 265 96 271 +3 1434 1436 2686 +3 1436 1434 1433 +3 994 2186 2155 +3 1887 2217 2216 +3 2131 1034 2708 +3 648 1156 1608 +3 2418 2417 1078 +3 2418 1079 2417 +3 1499 1570 1508 +3 420 2437 1167 +3 610 420 1167 +3 1181 2311 1184 +3 1166 0 611 +3 1165 612 1160 +3 732 189 451 +3 1161 765 1162 +3 764 906 1166 +3 1612 1383 1611 +3 612 1165 1166 +3 456 189 732 +3 637 1879 636 +3 1879 637 1880 +3 762 1346 879 +3 620 1366 1878 +3 1894 620 1878 +3 1416 2537 1674 +3 2535 1413 1412 +3 703 1080 1063 +3 1161 1160 765 +3 2436 612 1167 +3 2437 2436 1167 +3 770 2771 2439 +3 2771 770 401 +3 269 2354 281 +3 418 1172 646 +3 37 2052 1313 +3 487 486 1426 +3 1177 645 1176 +3 790 2481 1498 +3 803 1170 418 +3 1639 1641 852 +3 1174 645 1173 +3 2372 1174 2374 +3 875 2378 639 +3 638 1881 2352 +3 646 1172 1177 +3 2381 881 2371 +3 645 1174 1175 +3 267 2357 2356 +3 1178 897 891 +3 268 2353 96 +3 2372 2371 1174 +3 2381 2371 2372 +3 645 1175 1176 +3 302 897 1178 +3 897 302 745 +3 645 1177 1172 +3 1904 106 1907 +3 1177 653 646 +3 600 653 1177 +3 653 600 2742 +3 2399 1015 2401 +3 1546 2532 1563 +3 2532 1539 1563 +3 638 1882 1881 +3 1129 1130 302 +3 1178 1129 302 +3 1179 1129 1178 +3 1181 391 1182 +3 906 0 1166 +3 2620 480 2520 +3 1191 1190 549 +3 522 1191 549 +3 2173 347 2175 +3 2173 1929 347 +3 570 2423 2424 +3 569 570 2424 +3 796 394 795 +3 1180 391 1181 +3 2438 2437 420 +3 904 616 2429 +3 2581 570 93 +3 1180 1181 606 +3 1181 1184 606 +3 609 2305 2304 +3 609 1137 2305 +3 521 2683 1487 +3 1209 2313 1195 +3 2201 402 2203 +3 82 1683 1282 +3 1280 82 1282 +3 1699 1698 572 +3 1621 572 1979 +3 1492 550 1485 +3 1207 93 569 +3 606 1184 1187 +3 167 1688 260 +3 1334 521 1487 +3 2710 2711 815 +3 2181 2158 2699 +3 2158 2181 2180 +3 563 1202 1204 +3 1202 563 513 +3 2682 1192 522 +3 1204 1666 1205 +3 1204 517 1666 +3 204 901 151 +3 1197 1198 567 +3 2313 1209 2312 +3 606 2304 2305 +3 396 1699 576 +3 494 1760 1759 +3 1939 1941 1940 +3 393 568 1117 +3 568 1210 1117 +3 2307 2312 1209 +3 1615 1698 575 +3 513 1203 1202 +3 490 511 1764 +3 239 1202 1203 +3 1193 2682 2683 +3 2682 522 2683 +3 274 2685 1153 +3 512 1757 1758 +3 1744 515 1743 +3 1203 816 239 +3 816 1203 493 +3 239 1201 1202 +3 773 1306 1309 +3 55 1760 1761 +3 2576 2578 2573 +3 2576 2579 2578 +3 230 309 973 +3 1758 1757 1763 +3 1765 1756 1766 +3 563 1205 1748 +3 1208 609 566 +3 609 1190 566 +3 1184 2311 2309 +3 1199 1208 566 +3 1208 1199 1206 +3 1196 1199 566 +3 1137 1180 2305 +3 2408 1658 1653 +3 1668 1669 372 +3 1204 1205 563 +3 2313 2314 1195 +3 1485 550 1488 +3 1221 716 1222 +3 940 937 1211 +3 180 937 940 +3 35 1217 987 +3 865 1025 1031 +3 1110 693 1911 +3 351 2 1859 +3 1214 1213 1212 +3 914 1017 1016 +3 2140 1032 1647 +3 1217 35 941 +3 916 1965 215 +3 1788 940 1215 +3 936 181 938 +3 2012 2016 2017 +3 2016 2012 1994 +3 2677 530 235 +3 1807 2448 2449 +3 1221 1009 726 +3 17 2587 2589 +3 1815 1810 1814 +3 1810 1815 1811 +3 1220 716 1221 +3 1228 1817 730 +3 1345 1344 879 +3 1817 1235 1818 +3 1011 1813 1012 +3 452 1809 1227 +3 1813 1227 1812 +3 730 451 1228 +3 728 716 727 +3 2338 2341 2340 +3 2337 2338 2340 +3 1816 190 1811 +3 181 528 938 +3 938 528 48 +3 528 1856 48 +3 1222 1224 1009 +3 1810 1809 1808 +3 1228 1235 1817 +3 189 450 451 +3 452 1227 1813 +3 108 2033 2034 +3 1592 1593 127 +3 68 1592 127 +3 2718 89 332 +3 1813 1812 1012 +3 2567 1394 2566 +3 900 2018 2019 +3 2018 900 124 +3 450 1237 451 +3 2497 59 2496 +3 1236 1237 450 +3 450 453 1234 +3 1234 433 1232 +3 1806 2448 1224 +3 2448 1806 2449 +3 1228 451 1237 +3 1472 1470 333 +3 2373 2374 754 +3 1877 1876 886 +3 1473 184 350 +3 2519 2189 2190 +3 1833 1834 1247 +3 1833 1248 1834 +3 1237 1820 1229 +3 2265 2264 424 +3 1664 1665 1198 +3 1665 1200 1198 +3 1664 1663 1495 +3 444 1011 1241 +3 1877 1163 1876 +3 1246 1824 1245 +3 442 183 441 +3 1238 1239 1012 +3 183 443 441 +3 1012 1241 1011 +3 1012 1239 1241 +3 1241 1240 1242 +3 1464 2338 1266 +3 2338 1464 366 +3 1236 450 1831 +3 1830 2772 1831 +3 1346 759 1345 +3 1875 759 1346 +3 2707 1434 2686 +3 1435 2707 2686 +3 24 2020 336 +3 1246 1245 1835 +3 1495 1663 241 +3 1663 1197 241 +3 1433 383 1436 +3 1278 2073 2074 +3 137 73 899 +3 73 137 2022 +3 335 24 336 +3 1672 1026 1576 +3 1457 1455 366 +3 55 1761 2225 +3 427 1873 425 +3 348 1465 33 +3 1255 1773 1774 +3 2334 227 2333 +3 227 2332 2333 +3 1263 2349 52 +3 368 2627 2628 +3 1276 2070 2071 +3 1632 2770 225 +3 1294 97 282 +3 372 1263 1258 +3 1261 372 1258 +3 463 2773 130 +3 1007 1006 2735 +3 2348 1006 1007 +3 2676 2675 2677 +3 544 2677 235 +3 548 530 2670 +3 2070 1276 1275 +3 1144 2070 1275 +3 2774 1272 1271 +3 1272 1270 1271 +3 1256 1263 52 +3 1252 1256 52 +3 1273 2774 2368 +3 309 150 308 +3 2088 16 1687 +3 2356 268 293 +3 1269 1260 1268 +3 2085 2088 2087 +3 372 1261 1668 +3 1630 2734 1261 +3 1630 2733 2734 +3 370 1937 1938 +3 418 1170 1172 +3 707 1599 633 +3 1118 707 633 +3 1339 769 1338 +3 366 2339 2338 +3 1996 34 983 +3 367 1280 1298 +3 155 2065 2066 +3 224 2081 1286 +3 51 157 1454 +3 1285 51 1454 +3 1253 2333 364 +3 2333 1253 2334 +3 2673 2678 526 +3 1254 2331 1775 +3 1139 1287 1289 +3 1287 228 1289 +3 312 311 230 +3 228 1287 1275 +3 2074 2077 224 +3 1774 1775 1255 +3 2505 163 2494 +3 1140 1271 1270 +3 973 309 308 +3 1682 1681 2739 +3 1140 1274 1275 +3 286 1315 2084 +3 2339 2341 2338 +3 1315 294 2084 +3 1280 226 1279 +3 82 1280 1279 +3 47 1277 1293 +3 2230 1304 2233 +3 1304 2230 2231 +3 1398 1399 1378 +3 1101 1102 288 +3 1579 2258 1578 +3 1581 1288 1139 +3 1001 2173 2172 +3 368 2339 2346 +3 1103 1736 469 +3 1286 2075 224 +3 469 1736 1735 +3 159 1452 1451 +3 2629 961 1787 +3 2077 2074 1281 +3 1295 1294 273 +3 1295 1277 272 +3 272 1277 47 +3 1295 273 1277 +3 2044 90 2045 +3 90 2044 2041 +3 2181 2703 2150 +3 1298 1282 1459 +3 366 1455 2342 +3 2339 366 2342 +3 157 51 156 +3 463 744 306 +3 1957 1959 319 +3 536 548 29 +3 548 2670 29 +3 186 1849 2391 +3 2351 1176 1175 +3 2069 2070 1144 +3 2070 2069 1278 +3 1271 2365 2368 +3 2757 1774 1773 +3 1140 1275 1288 +3 1288 1275 1287 +3 1288 1287 1139 +3 46 277 280 +3 369 47 1293 +3 227 2325 1359 +3 1586 1141 1584 +3 1291 1289 1290 +3 232 311 312 +3 280 270 232 +3 2073 1281 2074 +3 97 1294 1295 +3 1291 273 1292 +3 273 1291 1290 +3 1292 1294 282 +3 1294 1292 273 +3 2078 2086 1283 +3 2086 1735 1283 +3 999 2170 2168 +3 2365 2370 2368 +3 2367 2366 1140 +3 957 1142 1578 +3 1578 1143 1577 +3 2258 1273 2370 +3 2699 2158 2700 +3 638 2352 2351 +3 1336 768 1335 +3 604 902 905 +3 580 1626 1627 +3 796 568 393 +3 2430 774 2427 +3 943 2431 806 +3 773 772 400 +3 2220 1002 1106 +3 1339 616 769 +3 1103 466 1106 +3 1301 1300 602 +3 1030 1116 2450 +3 1030 2712 1116 +3 2327 2334 363 +3 2334 1253 363 +3 2052 910 210 +3 1980 2617 1697 +3 1302 1301 602 +3 773 2256 2257 +3 2232 1670 581 +3 1303 580 2228 +3 2355 281 2354 +3 2357 281 2355 +3 2042 966 2041 +3 966 2042 200 +3 2228 2227 1303 +3 399 2372 2373 +3 2372 2374 2373 +3 2508 2507 833 +3 2351 2352 1176 +3 1790 1793 679 +3 752 1309 1307 +3 1773 2223 1267 +3 2328 1451 1452 +3 909 1310 910 +3 1704 1702 1703 +3 2177 1918 1098 +3 76 1113 1374 +3 1729 1732 328 +3 1732 1126 328 +3 321 320 1716 +3 293 1315 267 +3 294 1315 293 +3 1026 862 1576 +3 719 1317 1316 +3 1319 1317 719 +3 1317 1319 1318 +3 1318 557 1317 +3 1318 562 557 +3 562 1318 558 +3 445 1318 1319 +3 1318 445 558 +3 2130 2131 2708 +3 1328 1327 718 +3 444 1325 717 +3 946 948 406 +3 501 2225 2226 +3 447 1325 444 +3 1320 1326 718 +3 443 183 704 +3 1324 443 704 +3 1326 742 718 +3 445 1321 1322 +3 1328 718 474 +3 1322 704 559 +3 1323 704 1322 +3 704 1323 1324 +3 737 738 458 +3 457 2604 739 +3 2660 1408 461 +3 1326 719 742 +3 1319 719 1326 +3 1319 1326 1320 +3 383 1324 447 +3 1324 1323 1325 +3 717 1327 1328 +3 717 1328 444 +3 732 458 456 +3 732 735 458 +3 444 1328 1011 +3 446 1332 1333 +3 1332 520 1333 +3 406 2741 775 +3 562 1331 557 +3 995 2163 2160 +3 490 1764 841 +3 878 879 398 +3 2720 1492 608 +3 515 1744 519 +3 562 1332 1331 +3 457 738 556 +3 767 401 770 +3 2397 1399 1398 +3 1358 876 877 +3 1341 1342 758 +3 1373 1878 635 +3 1878 1366 635 +3 1340 757 1341 +3 1552 1962 509 +3 583 1302 2229 +3 1336 1337 758 +3 1337 1340 758 +3 1385 1396 1379 +3 902 604 769 +3 1895 1890 749 +3 2288 1384 1381 +3 758 1340 1341 +3 879 1344 1343 +3 883 1342 1341 +3 1342 883 398 +3 1343 1342 398 +3 879 1343 398 +3 1162 763 1161 +3 757 883 1341 +3 765 1348 1349 +3 1162 765 1349 +3 1349 1347 759 +3 1163 1349 759 +3 1163 1162 1349 +3 1345 1347 766 +3 763 1162 1163 +3 2136 870 2135 +3 2136 2137 870 +3 2240 1146 2241 +3 1348 766 1347 +3 1349 1348 1347 +3 772 1338 400 +3 700 699 2574 +3 1626 580 1303 +3 1705 320 321 +3 1342 1343 1351 +3 2256 1301 2257 +3 1352 1342 1351 +3 1350 767 1351 +3 767 1352 1351 +3 1339 2429 616 +3 761 593 1355 +3 1353 761 1355 +3 1357 755 1358 +3 755 876 1358 +3 593 1356 1355 +3 1355 1356 757 +3 1356 1357 757 +3 687 1171 686 +3 547 214 915 +3 1357 1358 883 +3 757 1357 883 +3 1961 877 878 +3 1360 619 684 +3 2746 1360 684 +3 1360 2746 652 +3 1882 621 1883 +3 621 2775 1883 +3 1909 290 291 +3 1361 619 1360 +3 652 1361 1360 +3 2460 2461 1029 +3 2461 2464 1029 +3 969 216 968 +3 655 1367 1059 +3 642 1366 1369 +3 1060 1737 1102 +3 620 1369 1366 +3 620 1901 1369 +3 1838 1839 1248 +3 2472 1387 2473 +3 635 1365 1364 +3 635 1366 1365 +3 619 1364 655 +3 635 1364 1362 +3 1362 1364 1361 +3 1364 619 1361 +3 1362 1361 634 +3 2471 1388 2290 +3 642 1367 1365 +3 1366 642 1365 +3 1902 1899 1900 +3 1899 641 1900 +3 2598 2597 589 +3 2598 2600 2597 +3 1733 32 343 +3 635 1362 1363 +3 1897 1896 1893 +3 1370 1897 643 +3 591 1370 643 +3 591 1368 1370 +3 1367 1368 618 +3 1059 1367 618 +3 594 1789 1790 +3 1372 779 622 +3 1372 594 779 +3 287 1918 2255 +3 1367 655 1365 +3 1878 1373 1894 +3 1367 642 1368 +3 1385 2286 2287 +3 620 1894 1880 +3 1894 1879 1880 +3 629 656 657 +3 1368 642 1370 +3 434 1381 1384 +3 91 1595 970 +3 1371 618 1368 +3 1373 635 1363 +3 1891 753 872 +3 1642 1645 1672 +3 197 2586 196 +3 123 258 1374 +3 257 1726 1724 +3 2086 469 1735 +3 469 2086 2079 +3 1473 350 1472 +3 1884 1890 1895 +3 1408 1407 1402 +3 2104 353 1859 +3 1417 1418 1121 +3 900 136 124 +3 829 828 2776 +3 303 149 304 +3 24 991 2021 +3 186 1846 1849 +3 2285 2286 1385 +3 1412 435 2568 +3 380 381 43 +3 1028 2465 1092 +3 1593 1592 124 +3 2402 1397 2474 +3 1387 2777 1404 +3 2777 1387 2470 +3 1782 2778 1784 +3 2723 1384 1382 +3 1886 2218 1888 +3 911 419 2403 +3 1415 2288 1381 +3 9 1390 2473 +3 1390 1389 2473 +3 378 73 234 +3 1391 1390 435 +3 1394 1412 2568 +3 2644 1645 860 +3 1611 1392 1612 +3 2354 2353 268 +3 1386 2777 2470 +3 2287 1380 1396 +3 144 425 2727 +3 350 1123 349 +3 1150 358 1151 +3 234 381 380 +3 185 436 1391 +3 346 73 373 +3 744 130 743 +3 130 1851 743 +3 1400 432 1383 +3 432 1400 1401 +3 2023 991 140 +3 2021 991 2023 +3 1847 2395 436 +3 572 576 1699 +3 1612 1392 2779 +3 1413 1417 1121 +3 1380 2397 1398 +3 433 1402 1403 +3 2219 2153 1002 +3 1407 432 1402 +3 1407 1406 432 +3 2660 431 2661 +3 2657 2656 1409 +3 361 362 1851 +3 2473 2475 9 +3 2473 1387 2475 +3 1846 1848 1375 +3 829 2540 1411 +3 1847 186 2393 +3 454 1400 1397 +3 1849 1845 1377 +3 1845 1849 1846 +3 1410 2656 2657 +3 1848 437 1375 +3 1376 437 1848 +3 436 2728 1376 +3 461 1408 1402 +3 1378 1399 1843 +3 1836 1838 1248 +3 1838 1836 1837 +3 1233 1844 1843 +3 438 1437 430 +3 1402 432 1401 +3 2476 1915 1914 +3 1779 624 617 +3 2096 2095 141 +3 2359 283 2358 +3 106 1904 1905 +3 1395 1674 1673 +3 593 1889 882 +3 1673 1674 1122 +3 1393 1612 2779 +3 1384 2288 2287 +3 2565 2568 1390 +3 1881 1882 1883 +3 705 2248 2242 +3 2248 705 2275 +3 1676 2714 1675 +3 1383 1612 1393 +3 2780 1383 1393 +3 1887 1886 640 +3 2218 1886 1887 +3 2659 461 453 +3 65 348 194 +3 348 65 1465 +3 129 72 2479 +3 1414 429 185 +3 435 1413 1414 +3 2596 43 382 +3 262 263 1478 +3 263 264 1478 +3 1476 2259 2262 +3 2394 2393 1381 +3 1413 435 1412 +3 1423 484 1427 +3 185 1391 1414 +3 1121 429 1414 +3 2538 1416 2539 +3 2163 997 2160 +3 2595 2099 355 +3 2596 2595 355 +3 2444 2443 428 +3 1945 1572 1573 +3 428 1450 1446 +3 1426 486 1424 +3 2 486 487 +3 1421 484 1423 +3 485 1421 1423 +3 2540 829 2776 +3 2584 1419 2583 +3 408 484 1422 +3 408 504 484 +3 1422 827 408 +3 408 827 826 +3 409 827 1422 +3 484 1421 1422 +3 1423 1424 485 +3 1424 1425 485 +3 439 1431 1124 +3 479 386 480 +3 917 1653 1658 +3 385 1423 1427 +3 1448 2537 2538 +3 187 1448 2538 +3 486 1425 1424 +3 479 480 1870 +3 1424 385 1426 +3 1430 1431 1432 +3 1121 2444 1447 +3 1427 504 478 +3 504 1427 484 +3 504 386 478 +3 1423 385 1424 +3 476 1443 475 +3 1934 1420 1935 +3 1427 478 1428 +3 1430 1425 486 +3 385 1429 1426 +3 385 1428 1429 +3 2437 2438 771 +3 1432 384 1430 +3 1431 2 1124 +3 544 78 2677 +3 545 78 544 +3 1874 1346 762 +3 1432 1431 439 +3 1870 480 2435 +3 1434 384 1432 +3 1433 1434 1432 +3 1428 1438 477 +3 1428 478 1438 +3 1433 439 440 +3 514 1757 1745 +3 1303 2227 2229 +3 2227 583 2229 +3 1447 1446 1435 +3 1121 1447 429 +3 1446 1447 428 +3 2709 817 2751 +3 930 2689 2691 +3 1428 477 1429 +3 1438 1439 477 +3 1445 352 1444 +3 476 1445 1444 +3 612 2528 1160 +3 1159 2528 612 +3 821 820 2195 +3 1442 1443 476 +3 933 1952 2204 +3 2214 1421 485 +3 1537 2197 785 +3 1441 425 426 +3 427 425 1441 +3 1442 426 1443 +3 59 2497 1973 +3 2497 243 1973 +3 1441 1440 145 +3 1431 486 2 +3 252 1860 59 +3 410 828 829 +3 352 1429 477 +3 1444 352 477 +3 476 1444 1440 +3 2096 2105 2097 +3 470 825 807 +3 470 408 825 +3 470 503 408 +3 1265 2329 2322 +3 2708 1034 2763 +3 2104 475 2103 +3 1445 475 2104 +3 1637 880 755 +3 2633 298 2637 +3 486 1431 1430 +3 2444 2583 2443 +3 2443 2583 1419 +3 827 146 826 +3 409 828 827 +3 828 146 827 +3 1684 168 1685 +3 2353 1153 96 +3 1153 2353 269 +3 1285 1461 51 +3 2739 2224 2294 +3 1452 159 1453 +3 65 194 1657 +3 2323 1359 2325 +3 367 2322 2323 +3 1282 1460 1459 +3 1298 159 1451 +3 1451 367 1298 +3 1870 2435 388 +3 2350 1006 2348 +3 18 1866 1455 +3 2344 158 2343 +3 1454 1455 1457 +3 1454 157 1455 +3 2666 524 254 +3 2693 1769 55 +3 921 33 172 +3 33 1465 172 +3 2324 2325 369 +3 1458 1459 1460 +3 1458 159 1459 +3 1688 1686 152 +3 1285 1460 1461 +3 1460 169 1461 +3 2673 2672 525 +3 2260 1477 143 +3 2260 2259 1477 +3 1542 1520 505 +3 1477 1476 111 +3 217 2048 2056 +3 2669 2668 531 +3 1453 1456 1464 +3 169 1462 1461 +3 1462 169 1463 +3 1684 1463 169 +3 1463 1684 1685 +3 1456 1457 1464 +3 2670 531 29 +3 531 532 29 +3 2670 2669 531 +3 529 2667 2668 +3 2667 254 2668 +3 1469 1468 331 +3 1827 1231 1828 +3 1013 53 1246 +3 1469 333 1470 +3 140 1469 1470 +3 2263 2266 2262 +3 2266 1476 2262 +3 137 899 900 +3 1847 1846 186 +3 1474 1471 74 +3 231 148 843 +3 1471 1474 2024 +3 1474 138 2024 +3 2099 2093 354 +3 2265 2271 422 +3 2101 112 359 +3 762 879 878 +3 2252 2253 856 +3 2252 871 2253 +3 2279 2280 2781 +3 2630 856 1096 +3 1489 2782 552 +3 460 554 1481 +3 552 1481 1483 +3 1334 1487 176 +3 2601 2782 2602 +3 1416 2656 1410 +3 2539 1416 1410 +3 549 1486 522 +3 1485 1486 549 +3 1485 176 1486 +3 1484 1488 552 +3 1485 1488 1484 +3 2646 460 2602 +3 2646 2603 460 +3 1698 1977 572 +3 572 1977 1978 +3 2650 413 2651 +3 2648 776 2647 +3 550 1490 1488 +3 2389 2388 838 +3 1758 494 1759 +3 1486 1487 522 +3 176 1487 1486 +3 523 2664 2666 +3 2664 524 2666 +3 529 523 2667 +3 721 556 740 +3 1490 1489 1488 +3 446 555 1330 +3 1192 2684 1191 +3 2210 414 1529 +3 797 2202 798 +3 390 797 798 +3 480 386 2520 +3 386 502 2520 +3 1537 482 2197 +3 403 1132 2199 +3 403 1131 1132 +3 141 2095 2094 +3 778 1792 2597 +3 1421 2214 1420 +3 1530 1535 415 +3 783 1496 1498 +3 2651 1411 188 +3 1521 1518 54 +3 1518 1517 54 +3 1522 1517 1518 +3 1512 1517 1522 +3 2190 2189 1497 +3 2467 1019 1020 +3 2282 1603 714 +3 1504 783 1498 +3 576 1621 1620 +3 1503 1500 416 +3 300 149 301 +3 2634 2637 2638 +3 2640 298 2632 +3 1149 1108 285 +3 2621 1108 1149 +3 1508 971 1509 +3 1506 1508 1509 +3 428 2443 1450 +3 296 295 292 +3 782 1501 1507 +3 415 1527 1526 +3 2530 2529 1544 +3 2529 2530 1543 +3 780 1512 1545 +3 695 1014 1913 +3 971 972 1510 +3 2027 2026 292 +3 2032 2025 318 +3 2025 2032 292 +3 1384 2286 1382 +3 2286 2285 1382 +3 1695 212 86 +3 1522 1524 1545 +3 2614 1916 2613 +3 1538 782 1511 +3 1563 1565 1547 +3 1519 1520 506 +3 1528 1533 781 +3 571 1084 1697 +3 1523 1524 1540 +3 1524 1523 1525 +3 1598 2281 1599 +3 2281 714 1599 +3 1522 1513 1524 +3 668 1610 669 +3 506 1513 1519 +3 1910 11 290 +3 290 11 279 +3 1519 1518 1521 +3 1519 1513 1518 +3 1521 54 1510 +3 1515 1510 54 +3 789 414 788 +3 416 1520 972 +3 505 1529 414 +3 1533 1534 781 +3 1905 1906 11 +3 128 129 131 +3 1520 1519 972 +3 1042 871 2252 +3 1510 972 1521 +3 834 833 2533 +3 1541 1540 506 +3 1513 1522 1518 +3 505 414 507 +3 1543 1541 1539 +3 1541 1543 1540 +3 1567 2555 15 +3 1532 2783 1536 +3 491 1532 777 +3 1914 1916 692 +3 318 2031 107 +3 1528 415 1533 +3 1555 1556 509 +3 1545 1512 1522 +3 1147 22 77 +3 2532 2529 1539 +3 2532 1544 2529 +3 416 1529 1520 +3 1534 1497 781 +3 2213 786 2193 +3 505 1520 1529 +3 1525 780 1545 +3 2554 15 2555 +3 2239 2319 2320 +3 231 545 77 +3 1108 952 2149 +3 1530 1526 1531 +3 2412 2522 834 +3 492 2559 1554 +3 2559 492 1740 +3 487 1426 1429 +3 476 1440 1442 +3 785 2191 1534 +3 787 2211 2210 +3 784 785 1534 +3 497 2546 2547 +3 2558 497 2547 +3 482 2198 2197 +3 1873 148 425 +3 1 842 1537 +3 1537 842 482 +3 781 1497 1538 +3 499 1567 1568 +3 1526 1527 2531 +3 2531 2530 1544 +3 1546 1544 2532 +3 1526 1544 1531 +3 1531 1550 777 +3 1545 1524 1525 +3 2548 2558 2547 +3 1550 2551 777 +3 778 779 1792 +3 1530 415 1526 +3 1541 1542 500 +3 1542 1541 506 +3 1520 1542 506 +3 834 2533 1062 +3 2531 1544 1526 +3 971 1508 1570 +3 278 11 1906 +3 1543 1539 2529 +3 1546 1531 1544 +3 2443 1420 1450 +3 965 208 964 +3 2549 1551 2550 +3 500 1567 1566 +3 45 965 200 +3 509 498 508 +3 942 1217 1216 +3 1551 508 2550 +3 1762 498 1761 +3 2276 2274 682 +3 2245 2240 2241 +3 1751 2696 1772 +3 565 1751 1772 +3 2556 2546 497 +3 1559 1558 929 +3 2685 274 63 +3 1556 498 509 +3 215 1963 914 +3 2759 2296 1680 +3 2603 776 2605 +3 1744 237 519 +3 237 520 519 +3 2132 1033 2128 +3 235 548 536 +3 1215 940 1213 +3 867 2121 2120 +3 968 961 2062 +3 961 2063 2062 +3 961 967 2063 +3 1788 1711 180 +3 2245 2241 2242 +3 1038 2134 1039 +3 2126 2122 2129 +3 839 1868 1867 +3 2312 2308 607 +3 2297 2067 50 +3 2297 153 2067 +3 180 940 1788 +3 571 1916 1915 +3 1596 705 3 +3 440 2283 1433 +3 2615 2618 573 +3 1681 2690 55 +3 1108 2621 1107 +3 510 1556 1555 +3 1561 2715 2714 +3 1280 1282 1298 +3 1680 1559 565 +3 1761 498 2226 +3 1753 1559 929 +3 536 538 209 +3 1539 1541 1565 +3 500 1542 1568 +3 1566 1565 500 +3 1547 1565 1566 +3 777 1530 1531 +3 500 1568 1567 +3 1530 777 1532 +3 597 779 778 +3 1530 1532 1535 +3 1532 1536 1535 +3 1564 1547 1569 +3 1566 1569 1547 +3 1566 15 1569 +3 1503 1570 1502 +3 1570 1499 1502 +3 2355 2356 2357 +3 1119 630 2113 +3 1946 1574 931 +3 1574 1947 931 +3 1948 1947 1574 +3 917 1656 1654 +3 1809 452 1009 +3 2784 1273 2258 +3 931 1944 1943 +3 1574 1575 26 +3 860 1642 1643 +3 2542 1571 2544 +3 2588 30 1655 +3 1799 1796 1797 +3 1800 27 1801 +3 1100 1925 1926 +3 1931 1922 1105 +3 2504 41 1802 +3 1575 1574 1573 +3 100 2495 2494 +3 2223 1268 1267 +3 1773 1255 2223 +3 1260 1267 1268 +3 1587 1142 1141 +3 2156 2186 2185 +3 57 2442 202 +3 957 1581 1582 +3 957 1582 1142 +3 2054 963 959 +3 308 150 304 +3 949 465 1585 +3 229 949 1585 +3 1580 957 1577 +3 957 1578 1577 +3 2186 994 2154 +3 1139 1583 1581 +3 1582 1581 1583 +3 1585 1292 229 +3 464 1292 1585 +3 1291 1292 464 +3 1002 2220 2219 +3 1593 124 136 +3 1976 874 1975 +3 496 2555 499 +3 1590 1592 1591 +3 1736 1060 1735 +3 2717 133 376 +3 1983 2001 1999 +3 72 1593 136 +3 72 129 128 +3 127 72 128 +3 127 1593 72 +3 126 68 127 +3 70 126 127 +3 1970 245 1971 +3 2613 1916 571 +3 2612 2613 571 +3 123 1590 1591 +3 214 547 907 +3 315 318 107 +3 138 1475 2022 +3 2480 2179 2187 +3 2242 2241 3 +3 680 1079 2418 +3 2417 681 1078 +3 668 667 1609 +3 667 668 627 +3 466 1588 2219 +3 2489 2490 2491 +3 2318 2489 2491 +3 714 1604 633 +3 712 633 1605 +3 1606 383 447 +3 1158 2488 2318 +3 953 1088 1087 +3 1088 2414 1087 +3 954 67 251 +3 713 1118 633 +3 1599 714 633 +3 1437 1606 448 +3 2524 821 2195 +3 2035 296 2033 +3 2038 2036 108 +3 2036 2038 300 +3 2035 2033 108 +3 2399 44 2398 +3 149 2038 317 +3 2785 2318 1157 +3 669 1610 631 +3 2145 2219 1588 +3 2216 2218 1887 +3 2216 685 2218 +3 432 1611 1383 +3 2611 2615 691 +3 1888 2218 685 +3 1390 1391 1389 +3 1611 432 1406 +3 1411 1410 2657 +3 1303 1302 397 +3 1626 1303 397 +3 1132 390 798 +3 702 1617 701 +3 495 929 492 +3 397 1622 1624 +3 1625 397 1624 +3 2504 61 164 +3 2579 793 2571 +3 1623 1622 1302 +3 601 605 576 +3 1620 601 576 +3 1618 1619 577 +3 578 2579 2571 +3 2572 2574 2577 +3 578 2572 2577 +3 793 579 2571 +3 1623 391 605 +3 605 601 1623 +3 391 1623 602 +3 606 2303 2304 +3 602 1623 1302 +3 397 1625 1626 +3 1625 1627 1626 +3 2509 1707 1714 +3 1260 1629 1267 +3 473 119 118 +3 2066 81 155 +3 2770 1274 1269 +3 2786 1633 2733 +3 1867 489 1742 +3 1938 1937 1258 +3 1308 581 751 +3 2065 156 2066 +3 156 51 2066 +3 1462 81 2066 +3 2080 224 2077 +3 1635 1430 384 +3 1450 1634 1446 +3 2087 1284 2085 +3 1446 1635 384 +3 1357 1636 755 +3 2380 2377 750 +3 2380 748 2377 +3 1637 882 1638 +3 1637 755 1636 +3 2376 2372 399 +3 880 875 755 +3 2372 2376 2381 +3 1640 1641 1639 +3 1785 1783 854 +3 1639 852 1024 +3 2630 1096 858 +3 1017 852 1016 +3 1350 1344 766 +3 852 1641 1016 +3 1650 2137 2136 +3 2138 1650 2136 +3 1643 1642 1027 +3 1648 1031 1647 +3 949 229 2141 +3 45 543 965 +3 1648 1038 1022 +3 1816 1226 1817 +3 2124 1644 861 +3 863 1037 1044 +3 1644 1643 1027 +3 2253 1047 2254 +3 1047 2253 867 +3 1694 1693 151 +3 865 1648 1022 +3 2138 2136 1032 +3 1109 1110 1911 +3 1025 865 1020 +3 1033 1643 1644 +3 865 1031 1648 +3 1805 259 1725 +3 1643 1649 860 +3 1643 1033 1649 +3 2292 937 938 +3 937 936 938 +3 198 4 1652 +3 1646 1651 1647 +3 1986 114 1991 +3 512 1746 2645 +3 653 2742 599 +3 2608 683 2610 +3 1858 89 331 +3 384 1434 2707 +3 2588 1655 8 +3 197 196 198 +3 2298 197 198 +3 117 116 120 +3 247 932 84 +3 247 1944 932 +3 1967 1966 250 +3 2592 192 2593 +3 172 1656 917 +3 918 172 917 +3 1659 1657 1655 +3 31 2003 2002 +3 31 2004 2003 +3 1590 1671 2018 +3 1571 2543 2544 +3 1656 1659 1654 +3 1835 1245 1841 +3 1245 1827 1841 +3 1985 1991 926 +3 670 623 1661 +3 670 658 623 +3 670 1661 1660 +3 666 670 1660 +3 596 1056 1057 +3 1661 623 698 +3 1821 2787 1819 +3 1850 2396 2391 +3 1830 1829 2772 +3 1666 1495 1493 +3 1495 1193 1493 +3 517 1664 1666 +3 1744 1743 514 +3 929 1754 1753 +3 1669 1297 372 +3 2734 1667 1261 +3 1632 225 1631 +3 1669 1668 1262 +3 1047 867 2119 +3 1083 2788 1082 +3 1671 335 336 +3 1671 1374 335 +3 123 1374 1671 +3 123 1671 1590 +3 1280 367 2324 +3 1412 1673 1122 +3 1673 1412 1394 +3 1558 1675 1562 +3 1975 884 756 +3 874 884 1975 +3 1394 2568 2565 +3 943 806 1168 +3 1788 941 1711 +3 2227 2233 1304 +3 2233 2227 2228 +3 1652 199 2408 +3 1762 1760 494 +3 1559 1676 1675 +3 376 375 2717 +3 2681 241 2680 +3 1683 169 1460 +3 1282 1683 1460 +3 817 2090 2751 +3 2442 6 202 +3 2676 2677 78 +3 2426 2425 2424 +3 2423 2426 2424 +3 824 2620 2520 +3 1199 1196 1197 +3 2672 524 525 +3 2296 1560 1677 +3 1680 2296 1677 +3 2224 1560 2294 +3 2296 2295 1560 +3 2238 2384 2251 +3 153 2065 2067 +3 2065 155 2067 +3 168 82 221 +3 168 1683 82 +3 812 813 240 +3 169 1683 1684 +3 81 1462 1463 +3 1704 986 985 +3 1693 1691 151 +3 1685 168 1686 +3 1691 63 151 +3 168 1684 1683 +3 81 167 166 +3 269 97 270 +3 16 266 1687 +3 2401 1015 2043 +3 2400 2399 2401 +3 1689 260 1688 +3 260 1689 1690 +3 1691 1690 261 +3 1691 23 1690 +3 63 1691 261 +3 23 260 1690 +3 2043 6 2401 +3 2400 2401 6 +3 263 1693 1695 +3 1693 263 23 +3 263 1695 86 +3 2590 2589 8 +3 1694 211 212 +3 1693 1694 1695 +3 1730 1731 337 +3 1686 1696 1685 +3 1696 1686 1688 +3 1688 167 1696 +3 1084 689 1697 +3 2619 1613 1614 +3 1613 1615 575 +3 569 1138 1208 +3 569 2424 1138 +3 983 2004 2010 +3 1978 1615 690 +3 1978 1977 1615 +3 1615 1616 690 +3 1554 2548 496 +3 2132 1650 1033 +3 2006 1992 2005 +3 811 240 835 +3 1701 1702 36 +3 2736 1702 1701 +3 322 1312 325 +3 1312 322 1706 +3 2189 2519 1496 +3 783 2189 1496 +3 2509 2510 2518 +3 2510 2509 342 +3 322 1710 1709 +3 1715 323 337 +3 92 908 909 +3 257 338 1726 +3 1715 321 1716 +3 35 1710 1711 +3 1702 1704 36 +3 36 1704 985 +3 37 341 212 +3 322 325 1710 +3 1705 321 1707 +3 1113 334 329 +3 2518 2510 2514 +3 1029 2464 866 +3 210 1312 1313 +3 337 1717 1714 +3 342 1717 1718 +3 2689 2693 2691 +3 2693 2689 1752 +3 1058 1372 622 +3 1371 683 1789 +3 1859 2 487 +3 1857 332 1858 +3 352 1859 487 +3 35 1711 941 +3 1713 325 1311 +3 1060 223 1735 +3 1711 1710 325 +3 1712 1711 325 +3 1713 1712 325 +3 907 213 909 +3 2105 141 2595 +3 1714 1715 337 +3 323 1715 1716 +3 98 323 1716 +3 324 323 98 +3 1726 334 76 +3 1706 322 2515 +3 2514 87 2516 +3 1722 340 2789 +3 454 1397 1378 +3 1723 256 64 +3 257 1721 1720 +3 339 1720 1721 +3 1721 64 1722 +3 1722 339 1721 +3 2385 2384 2249 +3 324 98 348 +3 257 1724 1723 +3 338 1725 1726 +3 1725 1727 1726 +3 344 327 343 +3 1730 326 1729 +3 328 1128 1466 +3 1728 328 1466 +3 1128 88 1466 +3 1467 1466 88 +3 1725 259 1727 +3 2790 327 178 +3 2790 1127 327 +3 1988 1998 1997 +3 1998 1987 1997 +3 1986 1991 1985 +3 259 1731 1730 +3 32 1734 324 +3 1734 323 324 +3 1734 32 1733 +3 326 1734 1733 +3 1589 469 2079 +3 1060 1061 223 +3 466 1103 1589 +3 39 101 102 +3 1102 289 1060 +3 4 922 1738 +3 1737 1060 1736 +3 1588 466 1589 +3 4 1738 199 +3 126 69 122 +3 920 1739 919 +3 119 69 126 +3 1749 564 563 +3 510 1741 1557 +3 1562 510 1557 +3 1741 510 1555 +3 1748 1749 563 +3 2606 2730 2650 +3 239 2711 1117 +3 489 514 1742 +3 1306 583 2227 +3 1332 562 520 +3 1745 1744 514 +3 1744 1745 237 +3 160 1862 18 +3 1746 518 1747 +3 1682 2690 1681 +3 523 236 519 +3 1758 511 494 +3 1193 1495 2681 +3 564 1749 1750 +3 1759 1760 1770 +3 1772 2695 2694 +3 564 2697 2698 +3 603 391 602 +3 495 493 1203 +3 929 495 1754 +3 2601 2602 460 +3 1748 1755 1749 +3 1481 2601 460 +3 1494 1193 2683 +3 516 1771 1747 +3 379 380 358 +3 1196 2680 241 +3 1746 1747 1771 +3 1758 1759 512 +3 1761 2226 2225 +3 498 1762 491 +3 1556 2226 498 +3 494 491 1762 +3 514 489 1763 +3 1763 1764 511 +3 1763 489 1764 +3 2290 2470 2471 +3 2469 2289 1386 +3 2681 1495 241 +3 310 2326 2327 +3 2224 1681 2225 +3 2471 1387 2472 +3 1765 1766 1750 +3 1749 1765 1750 +3 1770 1746 512 +3 1759 1770 512 +3 55 1769 1760 +3 519 236 515 +3 518 1769 1768 +3 2695 2696 930 +3 1760 1769 1770 +3 518 1770 1769 +3 310 369 2326 +3 2221 2222 1255 +3 1255 1775 2221 +3 1257 1252 2757 +3 369 2325 2326 +3 2374 1173 754 +3 2556 1552 2546 +3 1776 598 624 +3 598 625 624 +3 624 1778 1777 +3 634 1778 595 +3 1363 634 595 +3 1362 634 1363 +3 599 1780 1779 +3 1112 1795 647 +3 699 2616 2575 +3 643 750 2609 +3 690 1616 2611 +3 969 1595 1781 +3 1781 1595 539 +3 102 2297 50 +3 215 914 1016 +3 1787 961 968 +3 1042 1043 1041 +3 2284 2285 1385 +3 468 2144 2152 +3 1215 941 1788 +3 2247 2766 2246 +3 1484 552 1483 +3 1070 1794 678 +3 41 7 1796 +3 93 570 569 +3 625 598 688 +3 2600 625 688 +3 625 2600 2598 +3 655 1364 1365 +3 594 1792 779 +3 1923 1920 1104 +3 1798 79 1575 +3 1947 932 1944 +3 79 56 39 +3 1798 56 79 +3 1802 1800 1803 +3 1802 61 2504 +3 1717 1805 1718 +3 1797 1798 27 +3 1798 1575 27 +3 289 1102 1925 +3 1798 1797 56 +3 1803 61 1802 +3 41 1799 1800 +3 1799 27 1800 +3 1799 1797 27 +3 1392 2566 2779 +3 2567 2566 1392 +3 1731 1717 337 +3 1717 1731 1805 +3 1856 1857 48 +3 1571 1943 1944 +3 41 1800 1802 +3 99 2506 2505 +3 7 2506 99 +3 2495 99 2505 +3 1803 1804 42 +3 77 200 1015 +3 937 2292 2291 +3 1809 1009 1224 +3 528 1855 1856 +3 1810 1811 1227 +3 452 1813 1011 +3 1815 1226 1816 +3 1815 1814 1226 +3 1214 417 974 +3 2791 1225 2445 +3 1225 1814 2445 +3 2791 2445 1808 +3 1230 1824 1243 +3 1815 1816 1811 +3 1814 1225 730 +3 1226 1814 730 +3 730 1817 1226 +3 1230 2787 1821 +3 77 545 200 +3 2102 2109 359 +3 2109 2101 359 +3 1237 1236 1820 +3 1243 1824 53 +3 1230 1822 1823 +3 1822 1230 1821 +3 1824 1230 1823 +3 330 331 1468 +3 1126 1127 1128 +3 327 1127 1126 +3 1236 1831 1244 +3 1831 2772 1244 +3 1826 1823 1822 +3 1825 1826 1822 +3 1821 1662 1822 +3 1236 1244 1825 +3 1833 1247 1832 +3 760 1877 886 +3 1827 1828 1841 +3 24 2021 2020 +3 1234 1831 450 +3 1234 1830 1831 +3 430 1437 448 +3 1249 1837 1836 +3 1833 1832 1836 +3 1249 1836 1832 +3 1835 1247 1834 +3 346 136 899 +3 1837 1233 1838 +3 1840 1375 437 +3 1840 1834 1248 +3 1840 1248 1839 +3 1839 1375 1840 +3 1247 1835 1841 +3 1841 1828 1247 +3 1843 1844 1378 +3 1233 1842 1838 +3 2394 2395 1847 +3 315 1148 318 +3 1471 2023 140 +3 1377 1842 1843 +3 1842 1233 1843 +3 1847 2393 2394 +3 1843 1399 1850 +3 1377 1843 1850 +3 1847 1376 1848 +3 1846 1847 1848 +3 436 1376 1847 +3 1846 1375 1845 +3 44 2400 1903 +3 2392 186 2391 +3 1849 1377 1850 +3 1851 362 743 +3 130 1852 1851 +3 1852 361 1851 +3 131 361 1852 +3 195 2011 2017 +3 1671 336 2018 +3 951 2621 1149 +3 2586 2585 1854 +3 1853 191 34 +3 1995 195 2016 +3 2008 1992 2007 +3 211 1694 901 +3 532 2673 526 +3 848 220 847 +3 1855 2718 332 +3 330 939 1857 +3 332 1857 1856 +3 1858 330 1857 +3 331 330 1858 +3 332 89 1858 +3 1863 1865 18 +3 100 2494 2493 +3 525 2678 2673 +3 995 2166 2165 +3 161 70 162 +3 119 70 161 +3 117 69 119 +3 119 126 70 +3 131 1852 1864 +3 2773 1852 130 +3 18 1862 1863 +3 1399 2396 1850 +3 174 524 2664 +3 524 174 560 +3 157 18 1455 +3 131 129 361 +3 1464 1457 366 +3 1742 839 1867 +3 841 488 842 +3 238 1871 839 +3 1869 839 1871 +3 1868 1869 388 +3 1870 1872 427 +3 1870 1869 1872 +3 85 1953 2204 +3 85 1955 1953 +3 490 841 842 +3 488 482 842 +3 2593 2591 2592 +3 1872 1873 427 +3 840 148 1873 +3 1124 184 439 +3 874 885 884 +3 884 885 762 +3 760 886 1354 +3 1163 759 1876 +3 1876 759 1875 +3 1234 1232 1830 +3 1464 2663 1453 +3 1897 641 1896 +3 1901 641 1897 +3 1373 1363 636 +3 2379 754 584 +3 2296 2759 2295 +3 640 621 1882 +3 621 640 1886 +3 749 1893 1896 +3 662 657 658 +3 2219 468 2153 +3 640 882 1889 +3 1889 1887 640 +3 468 2152 2153 +3 2221 1297 1669 +3 755 875 876 +3 875 2748 873 +3 876 875 873 +3 925 1986 1985 +3 1014 2522 2521 +3 1884 1885 1890 +3 1885 753 1890 +3 805 806 404 +3 1173 1172 687 +3 1891 1890 753 +3 1987 114 1986 +3 1673 2567 1395 +3 1881 1902 1880 +3 1895 1896 1898 +3 1898 1896 641 +3 1369 1901 1370 +3 1385 1379 2792 +3 1901 1897 1370 +3 588 656 1059 +3 1899 1902 1883 +3 1900 1901 620 +3 1900 620 1880 +3 1881 1880 637 +3 110 44 1903 +3 1900 641 1901 +3 1881 1883 1902 +3 1904 12 1905 +3 1905 12 1906 +3 1935 2443 1419 +3 1908 1907 106 +3 1503 972 971 +3 1912 1911 693 +3 1912 1913 1911 +3 2614 692 1916 +3 2455 2234 2236 +3 2479 136 2478 +3 1914 1915 1916 +3 2521 2522 1109 +3 1050 2463 1115 +3 1912 1914 1913 +3 1914 695 1913 +3 1157 2318 2491 +3 626 669 631 +3 692 695 1914 +3 443 2283 440 +3 1923 1921 1920 +3 1107 1917 1108 +3 1104 1920 1107 +3 1102 1101 1926 +3 289 1924 1104 +3 2159 994 2155 +3 1001 2161 1000 +3 1100 1932 1924 +3 2181 2150 2180 +3 1098 287 1922 +3 1921 1922 287 +3 2107 356 355 +3 356 2596 355 +3 1101 347 1927 +3 1098 1922 1099 +3 1930 1933 1928 +3 1933 1930 1927 +3 1924 289 1925 +3 2185 2186 2622 +3 1932 1100 1930 +3 1932 1930 1931 +3 1924 1932 1923 +3 1933 1927 347 +3 41 14 7 +3 1927 1100 1926 +3 1099 1928 1929 +3 2506 14 2503 +3 1928 347 1929 +3 163 2503 2502 +3 2506 2503 163 +3 7 14 2506 +3 1931 1105 1932 +3 385 1427 1428 +3 409 1422 1934 +3 1421 1934 1422 +3 1628 1259 1936 +3 1186 1184 2308 +3 1186 1187 1184 +3 1937 1259 1258 +3 370 1629 1937 +3 1629 370 1267 +3 1629 1936 1937 +3 1936 1259 1937 +3 2502 2499 2498 +3 1267 370 1257 +3 345 62 2501 +3 1939 345 2501 +3 30 197 2298 +3 2410 30 2298 +3 2541 1571 2542 +3 61 1803 42 +3 672 2113 630 +3 1945 931 1943 +3 1945 1942 1572 +3 1945 1943 1942 +3 1572 42 1804 +3 2585 2586 17 +3 1572 1942 1941 +3 1943 1571 1942 +3 1572 1941 42 +3 1948 932 1947 +3 1950 1949 933 +3 1949 1950 1948 +3 1946 931 1945 +3 1573 1946 1945 +3 1804 1573 1572 +3 1801 1573 1804 +3 933 2205 1950 +3 2204 2205 933 +3 2593 192 984 +3 17 1853 2585 +3 1853 17 2590 +3 166 1954 1952 +3 1951 166 1952 +3 414 2210 2211 +3 1179 1178 319 +3 1178 1957 319 +3 79 1949 26 +3 1949 1948 26 +3 1950 932 1948 +3 84 932 1950 +3 1956 64 255 +3 2640 2641 298 +3 888 2641 2640 +3 1956 255 125 +3 956 84 2206 +3 1952 933 1951 +3 2192 786 2213 +3 166 80 165 +3 1478 1955 85 +3 166 167 1954 +3 1956 125 1955 +3 194 1700 1657 +3 1722 64 1956 +3 264 1722 1956 +3 86 1722 264 +3 264 1956 1955 +3 787 2209 2208 +3 790 2208 2209 +3 1960 1358 877 +3 581 1308 2745 +3 2228 580 1305 +3 1549 2553 2554 +3 1960 883 1358 +3 2556 2560 1962 +3 878 398 1961 +3 883 1960 398 +3 1960 1961 398 +3 2255 2564 287 +3 215 1965 1963 +3 1964 1965 2743 +3 1738 1739 918 +3 2407 1200 1665 +3 2407 1201 1210 +3 1200 2407 1210 +3 517 2407 1665 +3 2407 517 1201 +3 954 248 249 +3 955 898 954 +3 345 1966 1968 +3 244 345 1969 +3 62 345 244 +3 345 1968 1969 +3 1969 1968 40 +3 1969 1971 244 +3 1595 91 540 +3 1974 510 1562 +3 1973 1972 59 +3 244 1972 1973 +3 1972 245 59 +3 120 69 117 +3 245 1972 1971 +3 510 1974 1679 +3 2715 1561 2716 +3 2001 1985 926 +3 1346 1345 879 +3 1987 1986 925 +3 240 811 812 +3 1779 1778 624 +3 2576 2573 1614 +3 1984 2001 2002 +3 914 2406 1093 +3 1028 2460 2458 +3 193 1995 2016 +3 2016 195 2017 +3 1994 113 193 +3 34 1995 1853 +3 2012 2013 1994 +3 2013 2012 1993 +3 196 2015 198 +3 1984 925 1985 +3 2002 2001 1983 +3 1069 653 599 +3 924 1987 925 +3 1989 923 928 +3 1988 114 1998 +3 114 1987 1998 +3 2009 195 1996 +3 1652 2298 198 +3 1652 2410 2298 +3 2008 2007 2009 +3 60 982 983 +3 2010 2004 31 +3 1672 2236 1051 +3 1966 1939 1940 +3 2012 2017 2011 +3 2009 2007 195 +3 1030 2756 1029 +3 2016 1994 193 +3 1997 1990 1988 +3 1990 1997 924 +3 1997 1987 924 +3 1479 1480 677 +3 2237 1479 677 +3 924 919 1990 +3 1999 2001 926 +3 2003 1984 2002 +3 2003 977 1984 +3 2465 2459 1019 +3 2123 2122 2126 +3 1981 927 1982 +3 977 981 1984 +3 2463 868 1115 +3 1097 2254 866 +3 2464 1097 866 +3 2008 2010 31 +3 1983 2000 1992 +3 2000 2005 1992 +3 2000 927 2005 +3 1914 1912 2476 +3 2404 911 2403 +3 983 982 2004 +3 1983 2008 31 +3 31 2002 1983 +3 2008 1983 1992 +3 982 60 990 +3 2005 927 1993 +3 2014 113 2013 +3 195 2007 2011 +3 859 1097 2464 +3 2010 2008 2009 +3 927 2013 1993 +3 1027 1051 1050 +3 1027 1050 861 +3 1642 1051 1027 +3 1577 1143 2364 +3 1033 1644 2128 +3 4 198 2015 +3 928 2015 2014 +3 2014 2015 113 +3 284 2701 2702 +3 196 113 2015 +3 923 2015 928 +3 4 2015 923 +3 2266 2270 1476 +3 422 2270 2266 +3 2267 1476 2270 +3 782 1507 1511 +3 2028 25 2027 +3 1908 2029 1907 +3 2029 110 1907 +3 2030 110 2029 +3 421 110 2030 +3 110 421 44 +3 111 1476 2267 +3 304 149 317 +3 2037 21 296 +3 296 292 2033 +3 2036 2037 2035 +3 2037 296 2035 +3 2036 2035 108 +3 964 90 966 +3 2053 90 964 +3 202 201 2039 +3 58 205 211 +3 205 58 2039 +3 21 1477 295 +3 1477 111 295 +3 149 300 2038 +3 2050 207 2046 +3 207 2050 2054 +3 2051 2047 910 +3 200 2042 1015 +3 201 2042 2041 +3 2043 2042 201 +3 1015 2042 2043 +3 2399 2398 1147 +3 2043 201 202 +3 6 2043 202 +3 23 1691 1693 +3 1398 1397 2402 +3 1397 1398 1378 +3 2048 2047 207 +3 211 2049 37 +3 542 208 541 +3 2049 206 37 +3 217 913 2048 +3 2046 2047 2051 +3 205 2045 2049 +3 2044 2045 205 +3 2045 2046 206 +3 200 965 966 +3 153 154 2065 +3 201 2040 2039 +3 2053 2050 90 +3 207 2054 2055 +3 2055 2048 207 +3 2762 2057 958 +3 2753 2058 960 +3 2040 205 2039 +3 2060 91 970 +3 2062 218 968 +3 958 91 2060 +3 10 57 203 +3 2060 970 218 +3 969 970 1595 +3 218 2059 2060 +3 2762 2060 2059 +3 2630 2252 856 +3 2053 2064 2050 +3 2054 2064 963 +3 2050 2064 2054 +3 2067 155 50 +3 1276 228 1275 +3 1277 2072 1293 +3 2071 226 2072 +3 1276 2071 2072 +3 2076 2075 1279 +3 2087 2088 221 +3 2073 1278 2069 +3 2071 2076 226 +3 1278 2075 2076 +3 2074 2075 1278 +3 1277 1276 2072 +3 228 1276 1277 +3 2793 1281 2073 +3 229 1292 282 +3 1278 2076 2071 +3 2087 2081 1284 +3 2081 2087 1286 +3 83 50 165 +3 224 2080 2081 +3 223 1061 2084 +3 1283 2082 2080 +3 2082 2081 2080 +3 1283 223 2082 +3 1283 1735 223 +3 2068 222 2079 +3 222 1589 2079 +3 1061 286 2084 +3 2080 2078 1283 +3 294 2083 2084 +3 294 2085 2083 +3 2089 1687 168 +3 221 1286 2087 +3 81 166 165 +3 2088 1687 2089 +3 1686 168 1687 +3 168 221 2089 +3 819 2626 817 +3 392 819 817 +3 481 836 824 +3 1443 2111 475 +3 2111 2110 475 +3 2106 2102 359 +3 778 2597 2600 +3 2454 2476 1912 +3 2454 694 2476 +3 299 356 887 +3 1859 2095 351 +3 1859 353 2095 +3 349 2097 2098 +3 351 2095 2096 +3 1484 1483 176 +3 2096 2097 349 +3 2472 1388 2471 +3 2277 682 2272 +3 354 2092 2101 +3 1475 1474 139 +3 354 2101 2100 +3 889 142 360 +3 2110 2093 2103 +3 2112 152 1687 +3 2105 2096 141 +3 382 43 381 +3 2632 895 2640 +3 406 614 946 +3 2106 360 2102 +3 360 142 2102 +3 112 792 359 +3 239 816 2711 +3 2106 2261 143 +3 617 599 1779 +3 298 2633 2632 +3 1504 1505 783 +3 2103 475 2110 +3 1119 2113 2114 +3 2113 672 2114 +3 650 1119 2114 +3 2116 2115 675 +3 682 2274 2273 +3 2115 2114 673 +3 2241 2243 3 +3 1146 2243 2241 +3 705 2242 3 +3 650 2115 2116 +3 650 2114 2115 +3 1008 707 1118 +3 974 978 2117 +3 95 2117 978 +3 179 974 975 +3 2120 2119 867 +3 1048 861 1116 +3 290 107 2031 +3 1046 861 2118 +3 284 2761 2156 +3 869 1644 2124 +3 2121 867 2760 +3 2128 1644 869 +3 863 2732 1036 +3 1097 856 2254 +3 2124 861 1046 +3 2137 2131 870 +3 2137 2132 2131 +3 2138 1649 1650 +3 2132 1034 2131 +3 1186 2300 1187 +3 1189 1188 2306 +3 1186 2299 2300 +3 1297 2221 1775 +3 1651 1649 2140 +3 1649 1651 860 +3 2141 283 950 +3 2143 949 2142 +3 2142 949 2141 +3 1866 18 1865 +3 2180 2150 2187 +3 2224 2225 501 +3 2641 889 298 +3 1396 2402 1379 +3 885 874 761 +3 2148 994 992 +3 2147 2148 992 +3 2164 998 2167 +3 957 1580 1581 +3 997 994 2159 +3 2150 993 2149 +3 2146 2152 2144 +3 702 1081 2507 +3 702 1082 1081 +3 2149 2764 285 +3 2157 2180 2188 +3 2160 997 2159 +3 2189 783 1501 +3 2362 2361 2160 +3 1099 2702 996 +3 2524 822 2623 +3 821 2524 2623 +3 2170 2169 2168 +3 2173 2175 2174 +3 2175 1101 2170 +3 2495 2505 2494 +3 2162 2174 2166 +3 2162 2173 2174 +3 2493 2494 242 +3 1296 2369 1580 +3 2367 1140 1288 +3 2494 163 242 +3 288 1106 2169 +3 2371 2382 1175 +3 288 2170 1101 +3 2170 288 2169 +3 1970 1971 1969 +3 2172 2171 2161 +3 1001 2172 2161 +3 999 2166 2174 +3 2175 999 2174 +3 2177 2178 1918 +3 834 2522 1014 +3 293 267 2356 +3 1098 2157 2176 +3 2156 2155 2186 +3 2145 468 2219 +3 2700 2701 2151 +3 1098 1099 996 +3 2157 1098 996 +3 1315 1314 267 +3 1801 1803 1800 +3 2586 1854 196 +3 2191 2190 1534 +3 96 266 268 +3 17 2586 2587 +3 1314 283 2359 +3 952 2187 2150 +3 1496 790 1498 +3 2528 1164 765 +3 2191 2192 147 +3 786 2527 2193 +3 2526 2527 786 +3 2212 2213 2193 +3 1441 426 1442 +3 1441 1442 1440 +3 2202 797 402 +3 2528 1159 1164 +3 2623 2624 821 +3 145 1870 427 +3 2196 786 2192 +3 2192 2213 147 +3 2193 2194 787 +3 2208 2193 787 +3 1160 2528 765 +3 390 1132 582 +3 2419 2421 589 +3 2524 2526 2525 +3 2524 2195 2526 +3 145 427 1441 +3 2526 786 2525 +3 2198 482 488 +3 837 481 488 +3 2200 2201 799 +3 808 799 2201 +3 2202 402 2201 +3 2199 798 2200 +3 2200 403 2199 +3 2201 2203 808 +3 798 2199 1132 +3 788 2211 2194 +3 263 86 264 +3 2204 1952 85 +3 1500 790 2209 +3 2593 984 34 +3 191 2593 34 +3 1496 2207 790 +3 116 117 19 +3 2213 2212 147 +3 147 2190 2191 +3 1792 2419 589 +3 2524 389 822 +3 2521 1911 2523 +3 2196 2192 2191 +3 788 414 2211 +3 2208 2212 2193 +3 2214 1450 1420 +3 485 1450 2214 +3 2180 2187 2215 +3 2188 2180 2215 +3 2179 2215 2187 +3 2118 2119 1046 +3 2120 1046 2119 +3 269 5 1153 +3 2357 2359 2358 +3 2359 2357 267 +3 2160 2361 2360 +3 995 2160 2360 +3 2481 1502 1498 +3 2125 1046 2120 +3 1255 2222 2223 +3 2222 1268 2223 +3 565 1559 1753 +3 1560 2224 1678 +3 2224 501 1678 +3 526 2678 528 +3 2678 1855 528 +3 1961 1960 877 +3 695 2508 833 +3 1308 1307 2745 +3 752 1307 1308 +3 1051 2234 1050 +3 2459 1028 2458 +3 2459 2465 1028 +3 2452 868 2453 +3 2235 868 2463 +3 2462 2235 2463 +3 2320 709 2244 +3 2236 1576 1052 +3 2236 1672 1576 +3 709 2317 2244 +3 2279 706 2280 +3 2242 2246 2245 +3 675 2248 2116 +3 1382 2285 2284 +3 2248 2246 2242 +3 379 358 1150 +3 710 1145 677 +3 675 2246 2248 +3 1141 1582 2631 +3 1582 1583 2631 +3 2272 1596 2277 +3 2238 1145 2250 +3 2237 1145 2238 +3 677 1145 2237 +3 1979 572 1978 +3 1980 1979 1978 +3 2615 1616 2618 +3 1697 689 1980 +3 689 1979 1980 +3 689 1084 1083 +3 493 507 816 +3 2249 2250 2239 +3 2250 1145 2239 +3 2384 2385 2251 +3 2385 1146 2251 +3 2257 1306 773 +3 2257 583 1306 +3 1271 2368 2774 +3 1579 2784 2258 +3 1497 1501 782 +3 792 2260 2261 +3 792 423 2260 +3 143 2261 2260 +3 2261 2106 359 +3 792 2261 359 +3 2388 489 2390 +3 2030 2267 421 +3 2271 2267 2270 +3 2271 421 2267 +3 1476 1477 2259 +3 421 2268 2269 +3 423 2263 2262 +3 422 2264 2265 +3 422 2271 2270 +3 2268 421 2271 +3 1472 74 1471 +3 44 421 2269 +3 2399 2400 44 +3 1015 2399 1147 +3 2402 1396 1398 +3 1396 1380 1398 +3 2475 1387 1404 +3 861 1050 1115 +3 2274 707 1008 +3 1600 707 2274 +3 2279 2781 1597 +3 2275 2116 2248 +3 2276 1600 2274 +3 1387 2471 2470 +3 1554 2558 2548 +3 506 1540 1513 +3 383 1433 2283 +3 1970 1969 40 +3 2706 1970 40 +3 2489 2487 708 +3 2388 1764 489 +3 841 1764 2388 +3 2260 423 2387 +3 617 624 2599 +3 1601 1603 2282 +3 2284 1385 2792 +3 383 443 1324 +3 383 2283 443 +3 2286 1384 2287 +3 2398 2269 1147 +3 2269 2398 44 +3 133 379 376 +3 133 378 379 +3 1807 2446 2447 +3 2448 1807 2447 +3 133 373 378 +3 565 2293 2759 +3 499 1568 507 +3 507 493 499 +3 2157 2158 2180 +3 2299 1185 2300 +3 565 1772 2293 +3 284 2156 2701 +3 524 2672 254 +3 2693 55 2690 +3 2668 2671 531 +3 441 440 184 +3 2749 853 219 +3 153 2297 103 +3 50 83 102 +3 2297 102 103 +3 2414 2415 1087 +3 1939 42 1941 +3 2586 197 2587 +3 2695 930 2692 +3 1767 2689 2688 +3 2299 2307 1209 +3 2794 2301 1185 +3 2302 1194 2306 +3 2688 2689 930 +3 1750 2688 930 +3 2490 1601 1602 +3 2307 1186 2308 +3 2311 2795 2309 +3 2309 2308 1184 +3 768 770 2440 +3 770 768 767 +3 420 610 2310 +3 2314 2313 607 +3 2312 607 2313 +3 2795 2314 607 +3 2309 2795 607 +3 709 2319 2482 +3 2483 709 2482 +3 2315 2485 2484 +3 2315 710 2485 +3 2315 2484 2483 +3 2482 2315 2483 +3 708 2490 2489 +3 710 2315 2316 +3 710 2316 1145 +3 2319 2239 1145 +3 2316 2319 1145 +3 1293 2324 369 +3 2072 226 1293 +3 226 2324 1293 +3 1280 2324 226 +3 312 313 233 +3 2325 227 2326 +3 2322 1451 2328 +3 309 310 2327 +3 1265 2322 2328 +3 312 230 313 +3 2336 2328 1452 +3 2337 1266 2338 +3 2329 2330 1359 +3 1265 2330 2329 +3 2336 2335 1265 +3 1265 2328 2336 +3 1775 2331 1297 +3 2334 2327 227 +3 2326 227 2327 +3 307 1250 2796 +3 462 2344 1866 +3 1455 2343 2342 +3 2335 2337 365 +3 2336 2337 2335 +3 1264 2340 2341 +3 159 1456 1453 +3 2343 1866 2344 +3 2336 1266 2337 +3 2337 2340 365 +3 2339 2342 2346 +3 18 157 160 +3 1454 1457 1456 +3 2347 2346 2350 +3 365 2345 1297 +3 2331 365 1297 +3 2345 365 2340 +3 2340 1264 2345 +3 1456 159 1458 +3 1454 1456 1458 +3 1459 159 1298 +3 372 2345 2349 +3 372 1297 2345 +3 368 2346 2347 +3 372 2349 1263 +3 2346 158 2350 +3 78 2679 2676 +3 1638 881 2381 +3 2354 269 2353 +3 268 2356 2355 +3 2360 2161 2171 +3 995 2360 2171 +3 2358 283 282 +3 2361 1000 2161 +3 2361 2161 2360 +3 2363 2159 2155 +3 1140 2366 1271 +3 1288 1581 2369 +3 1288 2369 2367 +3 2367 2369 1296 +3 1581 1580 2369 +3 1296 1577 2364 +3 1580 1577 1296 +3 2366 2367 1296 +3 1143 2370 2365 +3 2370 1143 2258 +3 2382 2351 1175 +3 2381 2376 1638 +3 2376 880 1638 +3 2377 399 750 +3 2379 584 1309 +3 1638 880 1637 +3 752 2375 2379 +3 2375 2373 2379 +3 752 1308 2375 +3 643 2380 750 +3 1174 1173 2374 +3 2373 2375 399 +3 751 750 2375 +3 750 399 2375 +3 751 581 1071 +3 1308 751 2375 +3 2379 1309 752 +3 1882 2383 640 +3 2378 875 880 +3 2373 754 2379 +3 881 2382 2371 +3 2382 2383 2351 +3 2382 881 2383 +3 2383 638 2351 +3 1882 638 2383 +3 1892 2378 748 +3 881 640 2383 +3 2249 2384 2250 +3 423 2262 2387 +3 2387 2259 2260 +3 2393 1415 1381 +3 2389 838 488 +3 838 837 488 +3 841 2389 488 +3 2434 2435 836 +3 480 836 2435 +3 2390 1868 838 +3 2388 2390 838 +3 1117 2710 393 +3 2710 2709 393 +3 841 2388 2389 +3 1867 1868 2390 +3 489 1867 2390 +3 388 2435 2434 +3 434 2394 1381 +3 434 2395 2394 +3 434 1391 2395 +3 186 2392 2393 +3 1391 436 2395 +3 2400 6 12 +3 1903 2400 12 +3 419 962 2403 +3 985 60 984 +3 912 2404 2403 +3 2406 914 1963 +3 2406 1963 912 +3 2405 2406 912 +3 1090 1109 2522 +3 1940 250 1966 +3 2409 2410 1652 +3 2409 30 2410 +3 2408 2409 1652 +3 247 84 249 +3 898 67 954 +3 1014 2523 1913 +3 834 1062 2412 +3 2413 1088 832 +3 1088 1111 832 +3 1087 2415 2416 +3 681 2416 2415 +3 2416 1079 1087 +3 2422 2598 589 +3 2421 2422 589 +3 617 2599 2422 +3 681 2417 2416 +3 2417 1079 2416 +3 1792 680 2419 +3 1207 568 93 +3 790 2207 2208 +3 2316 2482 2319 +3 2423 1613 575 +3 1114 904 2427 +3 943 1168 411 +3 2428 904 2429 +3 1045 2123 2125 +3 943 411 944 +3 2433 943 944 +3 513 495 1203 +3 1613 1616 1615 +3 570 1613 2423 +3 1614 1613 570 +3 1699 2425 575 +3 2429 171 2428 +3 2486 2705 1158 +3 2484 2486 1158 +3 1158 2705 2488 +3 2705 2487 2488 +3 1753 1751 565 +3 943 2433 774 +3 806 2431 404 +3 2430 2428 818 +3 2431 2430 818 +3 2430 2431 774 +3 2710 815 2709 +3 2432 1114 2427 +3 838 388 2434 +3 1868 388 838 +3 2434 837 838 +3 1299 2440 603 +3 2653 413 2652 +3 948 2653 2652 +3 2652 2655 2741 +3 603 2440 1183 +3 1023 854 2441 +3 854 1784 2441 +3 1784 854 1783 +3 2440 770 2439 +3 2554 2553 15 +3 6 2442 12 +3 12 2442 1906 +3 2445 1810 1808 +3 1942 1571 2541 +3 249 84 956 +3 2541 1941 1942 +3 2445 1814 1810 +3 1222 1806 1224 +3 2449 1223 731 +3 2591 2590 8 +3 1115 2450 1116 +3 2712 2713 1048 +3 868 2235 2453 +3 859 2464 2461 +3 2451 2756 1030 +3 1092 855 1093 +3 2459 862 1025 +3 2458 862 2459 +3 1019 2459 1025 +3 1092 2461 1028 +3 2461 1092 859 +3 2234 1051 2236 +3 2462 2234 2455 +3 2456 2235 2462 +3 866 1030 1029 +3 2234 2462 1050 +3 855 2465 2466 +3 2465 855 1092 +3 855 2466 1018 +3 2681 2682 1193 +3 1750 2696 2697 +3 2468 1861 1756 +3 1765 2468 1756 +3 1152 380 43 +3 892 299 1958 +3 357 299 892 +3 1957 1958 890 +3 1400 1383 2474 +3 2474 1383 2780 +3 1397 1400 2474 +3 1651 2644 860 +3 373 374 346 +3 374 2477 346 +3 162 128 131 +3 374 132 2477 +3 132 2478 2477 +3 2478 346 2477 +3 136 346 2478 +3 72 136 2479 +3 73 346 899 +3 267 1314 2359 +3 2497 2496 242 +3 2315 2482 2316 +3 248 251 2706 +3 832 1110 1109 +3 248 2706 40 +3 40 1967 248 +3 1607 2486 2485 +3 2486 2484 2485 +3 954 251 248 +3 2487 2489 2488 +3 2488 2489 2318 +3 2492 1603 708 +3 714 1603 1604 +3 1603 1601 2490 +3 1157 2491 3 +3 1860 100 2493 +3 342 2509 1717 +3 253 2495 100 +3 253 28 2495 +3 59 1860 2496 +3 242 2498 2497 +3 2498 243 2497 +3 242 2496 2493 +3 2496 1860 2493 +3 164 2502 2503 +3 164 2499 2502 +3 66 252 245 +3 2501 62 2500 +3 2499 243 2498 +3 164 61 2500 +3 164 2500 2499 +3 2500 62 2499 +3 252 253 100 +3 66 253 252 +3 2502 2498 242 +3 163 2502 242 +3 2501 61 42 +3 1939 2501 42 +3 1653 30 2409 +3 61 2501 2500 +3 2503 2504 164 +3 2504 2503 14 +3 14 41 2504 +3 2507 1081 703 +3 833 2507 703 +3 2519 2190 147 +3 580 1627 1134 +3 2508 695 574 +3 2510 342 1719 +3 1707 321 1714 +3 2515 2516 1706 +3 2513 2516 87 +3 2516 2513 2517 +3 1707 2509 2518 +3 338 1719 1718 +3 87 2512 2513 +3 1706 2516 2517 +3 1312 210 1311 +3 426 144 792 +3 1312 1706 2517 +3 2517 1313 1312 +3 1313 2517 341 +3 426 792 112 +3 426 112 1443 +3 2520 502 483 +3 2194 2527 2195 +3 1090 2522 2412 +3 835 240 2625 +3 2527 2194 2193 +3 2195 788 2194 +3 2196 2525 786 +3 2203 402 809 +3 1910 1905 11 +3 1525 1523 2531 +3 2531 1523 2530 +3 2530 1523 1543 +3 1523 1540 1543 +3 2531 1527 1525 +3 2533 833 703 +3 2535 1412 1122 +3 2538 2537 1416 +3 2535 1122 2536 +3 1674 2537 1122 +3 2536 1122 2537 +3 1413 2535 1417 +3 305 303 304 +3 2540 1410 1411 +3 2444 428 1447 +3 2540 2539 1410 +3 2545 248 1967 +3 2542 1941 2541 +3 2543 1571 1944 +3 248 247 249 +3 2545 247 248 +3 2543 1944 247 +3 1940 2544 250 +3 543 541 965 +3 2562 1564 1569 +3 1567 499 2555 +3 2547 2549 1549 +3 963 542 959 +3 2547 1549 2548 +3 2558 1554 2559 +3 78 545 231 +3 843 78 231 +3 2550 508 2551 +3 2554 2548 1549 +3 2554 2555 2548 +3 508 491 2551 +3 2548 2555 496 +3 2557 2556 497 +3 2557 2560 2556 +3 1920 2564 1919 +3 2552 1548 2561 +3 1552 508 1551 +3 1552 1551 2546 +3 2558 2557 497 +3 1553 1962 2560 +3 1553 1555 1962 +3 1741 1555 1553 +3 1549 2738 2563 +3 2564 1921 287 +3 2561 2562 1569 +3 1548 2562 2561 +3 9 2475 1405 +3 2475 1404 1405 +3 435 1390 2568 +3 1618 1617 2797 +3 578 2570 2572 +3 395 2579 2576 +3 2580 2576 1614 +3 2574 2572 700 +3 2575 2573 2574 +3 2572 2569 700 +3 2574 699 2575 +3 2580 1614 570 +3 395 794 793 +3 2578 2579 578 +3 2578 578 2577 +3 395 2576 2580 +3 2577 2574 2573 +3 2578 2577 2573 +3 395 793 2579 +3 1138 396 1137 +3 1180 1137 605 +3 2581 93 795 +3 836 480 2620 +3 2584 1449 1419 +3 212 1695 1694 +3 2588 2589 2587 +3 197 30 2588 +3 197 2588 2587 +3 2590 17 2589 +3 2592 2591 8 +3 1657 1700 2592 +3 1700 192 2592 +3 2590 191 1853 +3 1657 2592 8 +3 984 983 34 +3 2591 2593 191 +3 2590 2591 191 +3 1700 1701 192 +3 2099 2100 355 +3 141 2099 2595 +3 356 43 2596 +3 357 43 356 +3 597 778 626 +3 2599 2598 2422 +3 2599 625 2598 +3 2599 624 625 +3 1502 1504 1498 +3 776 2646 2647 +3 776 2603 2646 +3 552 2601 1481 +3 2782 2601 552 +3 2650 2649 413 +3 1409 461 2658 +3 460 2604 554 +3 554 2604 2729 +3 551 775 1482 +3 1806 1222 2607 +3 2607 1222 716 +3 716 1223 2607 +3 1806 1223 2449 +3 1806 2607 1223 +3 2608 678 1793 +3 678 1794 1793 +3 683 1790 1789 +3 683 1371 2610 +3 1368 591 2610 +3 2575 2616 573 +3 1176 600 1177 +3 644 2609 750 +3 505 1568 1542 +3 788 820 789 +3 1568 505 507 +3 394 794 795 +3 1980 1978 690 +3 2612 571 2617 +3 1616 2615 2611 +3 1980 690 2617 +3 571 1697 2617 +3 395 2581 795 +3 395 2580 2581 +3 1613 2619 2618 +3 2618 1616 1613 +3 1621 576 572 +3 1107 2621 1104 +3 1925 1102 1926 +3 1104 2621 951 +3 823 2624 2623 +3 2347 371 2627 +3 368 2347 2627 +3 52 2627 1252 +3 2757 1252 1251 +3 1252 371 1251 +3 371 1252 2627 +3 1042 2630 857 +3 1042 2252 2630 +3 143 2639 360 +3 2634 2636 2637 +3 887 142 2642 +3 2634 297 2636 +3 2634 21 297 +3 360 2638 889 +3 2634 2639 21 +3 2635 301 109 +3 2642 889 2641 +3 2641 888 2642 +3 1477 21 2639 +3 356 142 887 +3 2643 2642 888 +3 2645 1746 1745 +3 1757 2645 1745 +3 2645 1757 512 +3 2656 1416 431 +3 514 1743 1742 +3 520 1334 1333 +3 2658 461 2659 +3 2653 830 2654 +3 1772 2694 2293 +3 948 2741 406 +3 2650 2731 2649 +3 412 948 946 +3 2651 410 1411 +3 410 829 1411 +3 2654 2651 413 +3 2653 2654 413 +3 485 1425 1634 +3 830 410 2654 +3 188 1411 2658 +3 2658 1411 2657 +3 1406 2662 1395 +3 1674 1395 2662 +3 13 303 305 +3 1006 2350 158 +3 305 304 150 +3 532 2672 2673 +3 2675 2674 530 +3 236 2674 2675 +3 2678 182 1855 +3 525 182 2678 +3 2676 515 236 +3 2676 236 2675 +3 96 2685 271 +3 2685 96 1153 +3 2684 566 1191 +3 1192 2680 2684 +3 930 2691 2692 +3 2696 1750 930 +3 1751 2698 2697 +3 2487 2705 2486 +3 2158 2701 2700 +3 996 2701 2158 +3 2701 996 2702 +3 2702 1099 1929 +3 2699 2700 2704 +3 384 2707 1446 +3 2709 815 817 +3 816 815 2711 +3 1676 1561 2714 +3 1030 866 2712 + diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/data/elephant.off b/Surface_mesh_topology/examples/Surface_mesh_topology/data/elephant.off new file mode 100644 index 00000000000..cf7cc2b68ca --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/data/elephant.off @@ -0,0 +1,8337 @@ +OFF +2775 5558 0 + +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-005 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-005 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0504123 -0.0659143 0.287583 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0557269 -0.0839063 0.29826 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0689625 -0.0703705 0.29266 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.131504 -0.114456 0.261736 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +0.0763801 -0.13103 0.282851 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0422003 -0.0728232 0.283477 +0.048607 -0.0763619 0.292696 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0587204 -0.0731238 0.296598 +0.068389 -0.0812067 0.300077 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +3 575 1215 1225 +3 902 137 1166 +3 2122 17 2125 +3 1333 1332 328 +3 1031 1037 1032 +3 1235 1234 736 +3 986 1231 182 +3 532 534 185 +3 534 448 185 +3 1588 1570 1587 +3 674 675 639 +3 1130 1225 242 +3 279 6 280 +3 6 283 280 +3 621 954 955 +3 235 273 275 +3 2565 1747 2566 +3 2225 2224 2223 +3 11 206 278 +3 922 93 2080 +3 530 2723 2724 +3 2144 2146 2139 +3 1374 1376 766 +3 1361 1374 766 +3 1775 525 1893 +3 2626 1649 2625 +3 2338 2265 2339 +3 992 96 990 +3 103 21 104 +3 1681 1682 31 +3 1686 1682 1681 +3 2064 2065 295 +3 747 748 464 +3 597 1084 1086 +3 1003 2191 2190 +3 2184 1003 2190 +3 214 38 215 +3 2202 2205 473 +3 2725 257 2728 +3 216 554 944 +3 554 553 944 +3 1457 1456 445 +3 986 2154 96 +3 458 1022 1021 +3 961 1949 2534 +3 625 1514 1515 +3 1786 1791 518 +3 1586 2773 2006 +3 52 1485 1486 +3 2101 52 1486 +3 2368 2374 1380 +3 2054 1499 74 +3 329 326 1762 +3 933 934 176 +3 527 569 705 +3 2004 247 2003 +3 414 1966 1967 +3 853 544 184 +3 1136 354 352 +3 1896 1895 134 +3 5 978 1108 +3 1344 1342 726 +3 80 27 1599 +3 1489 1683 175 +3 1952 1953 2619 +3 21 105 104 +3 21 103 29 +3 2180 959 1164 +3 288 2180 1164 +3 294 1940 1941 +3 1263 1865 443 +3 1755 1756 337 +3 696 1187 1185 +3 1186 696 1185 +3 1489 66 1683 +3 68 907 122 +3 260 1748 341 +3 1340 1341 451 +3 806 397 478 +3 1337 750 728 +3 1516 419 1515 +3 279 11 278 +3 277 279 278 +3 226 2120 2119 +3 258 259 76 +3 686 683 719 +3 1232 950 1230 +3 1597 1598 1978 +3 91 2073 977 +3 724 734 1233 +3 724 732 734 +3 47 281 280 +3 85 1982 2246 +3 207 154 64 +3 2000 1998 1999 +3 553 853 184 +3 76 261 1618 +3 259 261 76 +3 682 706 1504 +3 660 706 682 +3 296 17 297 +3 17 2122 297 +3 554 216 916 +3 381 383 382 +3 271 269 296 +3 269 17 296 +3 1082 656 1823 +3 115 199 196 +3 1056 1049 880 +3 1520 2574 2248 +3 212 550 238 +3 1980 1598 27 +3 364 72 365 +3 674 657 673 +3 82 168 158 +3 1133 641 1171 +3 440 1406 1411 +3 804 803 398 +3 178 2662 461 +3 159 2100 157 +3 1657 1659 1658 +3 1659 1280 1658 +3 1499 141 1498 +3 2144 2137 2146 +3 358 2137 2144 +3 567 534 531 +3 64 264 274 +3 137 365 380 +3 379 137 380 +3 117 903 902 +3 377 376 136 +3 88 2566 2567 +3 83 1299 1306 +3 1819 692 1822 +3 1642 584 710 +3 645 602 1808 +3 503 500 502 +3 1855 1263 54 +3 1706 1580 517 +3 1169 1069 1068 +3 42 1825 1828 +3 21 67 106 +3 81 80 84 +3 20 105 118 +3 20 156 105 +3 67 21 256 +3 1015 258 1016 +3 259 258 65 +3 649 890 1665 +3 2021 116 2020 +3 1146 402 1147 +3 126 1615 1618 +3 164 1894 163 +3 120 164 163 +3 2774 378 377 +3 1796 1893 525 +3 510 511 413 +3 1143 754 305 +3 1257 1024 1260 +3 866 1816 1815 +3 2685 1816 866 +3 574 1222 1221 +3 1673 1038 1672 +3 158 168 51 +3 793 1560 1561 +3 750 730 465 +3 729 730 750 +3 996 998 61 +3 280 281 11 +3 919 93 918 +3 590 2300 1322 +3 1305 1478 1482 +3 68 122 118 +3 238 537 555 +3 138 365 903 +3 1536 1562 1535 +3 264 1720 268 +3 2079 2080 93 +3 6 273 283 +3 2554 63 246 +3 236 317 319 +3 40 84 80 +3 84 40 104 +3 778 1357 1356 +3 1359 778 1356 +3 170 263 265 +3 1986 170 265 +3 21 106 105 +3 944 183 1740 +3 944 945 183 +3 1894 164 165 +3 67 249 106 +3 283 235 47 +3 63 2005 246 +3 314 235 275 +3 435 436 188 +3 1746 1747 345 +3 1161 2431 2432 +3 2459 594 1102 +3 1484 1305 1482 +3 2 1136 1137 +3 1062 2510 2511 +3 1811 219 1809 +3 1736 997 1732 +3 264 268 274 +3 439 1427 1247 +3 526 2722 530 +3 2722 2721 530 +3 118 105 106 +3 164 120 121 +3 71 131 165 +3 63 247 2005 +3 1894 165 1895 +3 2054 2052 2053 +3 2285 2432 2286 +3 254 106 249 +3 254 68 106 +3 685 661 670 +3 1498 75 2135 +3 989 180 991 +3 263 24 265 +3 2021 2020 932 +3 1724 170 1487 +3 124 1016 76 +3 277 278 64 +3 431 151 430 +3 2225 2757 2189 +3 818 407 478 +3 1499 237 74 +3 1994 1576 2611 +3 2697 904 897 +3 904 899 897 +3 377 378 135 +3 132 72 364 +3 282 109 293 +3 109 282 319 +3 224 83 1306 +3 74 381 376 +3 2054 2053 141 +3 2226 2678 2224 +3 1134 1438 1437 +3 412 814 813 +3 2624 1641 709 +3 126 1618 261 +3 999 34 991 +3 899 1991 1989 +3 98 1315 275 +3 928 1767 931 +3 144 2131 2136 +3 23 234 78 +3 603 800 707 +3 337 1490 332 +3 1490 1491 332 +3 1348 1341 727 +3 1591 16 1590 +3 547 92 549 +3 2194 2226 2189 +3 2236 2582 2581 +3 378 72 135 +3 1796 1784 1893 +3 278 206 207 +3 170 82 1487 +3 265 24 266 +3 308 153 943 +3 310 308 943 +3 569 565 177 +3 267 1987 1502 +3 236 316 317 +3 1895 165 134 +3 1898 2388 1479 +3 163 159 120 +3 1464 1468 1463 +3 756 903 117 +3 138 903 756 +3 951 1231 986 +3 987 951 986 +3 2670 700 2672 +3 445 187 446 +3 1722 154 910 +3 256 21 29 +3 84 168 81 +3 1283 2386 2684 +3 2736 79 852 +3 146 363 2143 +3 1323 1324 2271 +3 68 118 106 +3 1043 1038 1673 +3 2773 1585 1705 +3 1231 1232 1230 +3 1337 729 750 +3 922 917 93 +3 825 395 824 +3 510 389 511 +3 763 1188 2128 +3 833 831 487 +3 560 1355 179 +3 560 1354 1355 +3 899 904 1991 +3 639 1133 1138 +3 674 639 1138 +3 1250 1243 1254 +3 2715 2714 1433 +3 502 499 503 +3 1690 1213 1212 +3 1342 451 1341 +3 1397 1025 443 +3 929 928 930 +3 1855 1854 1262 +3 1854 1857 1262 +3 2733 2736 241 +3 1001 987 993 +3 2662 2708 191 +3 1470 2764 1459 +3 264 1717 1720 +3 264 1718 1717 +3 346 330 1139 +3 1137 1136 353 +3 1514 557 1515 +3 2045 115 2026 +3 143 1494 1495 +3 1487 1713 1724 +3 211 974 975 +3 319 318 109 +3 319 317 318 +3 2081 2077 209 +3 1015 123 258 +3 207 59 910 +3 1770 241 848 +3 857 222 1810 +3 546 857 1810 +3 87 343 1750 +3 621 915 622 +3 393 803 806 +3 977 976 975 +3 2016 992 934 +3 992 176 934 +3 1794 2744 2745 +3 278 207 64 +3 524 1692 1691 +3 2772 1702 2771 +3 1702 2772 1586 +3 1107 1105 1106 +3 190 2593 2594 +3 802 393 586 +3 1777 1783 1793 +3 476 816 390 +3 2159 1049 1048 +3 516 515 1576 +3 321 2057 2063 +3 476 477 509 +3 1180 773 1181 +3 553 184 945 +3 1227 1228 949 +3 1892 255 101 +3 1919 600 2258 +3 124 1014 1015 +3 273 98 275 +3 225 1612 1613 +3 48 313 314 +3 539 2728 2729 +3 2728 539 538 +3 1897 1896 468 +3 1810 1809 980 +3 794 2238 2237 +3 307 39 311 +3 39 307 320 +3 1531 1533 1538 +3 1583 1702 1582 +3 410 954 621 +3 2519 2333 2332 +3 541 854 855 +3 459 439 1249 +3 529 1511 2740 +3 1259 450 1258 +3 1677 2170 2175 +3 509 389 510 +3 1704 1703 1707 +3 1703 1583 1707 +3 1644 1645 584 +3 463 562 2660 +3 175 929 930 +3 262 1756 1755 +3 1756 262 1757 +3 380 72 378 +3 365 72 380 +3 128 2247 1985 +3 2532 135 2533 +3 128 1985 1987 +3 1121 2187 288 +3 891 1663 1377 +3 135 132 2533 +3 76 1016 258 +3 117 902 901 +3 132 135 72 +3 908 139 909 +3 125 76 1618 +3 76 125 124 +3 737 736 745 +3 30 541 543 +3 30 540 541 +3 395 826 824 +3 260 1751 1749 +3 341 1746 1753 +3 173 553 554 +3 1141 331 1139 +3 1756 1490 337 +3 2668 2667 700 +3 1751 1752 259 +3 230 1380 2377 +3 281 282 12 +3 2137 2138 2146 +3 1689 1852 1850 +3 588 1697 1083 +3 1069 1169 641 +3 1149 424 1088 +3 11 279 280 +3 919 1331 213 +3 1626 715 3 +3 2374 2368 2367 +3 178 2661 2707 +3 2094 2093 2092 +3 320 318 39 +3 318 317 39 +3 754 14 755 +3 6 272 273 +3 2172 1047 1051 +3 1058 2163 2162 +3 237 1499 142 +3 1799 523 1518 +3 591 695 781 +3 696 695 2128 +3 234 23 430 +3 800 720 683 +3 236 282 47 +3 235 236 47 +3 23 1162 2312 +3 2192 2678 2227 +3 2681 2680 832 +3 236 319 282 +3 817 390 808 +3 509 510 476 +3 1661 1474 492 +3 1278 1659 1657 +3 191 2715 2716 +3 1138 1133 1171 +3 835 840 412 +3 840 1184 412 +3 1898 1897 468 +3 138 756 754 +3 22 2069 300 +3 309 755 1018 +3 1651 586 589 +3 1147 1651 589 +3 1771 2733 241 +3 2733 1771 522 +3 379 380 378 +3 1749 1751 65 +3 1729 1728 197 +3 2092 2093 970 +3 300 2069 2068 +3 903 137 902 +3 25 332 1002 +3 236 235 315 +3 1162 78 1027 +3 1163 318 320 +3 147 429 801 +3 360 359 302 +3 2285 1172 3 +3 637 669 677 +3 754 1143 14 +3 2706 2709 418 +3 1213 575 574 +3 1215 575 1213 +3 2186 2223 2192 +3 2364 718 2365 +3 535 184 544 +3 610 1197 394 +3 1401 2331 2444 +3 839 149 837 +3 956 149 839 +3 181 330 347 +3 674 1138 657 +3 340 326 329 +3 1430 1415 1635 +3 2664 1822 692 +3 173 554 924 +3 944 553 945 +3 535 544 533 +3 1740 216 944 +3 334 90 336 +3 2475 783 2480 +3 927 1767 929 +3 1267 310 943 +3 2479 952 783 +3 1144 592 1146 +3 929 175 927 +3 323 1731 1730 +3 2280 2292 2430 +3 1811 1813 1812 +3 1733 1735 2570 +3 222 857 858 +3 346 1139 1760 +3 809 808 390 +3 292 1073 1072 +3 1113 1959 1962 +3 1765 1764 1116 +3 2285 2286 1172 +3 1961 1012 287 +3 1754 77 1752 +3 509 820 844 +3 417 839 2710 +3 1260 1024 1252 +3 1463 1468 483 +3 2734 2732 537 +3 568 742 734 +3 2060 2059 298 +3 187 1137 353 +3 1438 1414 441 +3 469 133 753 +3 901 902 360 +3 902 1166 360 +3 592 1144 811 +3 151 234 430 +3 2321 715 2322 +3 1648 1643 1642 +3 498 786 2606 +3 1501 2696 146 +3 2699 145 898 +3 373 1970 1273 +3 1229 985 182 +3 384 237 142 +3 1025 1263 443 +3 1273 1275 1282 +3 900 1989 1193 +3 381 237 383 +3 839 837 415 +3 755 753 754 +3 138 754 753 +3 2719 437 1701 +3 789 1562 1536 +3 2604 2607 1573 +3 820 509 477 +3 780 2484 2485 +3 1184 840 416 +3 2717 1433 2713 +3 437 2717 2713 +3 1216 1219 1217 +3 394 1195 612 +3 238 550 551 +3 1206 529 1207 +3 1442 1472 2637 +3 1472 190 2637 +3 1778 1794 2745 +3 1082 1078 656 +3 1709 2266 2265 +3 498 497 1 +3 1235 735 1234 +3 526 527 705 +3 624 620 558 +3 393 589 586 +3 2128 1188 696 +3 501 497 498 +3 616 1204 1205 +3 825 514 798 +3 293 2063 294 +3 215 343 87 +3 853 854 544 +3 854 853 542 +3 2769 1060 1129 +3 212 547 548 +3 121 479 119 +3 784 620 411 +3 1320 610 1321 +3 419 618 624 +3 1518 2740 528 +3 410 953 954 +3 957 2709 2705 +3 1662 1470 1661 +3 619 2484 1174 +3 2672 708 2670 +3 893 771 887 +3 1418 2622 1700 +3 2306 2307 428 +3 1348 1342 1341 +3 527 528 1355 +3 455 436 454 +3 1704 1705 1585 +3 1703 1704 1585 +3 1900 848 1901 +3 1259 1257 455 +3 401 1323 1646 +3 422 2250 1553 +3 2250 422 1524 +3 668 666 671 +3 1469 482 481 +3 1449 1662 1661 +3 622 912 410 +3 844 2681 832 +3 454 1630 453 +3 463 748 747 +3 467 1433 2717 +3 735 1021 733 +3 909 2051 140 +3 1216 524 1219 +3 840 956 416 +3 408 811 1144 +3 739 740 738 +3 449 446 447 +3 2731 536 2726 +3 576 1223 1221 +3 461 2716 192 +3 598 2665 2664 +3 1144 1146 589 +3 627 1392 1393 +3 569 177 705 +3 1390 1391 651 +3 1799 1518 240 +3 1089 606 626 +3 1776 1220 523 +3 462 461 192 +3 1505 561 560 +3 192 459 456 +3 701 581 704 +3 673 676 636 +3 1022 1349 480 +3 2722 177 2721 +3 462 178 461 +3 611 1358 1357 +3 625 624 558 +3 2322 1621 2321 +3 1630 1460 386 +3 2727 537 2726 +3 748 178 462 +3 480 733 1021 +3 983 1543 1545 +3 531 534 532 +3 778 611 1357 +3 2607 2604 2605 +3 1463 485 148 +3 567 565 566 +3 748 462 464 +3 412 816 834 +3 743 746 464 +3 566 534 567 +3 606 663 1808 +3 1770 1771 241 +3 834 835 412 +3 420 798 514 +3 1454 1662 1449 +3 2306 428 2309 +3 763 2128 591 +3 625 558 1513 +3 477 476 390 +3 817 477 390 +3 1526 1523 1528 +3 1562 1521 791 +3 551 46 552 +3 700 2670 2669 +3 497 501 518 +3 790 1562 1552 +3 1212 574 1214 +3 1588 1587 1571 +3 2736 849 241 +3 2039 2024 2038 +3 123 128 258 +3 128 123 965 +3 1726 1727 582 +3 550 46 551 +3 274 2742 64 +3 1779 1781 2755 +3 1781 1782 2755 +3 503 506 500 +3 709 1641 581 +3 1563 1589 1587 +3 505 498 515 +3 2238 2239 392 +3 807 2243 2241 +3 818 477 817 +3 1589 1565 507 +3 1736 325 1737 +3 1530 1531 1525 +3 872 1052 1051 +3 1800 2753 2752 +3 534 186 448 +3 603 1069 721 +3 2665 653 687 +3 1513 559 1512 +3 1782 520 571 +3 2473 1727 399 +3 2748 2750 2747 +3 240 1773 1799 +3 1773 1774 1799 +3 753 752 138 +3 1 497 851 +3 1070 627 1393 +3 1071 627 1070 +3 744 743 464 +3 803 397 806 +3 1086 1084 1085 +3 402 1086 1085 +3 1020 458 1021 +3 854 540 544 +3 540 533 544 +3 811 810 174 +3 729 562 563 +3 1351 562 729 +3 731 749 568 +3 749 746 568 +3 1338 564 1350 +3 1337 1338 1350 +3 455 1257 54 +3 1198 2486 426 +3 817 2244 818 +3 239 530 536 +3 242 1225 1216 +3 1582 499 938 +3 50 737 745 +3 735 724 1234 +3 540 539 533 +3 539 540 30 +3 901 1990 900 +3 223 541 855 +3 541 540 854 +3 715 1620 3 +3 212 548 550 +3 545 543 541 +3 223 545 541 +3 2456 2455 1680 +3 545 546 547 +3 223 546 545 +3 1163 110 2066 +3 212 545 547 +3 945 946 183 +3 549 548 547 +3 2748 2747 2749 +3 217 917 920 +3 173 924 925 +3 855 542 856 +3 855 854 542 +3 46 203 552 +3 1081 95 662 +3 173 542 553 +3 149 956 840 +3 1505 560 1507 +3 742 50 745 +3 2749 1710 2751 +3 561 562 452 +3 179 1509 1508 +3 1507 560 179 +3 2574 150 2248 +3 665 638 693 +3 571 1778 2754 +3 727 751 480 +3 705 177 2722 +3 885 882 765 +3 177 565 567 +3 402 1326 587 +3 556 1516 1509 +3 1690 1691 1213 +3 742 745 734 +3 725 1235 736 +3 1374 769 1375 +3 1361 769 1374 +3 1343 566 565 +3 451 1343 565 +3 707 1066 603 +3 707 632 1066 +3 1076 656 1078 +3 584 1643 1644 +3 705 2722 526 +3 1326 402 1085 +3 1148 1086 402 +3 598 652 2665 +3 2636 2635 577 +3 773 611 914 +3 611 773 772 +3 914 622 915 +3 1925 1924 757 +3 680 697 605 +3 663 646 645 +3 732 724 733 +3 833 490 831 +3 677 669 636 +3 618 617 1182 +3 617 618 419 +3 844 490 509 +3 697 680 635 +3 566 713 186 +3 1070 595 1071 +3 1825 107 57 +3 814 409 813 +3 636 672 673 +3 2349 2348 1203 +3 900 117 901 +3 1206 573 1205 +3 658 679 675 +3 2653 1821 596 +3 410 621 622 +3 2738 2737 1207 +3 649 1665 891 +3 620 0 621 +3 680 678 635 +3 674 658 675 +3 598 2664 2666 +3 1807 602 1806 +3 698 710 584 +3 710 698 1096 +3 395 798 828 +3 1365 1372 1364 +3 1371 1372 1365 +3 409 2479 827 +3 1321 610 609 +3 1151 616 1223 +3 2177 2176 1044 +3 0 915 621 +3 2664 2665 687 +3 2672 2671 580 +3 733 724 735 +3 2737 1211 2741 +3 1346 453 1345 +3 2351 1209 1204 +3 845 2676 833 +3 2323 715 1625 +3 1151 1150 616 +3 2352 2344 1201 +3 2273 2274 588 +3 615 1516 556 +3 557 1516 1515 +3 744 50 743 +3 1145 1144 589 +3 1181 1182 619 +3 1182 1181 618 +3 2546 2545 1626 +3 620 621 411 +3 1374 1375 770 +3 405 1356 1320 +3 1359 1356 405 +3 145 2144 2139 +3 1353 452 1352 +3 1469 2141 355 +3 137 379 1165 +3 784 558 620 +3 670 693 638 +3 668 671 672 +3 2753 1779 2754 +3 1069 722 721 +3 654 1187 1188 +3 637 678 680 +3 1687 1688 660 +3 813 390 816 +3 671 667 658 +3 667 679 658 +3 2350 1195 613 +3 607 646 663 +3 665 595 666 +3 638 666 668 +3 711 1096 1095 +3 769 1361 1358 +3 758 1924 1925 +3 597 1086 1087 +3 1989 900 1990 +3 1183 1184 416 +3 708 581 701 +3 1420 1407 2330 +3 637 680 685 +3 672 671 658 +3 669 670 638 +3 636 669 668 +3 669 638 668 +3 637 670 669 +3 1919 1921 600 +3 816 412 813 +3 693 628 665 +3 1082 1077 1078 +3 636 668 672 +3 666 595 667 +3 1641 1642 710 +3 884 648 881 +3 1688 707 660 +3 637 685 670 +3 145 359 2144 +3 1908 1907 895 +3 706 660 707 +3 1861 1247 1860 +3 731 568 734 +3 721 722 642 +3 606 1089 1081 +3 1352 452 1351 +3 2152 682 1504 +3 857 546 223 +3 717 1627 2545 +3 1780 1797 2750 +3 747 746 563 +3 881 694 882 +3 1133 639 1132 +3 489 829 2680 +3 1548 1537 1564 +3 965 964 252 +3 490 844 832 +3 1175 1176 1180 +3 1557 1559 793 +3 2547 2542 1628 +3 1726 1639 2009 +3 992 990 176 +3 859 222 858 +3 1667 222 859 +3 732 465 731 +3 465 730 731 +3 566 186 534 +3 357 2130 2129 +3 465 732 733 +3 1366 768 1368 +3 746 749 563 +3 731 734 732 +3 743 568 746 +3 568 743 742 +3 1579 516 1994 +3 878 2164 2165 +3 773 1176 772 +3 956 839 417 +3 50 742 743 +3 1233 736 1234 +3 751 733 480 +3 903 365 137 +3 465 733 751 +3 751 728 750 +3 465 751 750 +3 752 365 138 +3 1922 1923 758 +3 1389 2666 1392 +3 575 805 94 +3 881 762 694 +3 1442 2492 1134 +3 887 886 765 +3 406 776 1371 +3 954 417 955 +3 590 1322 1323 +3 2661 178 2659 +3 137 1165 1166 +3 773 1180 1176 +3 622 914 911 +3 439 467 1426 +3 782 591 781 +3 765 893 887 +3 413 835 834 +3 809 813 409 +3 805 823 397 +3 1356 777 1320 +3 1020 1236 1237 +3 793 1558 1557 +3 2686 2685 866 +3 965 123 964 +3 703 1096 1097 +3 2317 1019 2316 +3 1557 421 1559 +3 286 2179 232 +3 1676 2176 2177 +3 354 2133 352 +3 393 802 803 +3 407 806 478 +3 954 956 417 +3 777 2488 1320 +3 1212 1211 244 +3 2238 2580 2237 +3 813 809 390 +3 1184 1183 814 +3 835 149 840 +3 478 821 819 +3 392 2579 2580 +3 1127 2481 953 +3 819 821 820 +3 818 819 477 +3 818 478 819 +3 805 396 823 +3 819 820 477 +3 1211 573 2741 +3 397 823 478 +3 395 825 798 +3 2236 829 797 +3 831 392 487 +3 2681 489 2680 +3 798 829 828 +3 956 953 416 +3 953 956 954 +3 2128 695 591 +3 1184 814 412 +3 1943 2576 1122 +3 487 846 845 +3 1904 1903 849 +3 542 853 553 +3 16 2608 1593 +3 1048 2160 2159 +3 1586 2772 2773 +3 856 223 855 +3 978 867 1108 +3 2194 2189 2758 +3 239 536 2731 +3 2295 2296 865 +3 2170 2166 1046 +3 1138 1171 657 +3 873 1055 1035 +3 2046 2045 936 +3 2134 2145 142 +3 1167 44 360 +3 875 2296 2770 +3 2165 2164 2167 +3 1051 1052 1034 +3 914 915 773 +3 306 14 1143 +3 623 913 912 +3 2695 2694 301 +3 2353 2354 614 +3 694 762 1920 +3 1906 1907 1367 +3 1142 304 1143 +3 906 117 900 +3 756 117 906 +3 931 1767 1766 +3 754 756 906 +3 214 910 59 +3 911 912 622 +3 1129 870 1128 +3 77 337 1126 +3 917 217 916 +3 917 916 918 +3 1001 998 951 +3 1392 1818 1393 +3 1739 1740 183 +3 1075 1124 1125 +3 1414 440 1412 +3 964 963 252 +3 1494 1496 1495 +3 2708 2662 2707 +3 1881 1882 2437 +3 396 2766 822 +3 823 396 822 +3 2711 415 2708 +3 417 2710 957 +3 1008 473 1005 +3 289 1073 960 +3 71 130 131 +3 2223 1004 2222 +3 2050 339 2051 +3 1625 715 1626 +3 2520 2333 2519 +3 2407 2197 2408 +3 2197 2407 2198 +3 1226 2334 948 +3 2678 2192 2224 +3 2433 2305 2302 +3 124 1015 1016 +3 248 255 60 +3 473 1003 1005 +3 2191 1003 473 +3 2348 613 1202 +3 2036 993 2035 +3 123 907 964 +3 907 123 1015 +3 1207 2739 2738 +3 1242 1838 1839 +3 926 1681 1680 +3 1109 865 1110 +3 868 1109 1110 +3 2320 1621 2319 +3 1037 1038 1043 +3 2768 2767 1130 +3 1986 265 86 +3 1984 1986 86 +3 2107 1298 2108 +3 2377 2375 1271 +3 1380 2375 2377 +3 2195 2229 2214 +3 1294 1153 1289 +3 995 61 994 +3 1253 1856 1689 +3 2113 1299 229 +3 2423 889 2421 +3 1274 1273 1269 +3 373 1273 1274 +3 1610 1611 1154 +3 1610 471 1611 +3 2120 226 2121 +3 2535 1524 1526 +3 1375 894 770 +3 2072 204 2073 +3 2601 2604 2602 +3 2601 1575 2604 +3 981 980 979 +3 981 979 221 +3 922 425 920 +3 425 922 970 +3 2142 2145 2134 +3 2650 2145 2142 +3 970 922 220 +3 113 2062 2060 +3 2451 921 1996 +3 1996 217 2451 +3 217 920 2451 +3 57 1826 1825 +3 2168 2171 2169 +3 208 2081 214 +3 770 2258 600 +3 2258 770 883 +3 2085 975 974 +3 549 974 211 +3 335 1888 1887 +3 1334 2084 213 +3 976 548 211 +3 2079 2078 210 +3 1755 337 1754 +3 1332 213 1331 +3 869 1672 1669 +3 281 58 11 +3 58 281 1938 +3 1815 1816 219 +3 1816 979 219 +3 1812 1815 219 +3 998 1232 951 +3 1997 1996 1995 +3 2094 2096 2093 +3 2096 2094 221 +3 2098 978 971 +3 978 973 971 +3 2093 2096 971 +3 2096 2098 971 +3 2098 2096 2097 +3 1619 547 546 +3 1996 921 1995 +3 2096 221 2097 +3 1821 601 1820 +3 1769 1577 1768 +3 1581 1769 1768 +3 925 924 1997 +3 984 316 233 +3 303 2692 2068 +3 2692 300 2068 +3 2129 2130 2147 +3 1529 1525 792 +3 1530 1529 1523 +3 729 563 730 +3 2728 257 2729 +3 2673 699 2668 +3 699 2667 2668 +3 1541 1540 55 +3 1536 1540 1541 +3 1533 1531 1530 +3 348 1971 1998 +3 1523 1532 1530 +3 2250 2251 1553 +3 2251 2250 796 +3 676 657 1632 +3 1633 676 1632 +3 1527 422 983 +3 2248 150 2253 +3 2249 2248 2253 +3 2693 2689 2694 +3 2693 2691 2689 +3 22 298 299 +3 2656 697 635 +3 787 2656 635 +3 2599 1972 2597 +3 1972 1973 2597 +3 316 39 317 +3 316 984 39 +3 984 311 39 +3 1393 1818 601 +3 37 195 1729 +3 2052 2054 140 +3 1120 2218 1949 +3 989 990 96 +3 990 989 991 +3 1684 9 1682 +3 998 1001 61 +3 66 1686 1683 +3 990 930 176 +3 930 990 34 +3 930 933 176 +3 298 2059 295 +3 444 1460 1461 +3 444 2743 1460 +3 195 996 995 +3 2158 1049 2159 +3 1677 1676 1045 +3 985 180 989 +3 180 985 423 +3 333 89 1140 +3 333 1492 89 +3 695 1186 2477 +3 1186 174 2477 +3 2062 2061 2060 +3 991 34 990 +3 1699 1063 1669 +3 930 928 933 +3 33 347 346 +3 33 1000 347 +3 1030 1032 860 +3 1030 2515 1032 +3 1886 2640 2649 +3 2640 1885 2649 +3 1161 2432 2285 +3 993 987 988 +3 987 96 988 +3 143 1491 1492 +3 1493 143 1492 +3 1493 334 336 +3 734 745 1233 +3 38 1334 344 +3 927 926 1685 +3 1867 1265 1864 +3 1679 4 202 +3 2050 127 1614 +3 127 1616 1614 +3 922 920 917 +3 195 37 996 +3 1731 1736 1732 +3 1757 329 1760 +3 351 34 999 +3 327 351 999 +3 774 1179 1369 +3 1233 745 736 +3 1491 1002 332 +3 2565 88 2569 +3 323 197 99 +3 996 997 998 +3 999 991 180 +3 1000 999 180 +3 1000 327 999 +3 2140 356 2141 +3 1743 1742 324 +3 1000 180 423 +3 347 1000 423 +3 33 327 1000 +3 987 1001 951 +3 351 99 197 +3 1029 864 1030 +3 2773 1706 2006 +3 2605 2606 1574 +3 960 292 1117 +3 1073 292 960 +3 1959 1958 1114 +3 2272 1326 2274 +3 2002 249 248 +3 249 67 248 +3 2201 1006 2203 +3 2200 2210 2211 +3 1939 1935 1936 +3 1939 112 1935 +3 1533 982 1534 +3 1538 1533 1534 +3 2206 2203 2204 +3 70 124 125 +3 1014 124 70 +3 2028 994 2042 +3 2041 2028 2042 +3 2192 1005 2186 +3 1962 1960 1963 +3 1965 350 1960 +3 2187 961 2188 +3 77 1395 261 +3 41 2000 1999 +3 1014 907 1015 +3 122 907 1014 +3 70 122 1014 +3 350 1114 2213 +3 2209 2200 2204 +3 2209 2204 1006 +3 2668 700 2669 +3 141 2053 2056 +3 2321 2320 1620 +3 2321 1621 2320 +3 1010 2213 2208 +3 2299 1321 1322 +3 405 1321 2299 +3 706 707 683 +3 2301 1157 1602 +3 831 490 2679 +3 490 832 2679 +3 287 1012 1011 +3 1010 2206 2204 +3 1013 2191 473 +3 2205 1013 473 +3 2561 166 2560 +3 2201 2202 1008 +3 2203 2202 2201 +3 2369 2368 2370 +3 1896 1897 1895 +3 102 40 107 +3 2394 1283 53 +3 1283 2394 2390 +3 985 2154 986 +3 2076 2072 2073 +3 2076 208 2072 +3 308 310 1018 +3 755 308 1018 +3 308 755 14 +3 1848 1849 1251 +3 2345 1200 2346 +3 737 740 1238 +3 740 737 738 +3 1020 1021 735 +3 738 737 50 +3 50 744 738 +3 454 1259 455 +3 1337 1350 729 +3 480 1021 1022 +3 738 744 741 +3 457 738 741 +3 1841 1840 193 +3 1840 1841 1242 +3 1693 1691 1519 +3 1025 442 188 +3 1257 1256 1024 +3 453 450 1259 +3 928 931 2022 +3 931 932 2022 +3 2055 2056 2053 +3 2056 2055 1495 +3 336 1497 1496 +3 2701 1678 1673 +3 1672 2701 1673 +3 436 455 1025 +3 188 436 1025 +3 459 467 439 +3 702 1123 1093 +3 1026 842 843 +3 1093 1123 841 +3 1945 2578 1943 +3 2684 2384 371 +3 2384 2684 2386 +3 1526 1524 1527 +3 2537 2538 1173 +3 2252 796 2235 +3 1076 1125 656 +3 691 2316 2315 +3 704 842 1026 +3 342 1747 1748 +3 1747 341 1748 +3 1163 320 110 +3 190 2639 2637 +3 2065 2064 2066 +3 2079 93 919 +3 2078 2077 2082 +3 2077 91 2082 +3 1231 1230 182 +3 1678 2178 1674 +3 1048 2168 2167 +3 1676 2177 2178 +3 2177 1044 2178 +3 2500 2508 1041 +3 190 2594 2595 +3 377 136 2774 +3 874 1033 1032 +3 1710 2265 2337 +3 2336 1710 2337 +3 2158 1057 2157 +3 1057 2163 2157 +3 1236 735 1235 +3 1815 1812 1814 +3 499 1578 503 +3 2315 2316 714 +3 1620 2315 714 +3 382 1165 379 +3 1033 873 1035 +3 1033 1034 873 +3 1238 725 737 +3 861 1030 860 +3 1036 861 860 +3 1035 1036 860 +3 1938 2490 58 +3 861 1029 1030 +3 1285 2720 1488 +3 1801 1286 1274 +3 367 1801 1274 +3 937 2013 2021 +3 1673 1674 1043 +3 1415 1430 2622 +3 1430 1419 2622 +3 2161 1057 2160 +3 1037 871 1038 +3 28 1599 1597 +3 1830 28 1597 +3 2025 2044 2043 +3 2161 2162 2163 +3 2173 2172 1050 +3 2172 2173 879 +3 1095 703 2502 +3 1169 604 1170 +3 1169 1065 604 +3 971 425 970 +3 658 674 673 +3 788 604 1065 +3 631 788 1065 +3 659 2153 1019 +3 2153 2318 1019 +3 425 971 973 +3 1059 2155 2770 +3 868 1105 1107 +3 1109 868 1107 +3 35 2028 2027 +3 2028 198 2027 +3 2132 356 2131 +3 331 1756 1757 +3 2014 2032 2031 +3 2032 2015 2031 +3 1047 2171 2168 +3 1046 2166 2165 +3 1048 1049 872 +3 1834 1759 262 +3 873 1053 1055 +3 1715 155 1714 +3 2509 2508 1040 +3 2731 2726 537 +3 1705 1704 1584 +3 616 2349 1203 +3 238 543 212 +3 1047 872 1051 +3 2171 2172 879 +3 1050 1051 1034 +3 1708 1707 572 +3 2090 2089 967 +3 1681 31 1680 +3 2513 1031 2514 +3 1031 2515 2514 +3 2508 2500 1061 +3 2500 2501 1061 +3 1033 874 1034 +3 1034 1052 873 +3 1052 1053 873 +3 1052 1056 1053 +3 1055 863 1035 +3 1032 1033 860 +3 1033 1035 860 +3 1054 863 1055 +3 1049 2295 880 +3 2295 1049 876 +3 1967 1444 2491 +3 1056 1052 872 +3 1706 508 2268 +3 1580 1706 2268 +3 1814 863 1054 +3 1788 1790 1789 +3 1056 880 1053 +3 2016 2017 2033 +3 1054 1053 880 +3 2194 1011 2193 +3 2095 969 967 +3 2091 2092 970 +3 2091 969 2092 +3 2618 2616 2608 +3 2618 2607 2616 +3 2167 1046 2165 +3 2162 2161 878 +3 2644 2643 9 +3 2025 2038 2037 +3 2008 2257 2258 +3 883 2008 2258 +3 1004 2185 2187 +3 673 672 658 +3 940 1979 1976 +3 199 1886 196 +3 2769 875 2770 +3 1106 864 1029 +3 923 1106 1029 +3 2506 2508 1061 +3 640 1171 1170 +3 1171 641 1170 +3 2224 2192 2223 +3 2770 2155 1060 +3 2155 870 1060 +3 240 528 527 +3 1518 528 240 +3 220 2088 2090 +3 2088 2089 2090 +3 2035 993 988 +3 2099 2085 974 +3 2564 1742 1745 +3 2165 2166 878 +3 2013 2046 936 +3 937 2046 2013 +3 1684 1686 66 +3 631 1065 1066 +3 1067 631 1066 +3 667 1067 632 +3 1067 1066 632 +3 595 1067 667 +3 1091 2468 2466 +3 1170 641 1169 +3 1066 1068 603 +3 1066 1065 1068 +3 1170 635 640 +3 604 635 1170 +3 1934 1932 1912 +3 1928 1927 758 +3 1067 595 1070 +3 1068 1065 1169 +3 471 1612 1611 +3 1612 225 1611 +3 1067 1070 631 +3 2399 271 2400 +3 665 664 1071 +3 664 665 628 +3 2125 2126 224 +3 102 103 40 +3 712 1075 2589 +3 2588 712 2589 +3 612 399 583 +3 399 612 1150 +3 1076 1078 1074 +3 673 657 676 +3 1084 597 1078 +3 1115 1765 1116 +3 291 1115 1116 +3 653 1083 1082 +3 687 653 1082 +3 656 1824 1823 +3 1077 1082 1083 +3 1075 1125 1076 +3 1094 1093 712 +3 711 710 1096 +3 2274 2273 2272 +3 1094 702 1093 +3 584 2011 698 +3 2011 584 1645 +3 1087 1080 597 +3 1080 1087 95 +3 593 1087 1086 +3 593 1088 1087 +3 1078 1077 1084 +3 1179 1174 406 +3 1911 1394 645 +3 1911 1926 1394 +3 690 2463 1102 +3 1076 1074 2589 +3 1822 1823 688 +3 173 1104 542 +3 1091 1090 2468 +3 1099 599 1091 +3 690 1099 1091 +3 1529 1528 1523 +3 594 1098 1099 +3 1077 1085 1084 +3 2570 325 1733 +3 597 1080 1079 +3 1963 1960 1112 +3 424 655 1088 +3 1079 1080 599 +3 1080 1081 599 +3 2423 2422 757 +3 2422 2423 2421 +3 404 2422 2421 +3 760 653 759 +3 760 1083 653 +3 48 314 275 +3 1149 1088 593 +3 2589 1075 1076 +3 2588 2589 1074 +3 1085 1077 1697 +3 1146 1148 402 +3 1146 592 1148 +3 1641 711 581 +3 711 2563 581 +3 591 782 1330 +3 1146 1147 589 +3 1147 402 587 +3 1087 1088 95 +3 1088 655 95 +3 655 662 95 +3 1820 601 1819 +3 2291 2281 2365 +3 2286 2291 2365 +3 1527 982 1594 +3 962 1124 1101 +3 1203 1204 616 +3 1093 841 1075 +3 1091 599 1090 +3 599 1089 1090 +3 2469 1090 2470 +3 1103 2461 1122 +3 2458 2461 1103 +3 399 2472 2473 +3 2472 399 1151 +3 2060 2061 26 +3 794 2237 2232 +3 599 1081 1089 +3 603 721 800 +3 721 720 800 +3 2117 2114 2115 +3 2466 2468 2467 +3 689 2466 2467 +3 2468 1090 2469 +3 2467 2468 2469 +3 626 2470 1089 +3 688 1092 689 +3 1820 689 1821 +3 1099 1079 599 +3 1126 332 338 +3 332 25 338 +3 706 686 1504 +3 683 686 706 +3 702 1094 1095 +3 962 1100 1092 +3 1078 1079 1098 +3 1079 1078 597 +3 2566 1747 342 +3 1074 1098 594 +3 1074 1078 1098 +3 594 1099 1102 +3 2562 2563 711 +3 841 1124 1075 +3 1098 1079 1099 +3 1460 1630 1461 +3 1760 329 1761 +3 249 2002 2763 +3 254 249 2763 +3 1628 1629 642 +3 1628 720 1629 +3 925 1104 173 +3 1823 1824 688 +3 1125 1124 962 +3 677 1633 1634 +3 1183 815 814 +3 1503 2282 2287 +3 2288 1503 2287 +3 2717 2718 1432 +3 856 542 1104 +3 858 856 1104 +3 858 857 856 +3 858 1104 925 +3 858 925 859 +3 594 2459 2460 +3 1102 1099 690 +3 2578 1026 2576 +3 1671 1039 870 +3 1107 1106 5 +3 1108 1107 5 +3 2277 2505 2501 +3 2277 2504 2505 +3 2505 1061 2501 +3 1672 1038 1699 +3 2367 370 1475 +3 2014 936 2032 +3 521 1791 1785 +3 1814 1054 866 +3 1815 1814 866 +3 1608 1607 470 +3 1607 1608 2687 +3 1154 2687 1608 +3 1108 867 1109 +3 1107 1108 1109 +3 1030 2514 2515 +3 1281 2262 1696 +3 2262 1281 2263 +3 1825 8 107 +3 1956 1955 1117 +3 2185 2184 288 +3 1003 2184 2185 +3 2224 2225 2189 +3 2226 2224 2189 +3 88 2565 2566 +3 185 448 1887 +3 1174 780 406 +3 286 232 285 +3 1834 1753 1746 +3 116 2021 2023 +3 2021 2013 2023 +3 1954 1963 1112 +3 1833 1832 1830 +3 620 624 618 +3 2760 1004 2188 +3 799 1524 2535 +3 2210 2200 2209 +3 1116 1119 291 +3 2416 1190 1189 +3 1521 2230 1525 +3 8 102 107 +3 1118 1953 1955 +3 1954 1953 1118 +3 1007 2196 2195 +3 1116 475 1613 +3 1113 1956 1957 +3 1952 1951 1120 +3 1950 290 1111 +3 882 2007 765 +3 1955 1964 1118 +3 1445 1444 1966 +3 1008 2202 473 +3 896 2699 2700 +3 683 707 800 +3 2242 2241 2243 +3 675 1687 681 +3 639 675 681 +3 1525 1529 1530 +3 2546 1626 3 +3 2461 841 1122 +3 912 913 1127 +3 912 1127 410 +3 953 410 1127 +3 810 827 174 +3 827 2476 174 +3 2481 2480 783 +3 2481 1127 2480 +3 845 846 2482 +3 2352 2353 2357 +3 1229 182 1228 +3 182 1230 1228 +3 1069 641 722 +3 641 1133 722 +3 2320 2319 691 +3 722 1132 1131 +3 1132 722 1133 +3 361 383 1167 +3 1902 391 1901 +3 431 147 432 +3 1229 181 423 +3 2316 2318 714 +3 2318 2316 1019 +3 1131 659 1019 +3 1131 1132 659 +3 2716 459 192 +3 1136 2 354 +3 461 2662 191 +3 536 2725 2726 +3 484 485 1462 +3 484 389 485 +3 973 2452 2450 +3 2452 921 2450 +3 2141 1891 355 +3 1440 1701 437 +3 1936 1935 13 +3 1409 2520 2519 +3 355 494 1453 +3 346 1760 1761 +3 329 1758 340 +3 1847 193 1845 +3 1846 1847 1845 +3 1856 1853 1689 +3 1247 1266 1860 +3 1395 1126 338 +3 153 366 943 +3 366 1267 943 +3 1798 525 1774 +3 2696 2690 2695 +3 363 2696 2695 +3 898 2695 301 +3 94 805 804 +3 1194 111 1142 +3 633 1805 1804 +3 1737 997 1736 +3 1517 1208 1518 +3 523 1517 1518 +3 715 2321 1620 +3 582 2474 2471 +3 582 2473 2474 +3 111 304 1142 +3 303 304 2692 +3 111 1194 905 +3 1498 2135 142 +3 2136 357 2137 +3 304 306 1143 +3 152 306 304 +3 408 810 811 +3 2476 2478 2475 +3 913 2476 2475 +3 593 1148 1149 +3 592 1149 1148 +3 808 408 2241 +3 1148 593 1086 +3 594 2460 1074 +3 2459 1103 2460 +3 1558 2231 1521 +3 810 408 809 +3 809 408 808 +3 2275 2270 2272 +3 886 885 765 +3 1149 592 812 +3 592 811 812 +3 2145 385 384 +3 142 2145 384 +3 1197 610 1198 +3 2517 1776 523 +3 2724 2723 257 +3 56 2267 1709 +3 471 2183 1612 +3 227 2112 2111 +3 1608 1609 1610 +3 470 1609 1608 +3 314 313 233 +3 313 312 233 +3 1310 1309 231 +3 276 1310 1297 +3 1292 2413 2415 +3 48 372 313 +3 471 1610 1609 +3 2387 2388 161 +3 2391 2387 161 +3 225 1603 1155 +3 321 2066 2064 +3 1163 2066 321 +3 2261 472 2260 +3 1606 1154 1155 +3 1603 1602 1155 +3 1083 1697 1077 +3 2263 1281 1287 +3 1281 228 1287 +3 1611 225 1155 +3 1310 231 1297 +3 1306 1299 2112 +3 1277 1288 1289 +3 1288 1294 1289 +3 1694 1695 1279 +3 1695 1694 1281 +3 643 661 1804 +3 1382 661 643 +3 1279 1275 1656 +3 1278 1654 1655 +3 1156 1660 1292 +3 1291 1652 1653 +3 1291 1277 1289 +3 228 1288 1287 +3 228 1293 1288 +3 1970 1275 1273 +3 2347 2348 2346 +3 2291 2432 2431 +3 2432 2291 2286 +3 2013 2366 2023 +3 366 153 312 +3 2372 366 312 +3 370 2368 2369 +3 472 2261 1119 +3 1951 2297 2218 +3 2217 2297 1950 +3 2297 2217 2218 +3 1365 1366 775 +3 1166 1167 360 +3 361 1167 1166 +3 2206 2207 1009 +3 277 6 279 +3 277 1168 6 +3 444 1459 2743 +3 268 97 274 +3 821 823 822 +3 1458 1460 2743 +3 1460 1458 1457 +3 1005 2227 2193 +3 2159 1057 2158 +3 1919 2258 2257 +3 2169 1046 2765 +3 720 721 1629 +3 657 1171 1632 +3 1627 2547 1628 +3 2466 2465 1091 +3 2466 1092 2465 +3 1523 1594 1532 +3 426 2485 1182 +3 617 426 1182 +3 1196 2356 1199 +3 2356 1196 1197 +3 1181 0 618 +3 0 620 618 +3 1180 619 1175 +3 741 192 457 +3 1250 1254 1244 +3 1176 774 1177 +3 773 915 1181 +3 1636 1405 1635 +3 619 1180 1181 +3 462 192 741 +3 646 1911 645 +3 1911 646 1912 +3 771 1367 888 +3 629 1387 1910 +3 1926 629 1910 +3 1371 775 406 +3 1179 406 775 +3 1369 1179 775 +3 1440 2592 1701 +3 2590 1437 1436 +3 712 1093 1075 +3 1176 1175 774 +3 2484 619 1182 +3 2485 2484 1182 +3 2486 2487 780 +3 779 780 2487 +3 780 779 406 +3 98 272 284 +3 272 2399 284 +3 424 1187 655 +3 38 2084 1334 +3 494 493 1450 +3 1192 654 1191 +3 799 2535 1522 +3 812 1185 424 +3 1149 812 424 +3 1808 663 645 +3 812 1186 1185 +3 812 174 1186 +3 811 174 812 +3 1404 1428 2521 +3 1666 1668 861 +3 1189 654 1188 +3 2417 1189 2419 +3 884 2423 648 +3 647 1913 2397 +3 655 1187 1192 +3 2426 890 2416 +3 654 1189 1190 +3 270 2402 2401 +3 1193 906 900 +3 271 2398 97 +3 2417 2416 1189 +3 2426 2416 2417 +3 1191 2397 607 +3 654 1190 1191 +3 305 906 1193 +3 906 305 754 +3 654 1192 1187 +3 1936 108 1939 +3 1192 662 655 +3 607 662 1192 +3 662 607 663 +3 2446 1027 2448 +3 1570 2587 1587 +3 2587 1563 1587 +3 647 1914 1913 +3 1142 1143 305 +3 1193 1142 305 +3 2595 2639 190 +3 1473 2639 2595 +3 322 905 1194 +3 1194 1142 1193 +3 1196 394 1197 +3 915 0 1181 +3 2676 486 2575 +3 615 556 400 +3 1206 1205 556 +3 529 1206 556 +3 1205 400 556 +3 2211 350 2213 +3 2211 1961 350 +3 577 2471 2472 +3 576 577 2472 +3 805 397 804 +3 1195 394 1196 +3 2486 2485 426 +3 913 623 2477 +3 2636 577 94 +3 1631 719 720 +3 719 1631 2539 +3 1195 1196 613 +3 1196 1199 613 +3 616 2350 2349 +3 616 1150 2350 +3 528 2740 1511 +3 1209 1224 1210 +3 1224 2358 1210 +3 2242 407 2244 +3 83 1711 1302 +3 1300 83 1302 +3 1727 1726 579 +3 1645 579 2011 +3 1516 557 1509 +3 1221 1222 576 +3 1222 94 576 +3 613 1199 1202 +3 170 1716 263 +3 1355 528 1511 +3 1210 400 1209 +3 2767 2768 824 +3 2221 2196 2756 +3 2196 2221 2220 +3 570 1217 1219 +3 1217 570 520 +3 2739 1207 529 +3 1219 1693 1220 +3 1219 524 1693 +3 207 910 154 +3 1212 1213 574 +3 2358 1224 2357 +3 1204 400 1205 +3 1204 1209 400 +3 613 2349 2350 +3 2351 1203 2347 +3 1203 2348 2347 +3 399 1727 583 +3 501 1788 1787 +3 1971 1973 1972 +3 396 575 1130 +3 575 1225 1130 +3 2352 2357 1224 +3 1639 1726 582 +3 520 1218 1217 +3 497 518 1792 +3 2348 1202 2346 +3 242 1217 1218 +3 1208 2739 2740 +3 2739 529 2740 +3 277 2742 1168 +3 519 1785 1786 +3 1772 522 1771 +3 1218 825 242 +3 825 1218 500 +3 2023 2366 935 +3 242 1216 1217 +3 782 1327 1330 +3 56 1788 1789 +3 2631 2633 2628 +3 2631 2634 2633 +3 233 312 984 +3 1786 1785 1791 +3 1793 1784 1794 +3 570 1220 1776 +3 1223 616 573 +3 616 1205 573 +3 1776 2517 1783 +3 574 1221 1214 +3 1199 2356 2354 +3 1214 1223 573 +3 1223 1214 1221 +3 1211 1214 573 +3 419 624 625 +3 1515 419 625 +3 1150 1195 2350 +3 2455 1685 1680 +3 2286 2362 1172 +3 1695 1696 375 +3 1219 1220 570 +3 2359 615 1210 +3 2358 2359 1210 +3 1509 557 1512 +3 1236 725 1237 +3 949 946 1226 +3 183 946 949 +3 36 1232 998 +3 997 36 998 +3 874 1037 1043 +3 1226 1227 949 +3 1226 181 1227 +3 1123 702 1943 +3 740 739 1240 +3 1836 740 1240 +3 354 2 1891 +3 1229 1227 181 +3 1229 1228 1227 +3 1909 769 1358 +3 772 1909 1358 +3 923 1029 1028 +3 2178 1044 1674 +3 1232 36 950 +3 859 925 218 +3 925 1997 218 +3 924 217 1996 +3 1817 949 1230 +3 945 184 947 +3 2044 2048 2049 +3 2048 2044 2026 +3 2734 537 238 +3 1836 2496 2497 +3 1236 1020 735 +3 18 2642 2644 +3 1844 1839 1843 +3 1839 1844 1840 +3 1235 725 1236 +3 1243 1846 739 +3 1251 193 1847 +3 1366 1365 888 +3 1846 1250 1847 +3 1022 1842 1023 +3 458 1838 1242 +3 1842 1242 1841 +3 739 457 1243 +3 737 725 736 +3 2383 2386 2385 +3 2382 2383 2385 +3 1845 193 1840 +3 1255 193 1251 +3 184 535 947 +3 947 535 49 +3 535 1888 49 +3 1237 1239 1020 +3 1839 1838 1837 +3 1243 1250 1846 +3 192 456 457 +3 458 1242 1842 +3 1251 1252 1024 +3 339 2052 2051 +3 110 2065 2066 +3 1616 1617 130 +3 69 1616 130 +3 448 90 335 +3 1842 1841 1023 +3 2622 1418 2621 +3 1268 1270 367 +3 909 2050 2051 +3 2050 909 127 +3 1255 1841 193 +3 1247 1869 1868 +3 456 1254 457 +3 2552 60 2551 +3 1253 1254 456 +3 456 459 1249 +3 1249 439 1247 +3 1835 2496 1239 +3 2496 1835 2497 +3 1243 457 1254 +3 1496 1494 336 +3 2418 2419 763 +3 1277 1291 1653 +3 1909 1908 895 +3 1497 187 353 +3 2574 2230 2231 +3 1864 1865 1264 +3 1864 1265 1865 +3 440 2524 1412 +3 1254 1851 1244 +3 2308 2307 430 +3 1691 1692 1213 +3 1692 1215 1213 +3 1691 1690 1519 +3 450 1022 1258 +3 1909 1178 1908 +3 1263 1855 1262 +3 1024 1255 1251 +3 454 453 1259 +3 90 448 447 +3 448 186 447 +3 1256 1255 1024 +3 1255 1256 1023 +3 186 449 447 +3 1257 1260 54 +3 1023 1258 1022 +3 1023 1256 1258 +3 1256 1257 1258 +3 1258 1257 1259 +3 1245 1260 1252 +3 1488 2383 1285 +3 2383 1488 369 +3 1253 456 1862 +3 1861 1246 1862 +3 1367 768 1366 +3 1907 768 1367 +3 2764 1458 2743 +3 1459 2764 2743 +3 25 2052 339 +3 1263 1262 1866 +3 1519 1690 244 +3 1690 1212 244 +3 1457 386 1460 +3 1298 2110 2111 +3 1403 2327 2332 +3 2333 1403 2332 +3 2214 2219 2534 +3 2229 2219 2214 +3 2375 2380 2376 +3 140 74 908 +3 74 140 2054 +3 338 25 339 +3 520 570 571 +3 2598 250 2600 +3 1699 1038 1600 +3 1481 1479 369 +3 56 1789 2267 +3 1267 1270 1268 +3 1270 1267 366 +3 374 1267 1268 +3 433 1905 431 +3 1004 2186 2185 +3 351 1489 34 +3 1272 1801 1802 +3 2379 230 2378 +3 230 2377 2378 +3 1282 2394 53 +3 371 2683 2684 +3 1296 2107 2108 +3 1658 1293 228 +3 1314 98 285 +3 375 1282 1275 +3 1279 375 1275 +3 469 468 133 +3 1017 469 309 +3 1018 1017 309 +3 2393 1017 1018 +3 2684 2683 53 +3 2733 2732 2734 +3 551 2734 238 +3 555 537 2727 +3 2107 1296 1295 +3 1158 2107 1295 +3 1159 1291 1290 +3 1291 1289 1290 +3 1273 1282 53 +3 1269 1273 53 +3 1292 1159 2413 +3 312 153 311 +3 2125 17 1715 +3 2119 2120 1304 +3 2401 271 296 +3 1288 1277 1287 +3 2122 2125 2124 +3 375 1279 1695 +3 1656 1657 1279 +3 1656 1278 1657 +3 373 1969 1970 +3 424 1185 1187 +3 716 1623 642 +3 1131 716 642 +3 288 2184 2181 +3 2184 2182 2181 +3 1360 778 1359 +3 369 2384 2383 +3 2028 35 994 +3 370 1300 1319 +3 158 2100 2101 +3 227 2118 1306 +3 828 489 2682 +3 52 160 1478 +3 1305 52 1478 +3 1036 2429 1666 +3 1270 2378 367 +3 2378 1270 2379 +3 2730 2735 533 +3 1271 2375 2376 +3 1802 1271 1803 +3 1271 2376 1803 +3 1152 1307 1309 +3 1307 231 1309 +3 315 314 233 +3 231 1307 1295 +3 2111 2114 227 +3 1802 1803 1272 +3 2560 166 2549 +3 1158 2104 2106 +3 1158 2103 2104 +3 1153 1290 1289 +3 984 312 311 +3 1710 1709 2265 +3 1309 1311 470 +3 1153 1294 1295 +3 289 1336 2121 +3 2384 2386 2383 +3 1336 297 2121 +3 1300 229 1299 +3 83 1300 1299 +3 1607 1309 470 +3 48 1297 1313 +3 2272 1325 2275 +3 1325 2272 2273 +3 1422 1423 1399 +3 1114 1115 291 +3 1603 2301 1602 +3 1605 1308 1152 +3 1012 2211 2210 +3 371 2384 2391 +3 1116 1764 475 +3 1306 2112 227 +3 1280 1293 1658 +3 1603 225 1317 +3 1156 1603 1317 +3 475 1764 1763 +3 162 1476 1475 +3 2685 972 1816 +3 978 972 2685 +3 2114 2111 1301 +3 1315 1314 276 +3 1315 1297 275 +3 275 1297 48 +3 1315 276 1297 +3 2076 91 2077 +3 91 2076 2073 +3 2221 2760 2188 +3 1319 1302 1483 +3 369 1479 2387 +3 2384 369 2387 +3 160 52 159 +3 469 753 309 +3 1989 1991 322 +3 543 555 30 +3 555 2727 30 +3 189 1881 2437 +3 2396 1191 1190 +3 1009 2203 2206 +3 2106 2107 1158 +3 2107 2106 1298 +3 1290 2410 2413 +3 367 1802 1801 +3 1153 1295 1308 +3 1308 1295 1307 +3 1308 1307 1152 +3 47 280 283 +3 372 48 1313 +3 230 2370 1380 +3 1610 1154 1608 +3 1311 1309 1310 +3 235 314 315 +3 283 273 235 +3 2110 1301 2111 +3 98 1314 1315 +3 1311 276 1312 +3 276 1311 1310 +3 1660 1280 1659 +3 1312 1314 285 +3 1314 1312 276 +3 1301 2116 2115 +3 2115 2123 1303 +3 2123 1763 1303 +3 1010 2208 2206 +3 2410 2415 2413 +3 2651 2650 2142 +3 2412 2411 1153 +3 966 1155 1602 +3 1304 2120 2122 +3 1602 1157 1601 +3 2301 1292 2415 +3 1316 2409 2411 +3 2756 2196 2757 +3 647 2397 2396 +3 1357 777 1356 +3 1357 767 777 +3 911 778 623 +3 912 911 623 +3 611 911 914 +3 587 1650 1651 +3 805 575 396 +3 2478 783 2475 +3 952 2479 815 +3 405 1320 1321 +3 782 781 405 +3 2261 1013 1119 +3 1360 623 778 +3 1116 472 1119 +3 1322 1321 609 +3 1042 1129 2498 +3 1042 2769 1129 +3 2372 2379 366 +3 2379 1270 366 +3 2084 919 213 +3 2012 2673 1725 +3 1323 1322 609 +3 782 2299 2300 +3 1064 1600 871 +3 2274 1697 588 +3 2505 2506 1061 +3 1324 587 2270 +3 2400 284 2399 +3 2402 284 2400 +3 2074 977 2073 +3 977 2074 203 +3 2270 2269 1324 +3 404 2417 2418 +3 2417 2419 2418 +3 2563 2562 842 +3 2396 2397 1191 +3 1819 1822 688 +3 1330 1327 1328 +3 761 1330 1328 +3 1801 2264 1286 +3 2373 1475 1476 +3 918 1331 919 +3 1331 918 216 +3 1732 1730 1731 +3 2215 1950 1111 +3 77 1126 1395 +3 1757 1760 331 +3 1760 1139 331 +3 324 323 1744 +3 296 1336 270 +3 297 1336 296 +3 1038 871 1600 +3 1538 1534 1539 +3 728 1338 1337 +3 1340 1338 728 +3 1338 1340 1339 +3 1339 564 1338 +3 1339 569 564 +3 569 1339 565 +3 1346 1344 726 +3 564 1351 1350 +3 1351 564 1352 +3 451 1339 1340 +3 1339 451 565 +3 2168 2169 2765 +3 1349 1348 727 +3 450 1346 726 +3 955 957 411 +3 508 2267 2268 +3 453 1346 450 +3 1341 1347 727 +3 449 186 713 +3 1345 449 713 +3 1347 751 727 +3 451 1342 1343 +3 1349 727 480 +3 1343 713 566 +3 1344 713 1343 +3 713 1344 1345 +3 746 747 464 +3 463 2660 748 +3 2717 1432 467 +3 1344 1343 1342 +3 1347 728 751 +3 2660 178 748 +3 2659 178 2660 +3 1340 728 1347 +3 1340 1347 1341 +3 386 1345 453 +3 1345 1344 1346 +3 726 1342 1348 +3 726 1348 1349 +3 726 1349 450 +3 741 464 462 +3 741 744 464 +3 450 1349 1022 +3 1350 1351 729 +3 452 1353 1354 +3 1353 527 1354 +3 781 1360 1359 +3 411 2705 784 +3 569 1352 564 +3 1006 2201 2198 +3 497 1792 850 +3 887 888 403 +3 419 1516 615 +3 522 1772 526 +3 569 1353 1352 +3 452 1354 560 +3 561 452 560 +3 463 747 563 +3 776 406 779 +3 2443 1423 1422 +3 1379 885 886 +3 1362 1363 767 +3 1394 1910 644 +3 1910 1387 644 +3 1361 766 1362 +3 1576 1994 516 +3 590 1323 2271 +3 1357 1358 767 +3 1358 1361 767 +3 1407 1420 1400 +3 911 611 778 +3 611 772 1358 +3 1927 1922 758 +3 2331 1406 1402 +3 767 1361 1362 +3 888 1365 1364 +3 892 1363 1362 +3 1363 892 403 +3 1364 1363 403 +3 888 1364 403 +3 1177 772 1176 +3 766 892 1362 +3 774 1369 1370 +3 1177 774 1370 +3 1370 1368 768 +3 1178 1370 768 +3 1178 1177 1370 +3 1366 1368 775 +3 772 1177 1178 +3 2174 879 2173 +3 2174 2175 879 +3 2282 1161 2283 +3 2279 2282 1503 +3 1369 775 1368 +3 1370 1369 1368 +3 781 1359 405 +3 767 1363 1373 +3 709 708 2629 +3 1650 587 1324 +3 1646 608 1643 +3 1733 323 324 +3 1363 1364 1372 +3 2299 1322 2300 +3 767 1373 777 +3 1373 776 777 +3 1326 1697 2274 +3 1373 1363 1372 +3 1371 776 1372 +3 776 1373 1372 +3 1360 2477 623 +3 770 600 1376 +3 1374 770 1376 +3 1378 764 1379 +3 764 885 1379 +3 600 1377 1376 +3 1376 1377 766 +3 1234 724 1233 +3 1377 1378 766 +3 696 1186 695 +3 600 891 1377 +3 1028 1668 218 +3 554 217 924 +3 1378 1379 892 +3 766 1378 892 +3 1993 886 887 +3 1381 628 693 +3 670 1381 693 +3 1381 670 661 +3 1914 630 1915 +3 630 1916 1915 +3 1428 1417 1429 +3 1941 293 294 +3 1382 628 1381 +3 661 1382 1381 +3 2508 2509 1041 +3 2509 2512 1041 +3 980 219 979 +3 1809 219 980 +3 664 1388 1071 +3 651 1387 1390 +3 645 1384 602 +3 1072 1765 1115 +3 629 1390 1387 +3 629 1933 1390 +3 1870 1871 1265 +3 1874 1871 1870 +3 643 1804 1805 +3 2524 1410 2525 +3 644 1386 1385 +3 644 1387 1386 +3 628 1385 664 +3 644 1385 1383 +3 1383 1385 1382 +3 1385 628 1382 +3 1383 1382 643 +3 2523 1411 2333 +3 651 1388 1386 +3 1387 651 1386 +3 1934 1931 1932 +3 1931 650 1932 +3 2654 2653 596 +3 2654 2656 2653 +3 1615 1616 69 +3 1761 33 346 +3 644 1383 1384 +3 1929 1928 1925 +3 1391 1929 652 +3 598 1391 652 +3 598 1389 1391 +3 1388 1389 627 +3 1071 1388 627 +3 601 1818 1819 +3 1393 788 631 +3 1393 601 788 +3 290 1950 2298 +3 1388 664 1386 +3 1910 1394 1926 +3 1388 651 1389 +3 1407 2329 2330 +3 629 1926 1912 +3 1926 1911 1912 +3 638 665 666 +3 1389 651 1391 +3 440 1402 1406 +3 1666 862 1667 +3 862 1666 2429 +3 2672 700 2671 +3 92 1619 981 +3 1392 627 1389 +3 1394 644 1384 +3 1923 762 881 +3 1669 1672 1699 +3 200 2641 199 +3 126 261 1395 +3 260 1754 1752 +3 2123 475 1763 +3 475 2123 2116 +3 1263 1866 1865 +3 1496 353 75 +3 1497 353 1496 +3 1916 1922 1927 +3 1432 1431 1426 +3 1476 2720 1285 +3 2720 1476 1477 +3 2141 356 1891 +3 1441 1442 1134 +3 909 139 127 +3 838 837 1473 +3 306 152 307 +3 25 1002 2053 +3 189 1878 1881 +3 2328 2329 1407 +3 1436 441 2623 +3 2130 2131 356 +3 1411 1403 2333 +3 383 384 44 +3 1040 2513 1105 +3 1617 1616 127 +3 2449 1421 2528 +3 1410 2521 1428 +3 2521 1410 2520 +3 1811 862 1813 +3 1411 1406 1403 +3 1918 2259 1920 +3 630 1918 1920 +3 920 425 2450 +3 1439 2331 1402 +3 2331 1439 2444 +3 10 1413 2525 +3 1413 1412 2525 +3 1425 1424 460 +3 381 74 237 +3 1868 1869 1248 +3 2327 1408 2522 +3 1414 1413 441 +3 1418 1436 2623 +3 2701 1672 869 +3 1635 1415 1636 +3 2399 2398 271 +3 1409 2521 2520 +3 1416 1417 1404 +3 2314 2308 2311 +3 2330 1401 1420 +3 147 430 2307 +3 147 431 430 +3 1404 1417 1428 +3 353 1136 352 +3 1165 361 1166 +3 2332 2327 1409 +3 237 384 383 +3 2331 1401 2330 +3 188 442 1414 +3 349 74 376 +3 753 133 752 +3 133 1883 752 +3 1424 438 1405 +3 438 1424 1425 +3 2055 1002 143 +3 2053 1002 2055 +3 1879 2441 442 +3 579 583 1727 +3 2131 2130 2136 +3 1636 1415 1429 +3 1437 1441 1134 +3 1401 2443 1422 +3 439 1426 1427 +3 1426 1425 1427 +3 2260 2191 1013 +3 2443 2444 2442 +3 1807 1808 602 +3 1431 438 1426 +3 1431 1430 438 +3 2717 437 2718 +3 2714 2713 1433 +3 364 365 1883 +3 2525 2529 10 +3 2525 1410 2529 +3 1878 1880 1396 +3 838 2595 1435 +3 1879 189 2439 +3 460 1424 1421 +3 1881 1877 1398 +3 1877 1881 1878 +3 1434 2713 2714 +3 356 2140 2130 +3 1880 443 1396 +3 1397 443 1880 +3 442 1025 1397 +3 467 1432 1426 +3 1399 1423 1875 +3 1867 1870 1265 +3 1870 1867 1868 +3 1427 1425 460 +3 1248 1876 1875 +3 444 1461 436 +3 1426 438 1425 +3 2524 2525 1412 +3 2530 1947 1946 +3 1947 2530 703 +3 1807 633 626 +3 2133 2132 144 +3 2404 286 2403 +3 108 1936 1937 +3 1419 1701 1700 +3 600 1921 891 +3 1700 1701 1135 +3 1417 1636 1429 +3 1406 2331 2330 +3 2620 2623 1413 +3 1913 1914 1915 +3 714 2290 2284 +3 2290 714 2318 +3 1703 2771 1702 +3 1405 1636 1417 +3 1416 1405 1417 +3 1919 1918 649 +3 2259 1918 1919 +3 2716 467 459 +3 66 351 197 +3 351 66 1489 +3 132 73 2533 +3 1438 435 188 +3 1459 435 1471 +3 441 1437 1438 +3 2652 44 385 +3 2444 1439 2442 +3 265 266 1502 +3 266 267 1502 +3 1500 2302 2305 +3 2440 2439 1402 +3 1437 441 1436 +3 1447 491 1451 +3 188 1414 1438 +3 1134 435 1438 +3 2593 1440 2594 +3 2201 1008 2198 +3 2651 2136 358 +3 2652 2651 358 +3 2492 2491 434 +3 1977 1596 1597 +3 2637 2638 1442 +3 434 1474 1470 +3 1450 493 1448 +3 2 493 494 +3 1445 491 1447 +3 492 1445 1447 +3 2595 838 1473 +3 2639 2638 2637 +3 2639 1443 2638 +3 413 491 1446 +3 413 511 491 +3 1446 836 413 +3 413 836 835 +3 414 836 1446 +3 491 1445 1446 +3 1447 1448 492 +3 1448 1449 492 +3 445 1455 1137 +3 485 389 486 +3 926 1680 1685 +3 388 1447 1451 +3 2598 2600 253 +3 1472 2592 2593 +3 190 1472 2593 +3 493 1449 1448 +3 485 486 1902 +3 1448 388 1450 +3 1454 1455 1456 +3 1134 2492 1471 +3 1451 511 484 +3 511 1451 491 +3 511 389 484 +3 1447 388 1448 +3 482 1467 481 +3 1966 1444 1967 +3 1451 484 1452 +3 1454 1449 493 +3 388 1453 1450 +3 388 1452 1453 +3 2485 2486 780 +3 1456 387 1454 +3 1455 2 1137 +3 551 79 2734 +3 552 79 551 +3 1906 1367 771 +3 1456 1455 445 +3 1902 486 2483 +3 780 1174 2484 +3 1458 387 1456 +3 1457 1458 1456 +3 1459 444 435 +3 1452 1462 483 +3 1452 484 1462 +3 1457 445 446 +3 521 1785 1773 +3 1324 2269 2271 +3 2269 590 2271 +3 1471 1470 1459 +3 1134 1471 435 +3 1470 1471 434 +3 2766 826 822 +3 2744 1784 1795 +3 939 2746 2748 +3 1794 1784 2744 +3 1452 483 1453 +3 1462 1463 483 +3 1469 355 1468 +3 482 1469 1468 +3 485 1463 1462 +3 619 2583 1175 +3 1174 2583 619 +3 830 829 2236 +3 2680 829 830 +3 392 2580 2238 +3 1466 1467 482 +3 942 1984 2245 +3 2255 1445 492 +3 1561 2238 794 +3 1465 431 432 +3 433 431 1465 +3 1466 432 1467 +3 60 2552 2005 +3 2552 246 2005 +3 1465 1464 148 +3 1455 493 2 +3 255 1892 60 +3 415 837 838 +3 355 1453 483 +3 1468 355 483 +3 482 1468 1464 +3 2133 2142 2134 +3 476 834 816 +3 476 413 834 +3 476 510 413 +3 1284 2374 2367 +3 2168 2765 2167 +3 2765 1046 2167 +3 2141 481 2140 +3 1469 481 2141 +3 1664 889 764 +3 2689 301 2694 +3 493 1455 1454 +3 2638 2492 1442 +3 2492 2638 2491 +3 2491 2638 1443 +3 836 149 835 +3 414 837 836 +3 414 1473 837 +3 837 149 836 +3 1712 171 1713 +3 2398 1168 97 +3 1168 2398 272 +3 1305 1485 52 +3 2265 2266 2339 +3 1476 162 1477 +3 66 197 1684 +3 2368 1380 2370 +3 370 2367 2368 +3 1302 1484 1483 +3 1319 162 1475 +3 1475 370 1319 +3 1902 2483 391 +3 2395 1017 2393 +3 19 1898 1479 +3 2389 161 2388 +3 1478 1479 1481 +3 1478 160 1479 +3 2723 531 257 +3 2750 1797 56 +3 930 34 175 +3 34 1489 175 +3 2369 2370 372 +3 1482 1483 1484 +3 1482 162 1483 +3 1716 1714 155 +3 1717 1716 155 +3 1305 1484 1485 +3 1484 172 1485 +3 2730 2729 532 +3 2303 1501 146 +3 2303 2302 1501 +3 147 2307 2306 +3 1566 1544 512 +3 1501 1500 113 +3 220 2080 2088 +3 2726 2725 538 +3 2392 2395 2393 +3 1477 1480 1488 +3 172 1486 1485 +3 1486 172 1487 +3 1017 2389 469 +3 161 2389 1017 +3 1712 1487 172 +3 1487 1712 1713 +3 1480 1481 1488 +3 2727 538 30 +3 538 539 30 +3 2727 2726 538 +3 536 2724 2725 +3 2724 257 2725 +3 1493 1492 334 +3 1858 1246 1859 +3 1025 54 1263 +3 1493 336 1494 +3 143 1493 1494 +3 2306 2309 2305 +3 2309 1500 2305 +3 26 2058 2059 +3 140 908 909 +3 1879 1878 189 +3 430 23 2308 +3 1498 1495 75 +3 90 1497 336 +3 234 151 852 +3 447 187 1497 +3 90 447 1497 +3 1025 455 54 +3 1495 1498 2056 +3 1498 141 2056 +3 2136 2130 357 +3 2308 2314 428 +3 2138 114 362 +3 771 888 887 +3 2294 2295 865 +3 2294 880 2295 +3 2322 2323 1622 +3 2686 865 1109 +3 463 563 562 +3 1506 1513 558 +3 1513 1506 559 +3 466 561 1505 +3 559 1505 1507 +3 1355 1511 179 +3 523 1220 1517 +3 2129 2148 114 +3 2704 2703 2658 +3 2705 2704 784 +3 2657 1506 2658 +3 1506 784 2658 +3 1440 2713 1434 +3 2594 1440 1434 +3 2660 466 2659 +3 556 1510 529 +3 1509 1510 556 +3 1509 179 1510 +3 1508 1512 559 +3 1509 1512 1508 +3 2703 466 2658 +3 2703 2659 466 +3 1726 2009 579 +3 579 2009 2010 +3 1222 574 575 +3 2707 418 2708 +3 2705 785 2704 +3 557 1514 1512 +3 2435 2434 847 +3 1786 501 1787 +3 1510 1511 529 +3 179 1511 1510 +3 530 2721 2723 +3 2721 531 2723 +3 536 530 2724 +3 730 749 731 +3 730 563 749 +3 625 1513 1514 +3 1514 1513 1512 +3 2129 2147 2148 +3 452 562 1351 +3 1207 2741 1206 +3 2251 420 1553 +3 295 2058 2057 +3 806 2243 807 +3 393 806 807 +3 269 268 2149 +3 486 389 2575 +3 389 509 2575 +3 1561 488 2238 +3 408 1145 2240 +3 408 1144 1145 +3 144 2132 2131 +3 787 1821 2653 +3 1445 2255 1444 +3 1554 1559 421 +3 792 1520 1522 +3 2708 1435 191 +3 1545 1542 55 +3 1542 1541 55 +3 2222 2756 2761 +3 1546 1541 1542 +3 1536 1541 1546 +3 2231 2230 1521 +3 2691 905 2689 +3 2515 1031 1032 +3 2325 1627 723 +3 1528 792 1522 +3 583 1645 1644 +3 1527 1524 422 +3 303 152 304 +3 2690 2694 2695 +3 2697 301 2688 +3 1164 1121 288 +3 2677 1121 1164 +3 1532 982 1533 +3 1530 1532 1533 +3 434 2491 1474 +3 2057 2058 294 +3 299 298 295 +3 791 1525 1531 +3 2541 1631 2542 +3 1555 1570 1588 +3 1572 1555 1588 +3 1999 253 2600 +3 421 1551 1550 +3 2585 2584 1568 +3 2584 2585 1567 +3 789 1536 1569 +3 704 1026 1945 +3 982 983 1534 +3 2059 2058 295 +3 2541 2540 1631 +3 2064 2057 321 +3 1531 1539 1535 +3 1539 1531 1538 +3 2057 2064 295 +3 1937 1942 108 +3 1406 2329 1403 +3 2329 2328 1403 +3 282 281 47 +3 1723 215 87 +3 1546 1548 1569 +3 1551 789 1549 +3 2670 1948 2669 +3 1562 791 1535 +3 1587 1589 1571 +3 1543 1544 513 +3 1552 1557 790 +3 1097 578 1947 +3 578 1097 1725 +3 1547 1548 1564 +3 1548 1547 1549 +3 1560 793 1559 +3 1622 2324 1623 +3 2324 723 1623 +3 498 1 1556 +3 1546 1537 1548 +3 677 678 637 +3 677 1634 678 +3 513 1537 1543 +3 1942 12 293 +3 293 12 282 +3 1540 1539 55 +3 1543 1542 1545 +3 1543 1537 1542 +3 1545 55 1534 +3 1539 1534 55 +3 798 420 797 +3 422 1544 983 +3 512 1553 420 +3 1557 1558 790 +3 1937 1938 12 +3 421 1552 1551 +3 131 132 134 +3 1544 1543 983 +3 1054 880 2294 +3 1534 983 1545 +3 1540 1535 1539 +3 1536 1535 1540 +3 843 842 2588 +3 1565 1564 513 +3 1537 1546 1542 +3 512 420 514 +3 1567 1565 1563 +3 1565 1567 1564 +3 1591 2610 16 +3 1556 1 1560 +3 498 1556 786 +3 1946 1948 701 +3 2323 2324 1622 +3 321 2063 109 +3 1552 421 1557 +3 1579 1580 516 +3 1569 1536 1546 +3 1162 23 78 +3 2587 2584 1563 +3 2587 1568 2584 +3 1551 1552 789 +3 1171 640 1632 +3 422 1553 1544 +3 1558 1521 790 +3 2254 795 2234 +3 1120 1951 2218 +3 512 1544 1553 +3 1549 789 1569 +3 2609 16 2610 +3 2281 2364 2365 +3 234 552 78 +3 1121 961 2187 +3 1554 1550 1555 +3 2460 2577 843 +3 499 2614 1578 +3 2614 499 1768 +3 494 1450 1453 +3 482 1464 1466 +3 794 2232 1558 +3 796 2252 2251 +3 793 794 1558 +3 504 2601 2602 +3 2613 504 2602 +3 488 2239 2238 +3 1905 151 431 +3 1 1561 1560 +3 1 851 1561 +3 1561 851 488 +3 2063 2057 294 +3 1552 1562 789 +3 790 1521 1562 +3 506 1591 1592 +3 1550 1551 2586 +3 2586 2585 1568 +3 1570 1568 2587 +3 1550 1568 1555 +3 1555 1574 786 +3 1569 1548 1549 +3 2603 2613 2602 +3 1574 2606 786 +3 787 788 1821 +3 1554 421 1550 +3 1565 1566 507 +3 1566 1565 513 +3 1544 1566 513 +3 843 2588 1074 +3 2586 1568 1550 +3 982 1532 1594 +3 281 12 1938 +3 1567 1563 2584 +3 1570 1555 1568 +3 2491 1444 1474 +3 1555 1572 1574 +3 976 211 975 +3 2604 1575 2605 +3 507 1591 1590 +3 46 976 203 +3 516 505 515 +3 1573 2618 2608 +3 1582 1581 499 +3 684 2289 2288 +3 951 1232 1231 +3 1575 515 2605 +3 1790 505 1789 +3 2319 2317 691 +3 2287 2282 2283 +3 1779 2753 1800 +3 572 1779 1800 +3 206 205 59 +3 1577 2612 2614 +3 1768 1577 2614 +3 2611 2601 504 +3 69 129 125 +3 1583 1582 938 +3 2742 277 64 +3 1580 505 516 +3 218 1995 923 +3 1581 1768 499 +3 1708 2341 1707 +3 2659 785 2661 +3 1772 240 526 +3 240 527 526 +3 2170 1045 2166 +3 1064 871 2505 +3 238 555 543 +3 1230 949 1228 +3 876 2158 2157 +3 1809 1810 222 +3 862 1809 222 +3 979 972 2097 +3 972 2098 2097 +3 972 978 2098 +3 1817 1739 183 +3 2287 2283 2284 +3 1050 2172 1051 +3 2164 2160 2167 +3 2160 1048 2167 +3 848 1900 1899 +3 2357 2353 614 +3 2342 2102 51 +3 2342 156 2102 +3 183 949 1817 +3 578 1948 1947 +3 1620 714 3 +3 446 2326 1457 +3 2671 2674 580 +3 1709 2747 56 +3 1121 2677 1120 +3 517 1580 1579 +3 1585 2772 2771 +3 1300 1302 1319 +3 1707 1583 572 +3 1789 505 2268 +3 1781 1583 938 +3 543 545 212 +3 1200 1224 1209 +3 1563 1565 1589 +3 507 1566 1592 +3 1590 1589 507 +3 1571 1589 1590 +3 786 1554 1555 +3 507 1592 1591 +3 1554 786 1556 +3 604 788 787 +3 1554 1556 1559 +3 1556 1560 1559 +3 1588 1571 1593 +3 1590 1593 1571 +3 1590 16 1593 +3 2217 2216 1949 +3 1527 1594 1526 +3 1594 1523 1526 +3 2400 2401 2402 +3 2324 2323 2325 +3 1132 639 2150 +3 1978 1598 940 +3 1598 1979 940 +3 1980 1979 1598 +3 926 1683 1681 +3 1838 458 1020 +3 1156 1292 2301 +3 940 1976 1975 +3 1598 1599 27 +3 869 1669 1670 +3 2597 1595 2599 +3 2643 31 1682 +3 1828 1825 1826 +3 1829 28 1830 +3 1113 1957 1958 +3 1963 1954 1118 +3 2559 42 1831 +3 1599 1598 1597 +3 101 2550 2549 +3 2264 1287 1286 +3 1801 1272 2264 +3 1277 1286 1287 +3 1294 1158 1295 +3 1611 1155 1154 +3 2194 2227 2226 +3 206 58 205 +3 58 2490 205 +3 966 1605 1606 +3 966 1606 1155 +3 2087 2086 968 +3 2086 974 968 +3 2084 2083 919 +3 311 153 307 +3 958 471 1609 +3 232 958 1609 +3 1013 2207 1119 +3 1604 966 1601 +3 966 1602 1601 +3 2227 1005 2192 +3 1607 1152 1309 +3 1152 1607 1605 +3 1606 1605 1607 +3 143 1002 1491 +3 1609 1312 232 +3 470 1312 1609 +3 1311 1312 470 +3 1013 2261 2260 +3 1617 127 139 +3 2008 883 2007 +3 503 2610 506 +3 1614 1616 1615 +3 125 1615 69 +3 1615 125 1618 +3 1764 1072 1763 +3 2774 136 379 +3 694 2008 882 +3 2257 2008 694 +3 2015 2033 2031 +3 73 1617 139 +3 73 132 131 +3 2214 2534 2216 +3 2534 1949 2216 +3 130 73 131 +3 130 1617 73 +3 129 69 130 +3 71 129 130 +3 2002 248 2003 +3 2669 1948 578 +3 2668 2669 578 +3 126 1614 1615 +3 217 554 916 +3 318 321 109 +3 141 1499 2054 +3 2534 2219 2228 +3 961 2534 2228 +3 2284 2283 3 +3 689 1092 2466 +3 2465 690 1091 +3 1634 1633 640 +3 677 676 1633 +3 676 677 636 +3 1632 640 1633 +3 472 1612 2260 +3 2544 2545 2546 +3 2363 2544 2546 +3 723 1628 642 +3 721 642 1629 +3 1630 386 453 +3 1624 1623 716 +3 1102 2463 2462 +3 2458 1102 2462 +3 1173 2543 2363 +3 962 1101 1100 +3 1101 2462 1100 +3 963 68 254 +3 722 1131 642 +3 1623 723 642 +3 1103 2459 2458 +3 2459 1102 2458 +3 1461 1630 454 +3 2579 830 2236 +3 2067 299 2065 +3 2070 2068 110 +3 2068 2070 303 +3 2067 2065 110 +3 2691 300 2692 +3 2446 45 2445 +3 152 2070 320 +3 320 2070 110 +3 111 2691 2692 +3 2362 2363 1172 +3 678 1634 640 +3 1621 1622 1623 +3 2183 2260 1612 +3 2257 2259 1919 +3 2257 694 2259 +3 438 1635 1405 +3 2667 2671 700 +3 1920 2259 694 +3 1413 1414 1412 +3 1635 438 1430 +3 1435 1434 2714 +3 1324 1323 401 +3 1650 1324 401 +3 1145 393 807 +3 711 1641 710 +3 1291 1159 1652 +3 502 938 499 +3 401 1646 1648 +3 1649 401 1648 +3 1647 608 1646 +3 2559 62 167 +3 2634 802 2626 +3 1647 1646 1323 +3 1648 1646 1643 +3 608 612 583 +3 1644 608 583 +3 1642 1643 584 +3 585 2634 2626 +3 2627 2629 2632 +3 585 2627 2632 +3 586 1649 2626 +3 802 586 2626 +3 1647 394 612 +3 612 608 1647 +3 394 1647 609 +3 2489 1036 1035 +3 613 2348 2349 +3 609 1647 1323 +3 401 1649 1650 +3 1654 1656 1276 +3 1649 586 1651 +3 1649 1651 1650 +3 2564 1735 1742 +3 2408 1011 2407 +3 1277 1653 1286 +3 1275 1276 1656 +3 1159 1654 1652 +3 1652 1654 1276 +3 157 479 120 +3 159 157 120 +3 479 121 120 +3 2101 82 158 +3 1293 1294 1288 +3 1660 1659 1278 +3 1899 496 1770 +3 1654 1278 1656 +3 1655 1660 1278 +3 1970 1969 1275 +3 1329 588 760 +3 2100 159 2101 +3 159 52 2101 +3 1486 82 2101 +3 2117 227 2114 +3 1294 2103 1158 +3 1662 1454 387 +3 1474 1661 1470 +3 2124 1304 2122 +3 1660 1655 1292 +3 1470 1662 387 +3 1663 1378 1377 +3 1378 1663 764 +3 2425 2422 759 +3 2425 757 2422 +3 1664 891 1665 +3 891 1664 1663 +3 1664 764 1663 +3 2421 2417 404 +3 889 884 764 +3 2417 2421 2426 +3 1667 1668 1666 +3 1668 1667 859 +3 1814 1812 863 +3 1666 861 1036 +3 2686 1109 867 +3 1029 861 1028 +3 1668 859 218 +3 1371 1365 775 +3 861 1668 1028 +3 1677 2175 2174 +3 2176 1677 2174 +3 1670 1669 1039 +3 1044 1675 1674 +3 1675 1043 1674 +3 958 232 2179 +3 46 550 976 +3 1675 1050 1034 +3 1845 1241 1846 +3 2162 1671 870 +3 872 1049 1056 +3 1671 1670 1039 +3 2295 1059 2296 +3 1059 2295 876 +3 1095 2502 702 +3 1722 1721 154 +3 874 1675 1034 +3 2174 2173 1044 +3 2176 2174 1044 +3 1122 1123 1943 +3 1037 874 1032 +3 1045 1670 1671 +3 874 1043 1675 +3 1834 262 1753 +3 1670 1676 869 +3 1670 1045 1676 +3 2335 946 947 +3 946 945 947 +3 201 4 1679 +3 1673 1678 1674 +3 2018 116 2023 +3 519 1774 2702 +3 662 663 606 +3 2664 692 2666 +3 1890 90 334 +3 1687 660 681 +3 1729 197 323 +3 2568 2567 343 +3 387 1458 2764 +3 2643 1682 9 +3 200 199 201 +3 2343 200 201 +3 119 118 122 +3 250 941 85 +3 250 1976 941 +3 1999 1998 253 +3 681 660 682 +3 2647 195 2648 +3 2008 2007 882 +3 175 1683 926 +3 927 175 926 +3 1686 1684 1682 +3 32 2035 2034 +3 32 2036 2035 +3 1614 1698 2050 +3 1595 2598 2599 +3 1683 1686 1681 +3 1866 1262 1873 +3 1262 1858 1873 +3 2017 2023 935 +3 1848 1250 1244 +3 1400 2527 1408 +3 1923 881 648 +3 679 632 1688 +3 679 667 632 +3 679 1688 1687 +3 675 679 1687 +3 603 1068 1069 +3 1688 632 707 +3 1852 1252 1850 +3 1882 2442 2437 +3 1861 1860 1246 +3 1693 1519 1517 +3 1519 1208 1517 +3 1220 1693 1517 +3 524 1691 1693 +3 1772 1771 521 +3 938 1782 1781 +3 1696 1318 375 +3 1657 1694 1279 +3 1657 228 1694 +3 1658 228 1657 +3 1281 1694 228 +3 1696 1695 1281 +3 1059 876 2156 +3 1326 1085 1697 +3 1096 703 1095 +3 1698 338 339 +3 1698 1395 338 +3 126 1395 1698 +3 126 1698 1614 +3 1706 1705 508 +3 1300 370 2369 +3 1436 1700 1135 +3 1700 1436 1418 +3 1582 1702 1586 +3 1581 1582 1586 +3 2007 893 765 +3 883 893 2007 +3 1418 2623 2620 +3 952 815 1183 +3 1817 950 1739 +3 2269 2275 1325 +3 2275 2269 2270 +3 1679 202 2455 +3 1790 1788 501 +3 1583 1703 1702 +3 379 378 2774 +3 2738 244 2737 +3 1711 172 1484 +3 1302 1711 1484 +3 826 2127 822 +3 2490 7 205 +3 2733 2734 79 +3 2474 2473 2472 +3 2471 2474 2472 +3 833 2575 490 +3 833 2676 2575 +3 1214 1211 1212 +3 849 2736 852 +3 2729 531 532 +3 2341 1584 1704 +3 1707 2341 1704 +3 2266 1584 2339 +3 2341 2340 1584 +3 2280 2430 2293 +3 156 2100 2102 +3 2100 158 2102 +3 171 83 224 +3 171 1711 83 +3 243 822 2127 +3 821 822 243 +3 172 1711 1712 +3 82 1486 1487 +3 1732 997 996 +3 1721 1719 154 +3 1713 171 1714 +3 1719 64 154 +3 171 1712 1711 +3 1476 1285 2381 +3 701 2670 708 +3 82 170 169 +3 272 98 273 +3 17 269 1715 +3 823 821 478 +3 155 1720 1717 +3 2448 1027 2075 +3 2447 2446 2448 +3 1717 263 1716 +3 263 1717 1718 +3 1719 1718 264 +3 1719 24 1718 +3 64 1719 264 +3 24 263 1718 +3 2075 7 2448 +3 2447 2448 7 +3 209 2083 2084 +3 38 209 2084 +3 266 1721 1723 +3 1721 266 24 +3 266 1723 87 +3 2645 2644 9 +3 1722 214 215 +3 1721 1722 1723 +3 1758 1759 340 +3 1714 1724 1713 +3 1724 1714 1716 +3 1716 170 1724 +3 1097 698 1725 +3 2675 1637 1638 +3 1637 1639 582 +3 576 1151 1223 +3 576 2472 1151 +3 994 2036 2042 +3 2010 1639 699 +3 2010 2009 1639 +3 1639 1640 699 +3 1578 2603 503 +3 2170 1677 1045 +3 2172 2171 1047 +3 2038 2024 2037 +3 261 259 1752 +3 820 243 844 +3 1729 1730 37 +3 323 1730 1729 +3 325 1333 328 +3 1333 325 1734 +3 1736 1731 325 +3 1733 1731 323 +3 1744 323 99 +3 2230 2574 1520 +3 792 2230 1520 +3 2564 2565 2573 +3 2565 2564 345 +3 325 1738 1737 +3 1743 326 340 +3 93 917 918 +3 260 341 1754 +3 1743 324 1744 +3 36 1738 1739 +3 1730 1732 37 +3 37 1732 996 +3 38 344 215 +3 325 328 1738 +3 1733 324 1735 +3 1126 337 332 +3 2573 2565 2569 +3 1741 1331 216 +3 1041 2512 875 +3 213 1333 1334 +3 36 997 1737 +3 340 1745 1742 +3 345 1745 1746 +3 1741 1332 1331 +3 2746 2750 2748 +3 2750 2746 1780 +3 1737 1738 36 +3 1070 1393 631 +3 1392 692 1818 +3 1891 2 494 +3 1889 335 1890 +3 355 1891 494 +3 36 1739 950 +3 1741 328 1332 +3 1072 226 1763 +3 1739 1738 328 +3 1740 1739 328 +3 1741 1740 328 +3 916 216 918 +3 216 1740 1741 +3 2142 144 2651 +3 1742 1743 340 +3 326 1743 1744 +3 99 326 1744 +3 327 326 99 +3 1754 337 77 +3 1734 325 2570 +3 2569 88 2571 +3 2570 2569 2571 +3 1750 343 2567 +3 342 1750 2567 +3 460 1421 1399 +3 1751 259 65 +3 260 1749 1748 +3 342 1748 1749 +3 1749 65 1750 +3 1750 342 1749 +3 2431 2430 2291 +3 327 99 351 +3 77 261 1752 +3 260 1752 1751 +3 341 1753 1754 +3 1753 1755 1754 +3 347 330 346 +3 1758 329 1757 +3 331 1141 1490 +3 1756 331 1490 +3 1141 89 1490 +3 1491 1490 89 +3 1492 1491 89 +3 1141 1140 89 +3 1753 262 1755 +3 948 330 181 +3 948 1140 330 +3 1850 1849 1244 +3 1850 1252 1849 +3 2020 2030 2029 +3 2030 2019 2029 +3 2018 2023 2017 +3 262 1759 1758 +3 262 1758 1757 +3 948 333 1140 +3 33 1762 327 +3 1762 326 327 +3 1762 33 1761 +3 329 1762 1761 +3 1613 475 2116 +3 1072 1073 226 +3 472 1116 1613 +3 40 103 104 +3 1115 292 1072 +3 4 931 1766 +3 1765 1072 1764 +3 1612 472 1613 +3 4 1766 202 +3 927 1685 202 +3 1766 927 202 +3 129 70 125 +3 931 4 932 +3 929 1767 928 +3 121 70 129 +3 1777 571 570 +3 549 92 967 +3 517 1769 1581 +3 1586 517 1581 +3 1769 517 1579 +3 1776 1777 570 +3 2658 784 2704 +3 2662 178 2707 +3 242 2768 1130 +3 496 521 1770 +3 1327 590 2269 +3 1353 569 527 +3 1773 1772 521 +3 1772 1773 240 +3 163 1894 19 +3 1774 525 1775 +3 1710 2747 1709 +3 530 239 526 +3 1786 518 501 +3 1208 1519 2738 +3 571 1777 1778 +3 2751 1710 2336 +3 1787 1788 1798 +3 2752 2749 2751 +3 1800 2752 2751 +3 571 2754 2755 +3 610 394 609 +3 502 500 1218 +3 938 502 1782 +3 1327 2269 1325 +3 2657 2658 466 +3 1776 1783 1777 +3 1505 2657 466 +3 1518 1208 2740 +3 1775 2517 523 +3 523 1799 1775 +3 382 383 361 +3 1211 2737 244 +3 1774 1775 1799 +3 1786 1787 519 +3 1789 2268 2267 +3 2336 2337 1708 +3 505 1790 498 +3 1580 2268 505 +3 501 498 1790 +3 502 520 1782 +3 521 496 1791 +3 1705 1706 2773 +3 1791 1792 518 +3 1791 496 1792 +3 2333 2520 2523 +3 2517 1775 2516 +3 2517 2516 1783 +3 2519 2332 1409 +3 2738 1519 244 +3 313 2371 2372 +3 2266 1709 2267 +3 1780 1795 1796 +3 2523 1410 2524 +3 1793 1794 1778 +3 1777 1793 1778 +3 1798 1774 519 +3 1787 1798 519 +3 1795 1784 1796 +3 56 1797 1788 +3 526 239 522 +3 525 1797 1796 +3 1796 1797 1780 +3 2752 2753 939 +3 1788 1797 1798 +3 525 1798 1797 +3 313 372 2371 +3 2262 2263 1272 +3 1272 1803 2262 +3 1274 1269 367 +3 372 2370 2371 +3 661 605 1804 +3 661 685 605 +3 2419 1188 763 +3 2611 1576 2601 +3 1804 605 633 +3 605 634 633 +3 633 1806 1805 +3 643 1805 1806 +3 643 1806 602 +3 1384 643 602 +3 688 962 1092 +3 1824 962 688 +3 1383 643 1384 +3 606 1808 1807 +3 1125 1824 656 +3 1809 862 1811 +3 708 2672 2630 +3 652 759 2665 +3 652 1925 757 +3 699 1640 2667 +3 980 1619 1810 +3 1810 1619 546 +3 104 2342 51 +3 218 923 1028 +3 219 1811 1812 +3 1816 972 979 +3 1054 1055 1053 +3 2327 2328 1407 +3 474 2182 2190 +3 1230 950 1817 +3 2289 1503 2288 +3 1508 559 1507 +3 1082 1823 687 +3 42 8 1825 +3 1080 95 1081 +3 689 1820 688 +3 1819 688 1820 +3 94 577 576 +3 634 605 697 +3 2656 634 697 +3 634 2656 2654 +3 664 1385 1386 +3 601 1821 788 +3 962 1824 1125 +3 1955 1952 1117 +3 1827 80 1599 +3 1979 941 1976 +3 80 57 40 +3 1827 57 80 +3 1831 1829 1832 +3 1831 62 2559 +3 1745 1834 1746 +3 1826 1827 28 +3 1827 1599 28 +3 292 1115 1957 +3 1827 1826 57 +3 1832 62 1831 +3 42 1828 1829 +3 1828 28 1829 +3 1828 1826 28 +3 1415 2621 1429 +3 2622 2621 1415 +3 1759 1745 340 +3 1745 1759 1834 +3 1888 1889 49 +3 1595 1975 1976 +3 57 107 40 +3 42 1829 1831 +3 100 2561 2560 +3 8 2561 100 +3 2550 100 2560 +3 102 29 103 +3 1832 1833 43 +3 78 203 1027 +3 2335 49 948 +3 2334 2335 948 +3 946 2335 2334 +3 1838 1020 1239 +3 1837 1838 1239 +3 535 1887 1888 +3 738 457 739 +3 1839 1840 1242 +3 458 1842 1022 +3 1844 1241 1845 +3 1844 1843 1241 +3 1841 1255 1023 +3 1229 423 985 +3 2494 1240 2493 +3 1240 1843 2493 +3 1836 1240 2494 +3 2494 2493 1837 +3 1849 1848 1244 +3 1847 1848 1251 +3 1245 1855 1260 +3 1247 1427 1869 +3 1844 1845 1840 +3 1843 1240 739 +3 1241 1843 739 +3 739 1846 1241 +3 1245 1252 1852 +3 78 552 203 +3 2020 2022 932 +3 347 423 181 +3 2139 2146 362 +3 2146 2138 362 +3 1849 1252 1251 +3 1851 1850 1244 +3 1851 1689 1850 +3 1254 1253 1851 +3 1253 1689 1851 +3 1847 1250 1848 +3 1260 1855 54 +3 1245 1853 1854 +3 1853 1245 1852 +3 1855 1245 1854 +3 1869 1876 1248 +3 333 334 1492 +3 1139 1140 1141 +3 330 1140 1139 +3 1253 1862 1261 +3 1862 1246 1261 +3 1857 1854 1853 +3 1856 1857 1853 +3 1852 1689 1853 +3 1261 1857 1856 +3 1246 1858 1261 +3 1858 1857 1261 +3 1266 1247 1868 +3 1253 1261 1856 +3 1864 1264 1863 +3 769 1909 895 +3 1858 1859 1873 +3 25 2053 2052 +3 1859 1246 1860 +3 1249 1862 456 +3 1249 1861 1862 +3 895 1907 1906 +3 436 1461 454 +3 1266 1868 1867 +3 1863 1859 1860 +3 1266 1863 1860 +3 1864 1863 1867 +3 1266 1867 1863 +3 1866 1264 1865 +3 1859 1863 1264 +3 349 139 908 +3 1868 1248 1870 +3 2051 2052 140 +3 1872 1396 443 +3 1872 1865 1265 +3 1865 1872 443 +3 1872 1265 1871 +3 1871 1396 1872 +3 1264 1866 1873 +3 1873 1859 1264 +3 1858 1262 1857 +3 1875 1876 1399 +3 1248 1874 1870 +3 1876 460 1399 +3 460 1876 1869 +3 2440 2441 1879 +3 1874 1877 1871 +3 1398 1877 1874 +3 1877 1396 1871 +3 318 1163 321 +3 1495 2055 143 +3 1398 1874 1875 +3 1874 1248 1875 +3 1879 2439 2440 +3 1875 1423 1882 +3 1398 1875 1882 +3 1879 1397 1880 +3 1878 1879 1880 +3 1869 1427 460 +3 442 1397 1879 +3 1878 1396 1877 +3 45 2447 1935 +3 2438 189 2437 +3 1881 1398 1882 +3 1883 365 752 +3 133 1884 1883 +3 1884 364 1883 +3 134 364 1884 +3 198 2043 2049 +3 1698 339 2050 +3 2498 2499 1042 +3 1128 877 2498 +3 877 2499 2498 +3 960 2677 1164 +3 2641 2640 1886 +3 1885 194 35 +3 2027 198 2048 +3 2040 2024 2039 +3 214 1722 910 +3 539 2730 533 +3 857 223 856 +3 1887 448 335 +3 948 49 1889 +3 333 948 1889 +3 335 1889 1888 +3 1890 333 1889 +3 334 333 1890 +3 335 90 1890 +3 1895 1897 19 +3 101 2549 2548 +3 532 2735 2730 +3 1006 2204 2203 +3 164 71 165 +3 121 71 164 +3 119 70 121 +3 121 129 71 +3 479 20 119 +3 134 1884 1896 +3 1884 468 1896 +3 468 1884 133 +3 19 1894 1895 +3 1423 2442 1882 +3 1423 2443 2442 +3 177 531 2721 +3 531 177 567 +3 160 19 1479 +3 134 132 364 +3 1488 1481 369 +3 1770 848 1899 +3 850 495 851 +3 1903 241 849 +3 241 1903 848 +3 1901 848 1903 +3 1900 1901 391 +3 1902 1904 433 +3 1902 1901 1904 +3 86 1985 2245 +3 86 1987 1985 +3 148 485 1902 +3 497 850 851 +3 495 488 851 +3 2648 2646 2647 +3 1903 1904 1901 +3 1904 1905 433 +3 793 1561 794 +3 849 1905 1904 +3 849 151 1905 +3 849 852 151 +3 1137 187 445 +3 883 894 893 +3 893 894 771 +3 894 1906 771 +3 769 895 1375 +3 894 895 1906 +3 1375 895 894 +3 1178 768 1908 +3 1908 768 1907 +3 1249 1247 1861 +3 1909 772 1178 +3 1488 2720 1477 +3 191 2716 461 +3 1929 650 1928 +3 1933 650 1929 +3 1394 1384 645 +3 2424 763 591 +3 2341 1708 2340 +3 649 630 1914 +3 630 649 1918 +3 758 1925 1928 +3 671 666 667 +3 2260 474 2191 +3 649 891 1921 +3 1924 1923 648 +3 630 1920 1917 +3 1921 1919 649 +3 474 2190 2191 +3 2262 1318 1696 +3 764 884 885 +3 884 881 882 +3 885 884 882 +3 762 1917 1920 +3 934 2018 2017 +3 1026 2577 2576 +3 1916 1917 1922 +3 1917 762 1922 +3 630 1917 1916 +3 814 815 409 +3 1188 1187 696 +3 1923 1922 762 +3 2019 116 2018 +3 1700 2622 1419 +3 1923 1924 758 +3 1913 1934 1912 +3 1916 1927 1930 +3 1927 1928 1930 +3 1931 1930 650 +3 1930 1928 650 +3 1390 1933 1391 +3 1916 1930 1931 +3 1915 1916 1931 +3 1407 1400 1408 +3 2528 2527 1400 +3 1933 1929 1391 +3 595 665 1071 +3 1931 1934 1915 +3 1932 1933 629 +3 1932 629 1912 +3 1913 1912 646 +3 112 45 1935 +3 1932 650 1933 +3 2621 1418 2620 +3 1913 1915 1934 +3 1936 13 1937 +3 1937 13 1938 +3 1967 2491 1443 +3 1473 1967 1443 +3 108 1941 1940 +3 1942 293 1941 +3 108 1942 1941 +3 1940 1939 108 +3 2247 2246 1985 +3 2278 1064 2503 +3 1527 983 982 +3 1944 1943 702 +3 1944 1945 1943 +3 2670 701 1948 +3 2503 2276 2278 +3 1335 289 959 +3 959 289 960 +3 2533 139 2532 +3 2222 2761 2225 +3 1625 2325 2323 +3 703 1097 1947 +3 1946 1947 1948 +3 2576 2577 1122 +3 1062 2511 1128 +3 1944 1946 1945 +3 1946 704 1945 +3 1172 2363 2546 +3 635 678 640 +3 701 704 1946 +3 449 2326 446 +3 1955 1953 1952 +3 1164 959 960 +3 1120 1949 1121 +3 1949 961 1121 +3 1117 1952 1120 +3 1115 1114 1958 +3 292 1956 1117 +3 2186 1004 2223 +3 2197 1005 2193 +3 1012 2199 1011 +3 1113 1964 1956 +3 2221 2188 2220 +3 1111 290 1954 +3 1953 1954 290 +3 2144 359 358 +3 359 2652 358 +3 1114 350 1959 +3 1111 1954 1112 +3 1962 1965 1960 +3 1965 1962 1959 +3 1956 292 1957 +3 2226 2227 2678 +3 1964 1113 1962 +3 1964 1962 1963 +3 1956 1964 1955 +3 1965 1959 350 +3 42 15 8 +3 1959 1113 1958 +3 1112 1960 1961 +3 2561 15 2558 +3 1960 350 1961 +3 166 2558 2557 +3 2561 2558 166 +3 8 15 2561 +3 1963 1118 1964 +3 388 1451 1452 +3 414 1446 1966 +3 1445 1966 1446 +3 1652 1276 1968 +3 1653 1652 1968 +3 1201 1199 2353 +3 1201 1202 1199 +3 1969 1276 1275 +3 373 1653 1969 +3 1653 373 1286 +3 1653 1968 1969 +3 1968 1276 1969 +3 2557 2554 2553 +3 1286 373 1274 +3 348 63 2556 +3 1971 348 2556 +3 31 200 2343 +3 2457 31 2343 +3 2596 1595 2597 +3 62 1832 43 +3 681 2150 639 +3 1977 940 1975 +3 1977 1974 1596 +3 1977 1975 1974 +3 1596 43 1833 +3 2640 2641 18 +3 1596 1974 1973 +3 1975 1595 1974 +3 1596 1973 43 +3 1980 941 1979 +3 1982 1981 942 +3 1981 1982 1980 +3 1978 940 1977 +3 1597 1978 1977 +3 1833 1597 1596 +3 1830 1597 1833 +3 2247 85 2246 +3 942 2246 1982 +3 2245 2246 942 +3 2648 195 995 +3 18 1885 2640 +3 1885 18 2645 +3 169 1986 1984 +3 1983 169 1984 +3 420 2251 2252 +3 685 680 605 +3 1991 904 322 +3 1194 1193 322 +3 1193 1989 322 +3 80 81 1981 +3 80 1981 27 +3 1981 1980 27 +3 1982 941 1980 +3 2247 128 965 +3 85 941 1982 +3 1988 65 258 +3 2697 2698 301 +3 897 2698 2697 +3 1988 258 128 +3 1981 1983 942 +3 1981 81 1983 +3 965 85 2247 +3 1984 942 1983 +3 2233 795 2254 +3 169 81 168 +3 81 169 1983 +3 265 1502 86 +3 1502 1987 86 +3 169 170 1986 +3 1988 128 1987 +3 197 1728 1684 +3 1750 65 1988 +3 267 1750 1988 +3 87 1750 267 +3 267 1988 1987 +3 796 2250 2249 +3 799 2249 2250 +3 1992 1379 886 +3 588 1329 2273 +3 2270 587 1326 +3 1573 2608 2609 +3 1328 1327 1325 +3 1992 892 1379 +3 2611 2615 1994 +3 887 403 1993 +3 892 1992 403 +3 1992 1993 403 +3 2298 2619 290 +3 2619 2298 1951 +3 218 1997 1995 +3 1106 2453 5 +3 1996 1997 924 +3 1766 1767 927 +3 2454 1215 1692 +3 2454 1216 1225 +3 1215 2454 1225 +3 524 2454 1692 +3 2454 524 1216 +3 963 251 252 +3 964 907 963 +3 348 1998 2000 +3 247 348 2001 +3 63 348 247 +3 348 2000 2001 +3 2001 2000 41 +3 2001 2003 247 +3 1619 92 547 +3 2006 517 1586 +3 2005 2004 60 +3 247 2004 2005 +3 2004 248 60 +3 122 70 119 +3 248 2004 2003 +3 517 2006 1706 +3 2772 1585 2773 +3 2033 2017 935 +3 1367 1366 888 +3 2528 1416 2527 +3 2019 2018 934 +3 243 820 821 +3 1807 1806 633 +3 2345 2346 1202 +3 2631 2628 1638 +3 2016 2033 2034 +3 877 2500 2499 +3 923 2453 1106 +3 1040 2508 2506 +3 196 2027 2048 +3 1885 2027 196 +3 2048 198 2049 +3 2026 115 196 +3 35 2027 1885 +3 2044 2045 2026 +3 2045 2044 2025 +3 199 2047 201 +3 2016 934 2017 +3 2034 2033 2015 +3 2043 2038 2025 +3 2043 2039 2038 +3 96 987 986 +3 96 992 988 +3 1081 662 606 +3 933 2019 934 +3 2021 932 937 +3 2020 116 2030 +3 116 2019 2030 +3 2041 198 2028 +3 1679 2343 201 +3 1679 2457 2343 +3 2040 2039 2041 +3 61 993 994 +3 2042 2036 32 +3 202 1685 2455 +3 1699 2278 1063 +3 1998 1971 1972 +3 2044 2049 2043 +3 2041 2039 198 +3 1042 2500 1041 +3 2048 2026 196 +3 2029 2022 2020 +3 2022 2029 933 +3 2029 2019 933 +3 1503 1504 686 +3 2279 1503 686 +3 933 928 2022 +3 2014 2031 935 +3 2031 2033 935 +3 2035 2016 2034 +3 2035 988 2016 +3 2513 2507 1031 +3 2161 2160 2164 +3 2013 936 2014 +3 988 992 2016 +3 2511 877 1128 +3 1110 2296 875 +3 2512 1110 875 +3 2040 2042 32 +3 2015 2032 2024 +3 2032 2037 2024 +3 2032 936 2037 +3 2502 1944 702 +3 1946 1944 2530 +3 2451 920 2450 +3 994 993 2036 +3 2015 2040 32 +3 32 2034 2015 +3 2040 2015 2024 +3 993 61 1001 +3 2037 936 2025 +3 2046 115 2045 +3 198 2039 2043 +3 868 1110 2512 +3 2042 2040 2041 +3 936 2045 2025 +3 1039 1063 1062 +3 1039 1062 870 +3 1669 1063 1039 +3 1601 1157 2409 +3 1045 1671 2166 +3 4 201 2047 +3 937 2047 2046 +3 2046 2047 115 +3 287 2758 2759 +3 878 2161 2164 +3 199 115 2047 +3 932 2047 937 +3 4 2047 932 +3 2309 2313 1500 +3 428 2313 2309 +3 2310 1500 2313 +3 26 1940 2058 +3 1940 294 2058 +3 2308 23 2311 +3 791 1531 1535 +3 113 2060 298 +3 2060 26 2059 +3 26 2061 1940 +3 1940 2061 1939 +3 2061 112 1939 +3 2062 112 2061 +3 427 112 2062 +3 112 427 45 +3 113 1500 2310 +3 2310 2062 113 +3 307 152 320 +3 2069 22 299 +3 299 295 2065 +3 2068 2069 2067 +3 2069 299 2067 +3 2068 2067 110 +3 343 215 344 +3 975 91 977 +3 2085 91 975 +3 205 204 2071 +3 479 157 20 +3 59 208 214 +3 208 59 2071 +3 22 1501 298 +3 1501 113 298 +3 152 303 2070 +3 2082 210 2078 +3 210 2082 2086 +3 2083 2079 919 +3 203 2074 1027 +3 204 2074 2073 +3 2075 2074 204 +3 1027 2074 2075 +3 2446 2445 1162 +3 2071 59 205 +3 2075 204 205 +3 7 2075 205 +3 24 1719 1721 +3 1422 1421 2449 +3 1421 1422 1399 +3 2080 2079 210 +3 214 2081 38 +3 549 211 548 +3 2081 209 38 +3 220 922 2080 +3 2078 2079 2083 +3 208 2077 2081 +3 2076 2077 208 +3 220 2091 970 +3 2078 2083 209 +3 2077 2078 209 +3 203 976 977 +3 157 156 20 +3 156 157 2100 +3 204 2072 2071 +3 2085 2082 91 +3 1317 1280 1156 +3 210 2086 2087 +3 2087 2088 2080 +3 2088 2087 968 +3 2087 2080 210 +3 549 967 2089 +3 968 549 2089 +3 968 2089 2088 +3 969 2090 967 +3 969 2091 2090 +3 2091 220 2090 +3 970 2093 971 +3 2072 208 2071 +3 206 59 207 +3 2095 92 981 +3 2097 221 979 +3 967 92 2095 +3 969 2094 2092 +3 11 58 206 +3 2095 981 221 +3 980 981 1619 +3 221 2094 2095 +3 969 2095 2094 +3 2686 2294 865 +3 2085 2099 2082 +3 2086 2099 974 +3 2082 2099 2086 +3 1317 225 2105 +3 1293 2103 1294 +3 2102 158 51 +3 2103 1293 1280 +3 2104 2103 1280 +3 1280 1317 2104 +3 1317 2105 2104 +3 1296 231 1295 +3 1297 2109 1313 +3 2108 229 2109 +3 1296 2108 2109 +3 2113 2112 1299 +3 2124 2125 224 +3 2110 1298 2106 +3 2105 2110 2106 +3 2108 2113 229 +3 1298 2112 2113 +3 2111 2112 1298 +3 1297 1296 2109 +3 231 1296 1297 +3 2106 2104 2105 +3 2105 1301 2110 +3 2123 2115 2116 +3 232 1312 285 +3 1298 2113 2108 +3 2124 2118 1304 +3 2118 2124 1306 +3 84 51 168 +3 227 2117 2118 +3 1301 2115 2114 +3 226 1073 2121 +3 1303 2119 2117 +3 2119 2118 2117 +3 2119 1304 2118 +3 1156 1280 1660 +3 1303 226 2119 +3 1303 1763 226 +3 2105 225 2116 +3 2105 2116 1301 +3 225 1613 2116 +3 1073 289 2121 +3 1336 289 1335 +3 2117 2115 1303 +3 297 2120 2121 +3 297 2122 2120 +3 2126 1715 171 +3 224 1306 2124 +3 82 169 168 +3 2125 1715 2126 +3 1714 171 1715 +3 171 224 2126 +3 2682 489 2681 +3 828 2682 826 +3 395 828 826 +3 826 2682 2127 +3 487 845 833 +3 1467 2148 481 +3 2148 2147 481 +3 2143 2139 362 +3 2135 2134 142 +3 787 2653 2656 +3 2502 2530 1944 +3 2502 703 2530 +3 302 359 896 +3 2700 302 896 +3 2537 1173 2362 +3 1891 2132 354 +3 1891 356 2132 +3 352 2134 2135 +3 354 2132 2133 +3 1508 1507 179 +3 2650 2651 385 +3 2133 2134 352 +3 2524 1411 2523 +3 2320 691 2315 +3 357 2129 2138 +3 1499 1498 142 +3 147 2306 429 +3 353 352 2135 +3 357 2138 2137 +3 2129 114 2138 +3 898 145 363 +3 2147 2130 2140 +3 155 2149 1720 +3 2149 268 1720 +3 300 2691 2693 +3 2149 155 1715 +3 2142 2133 144 +3 385 44 384 +3 2688 904 2697 +3 411 621 955 +3 2143 363 2139 +3 363 145 2139 +3 114 801 362 +3 242 825 2768 +3 2143 2304 146 +3 626 606 1807 +3 2689 905 2688 +3 301 2689 2688 +3 1528 1529 792 +3 2140 481 2147 +3 1715 269 2149 +3 268 269 97 +3 1132 2150 2151 +3 2150 681 2151 +3 659 1132 2151 +3 2152 1504 684 +3 2153 2152 684 +3 691 2317 2316 +3 2151 681 682 +3 2152 2151 682 +3 2283 2285 3 +3 1161 2285 2283 +3 714 2284 3 +3 659 2152 2153 +3 659 2151 2152 +3 1621 1623 1624 +3 1019 716 1131 +3 985 989 2154 +3 96 2154 989 +3 182 985 986 +3 2157 2156 876 +3 1060 870 1129 +3 293 109 2063 +3 1058 870 2155 +3 867 2685 2686 +3 2215 2216 2217 +3 287 1011 2194 +3 1059 2156 2155 +3 878 1671 2162 +3 2158 876 1049 +3 2166 1671 878 +3 872 1047 1048 +3 2160 1057 2159 +3 1110 865 2296 +3 2162 870 1058 +3 2169 2171 879 +3 2168 1048 1047 +3 2175 2169 879 +3 2175 2170 2169 +3 2176 1676 1677 +3 2170 1046 2169 +3 2279 2293 2282 +3 2293 1161 2282 +3 1044 2173 1675 +3 2173 1050 1675 +3 1201 2345 1202 +3 1204 1203 2351 +3 1201 2344 2345 +3 1318 2262 1803 +3 1678 1676 2178 +3 1676 1678 869 +3 2179 286 959 +3 286 1335 959 +3 2181 958 2180 +3 2180 958 2179 +3 959 2180 2179 +3 2222 1004 2760 +3 1898 19 1897 +3 2220 2188 2228 +3 2759 1961 287 +3 2266 2267 508 +3 2181 2182 958 +3 958 2183 471 +3 958 2182 2183 +3 2182 474 2183 +3 2698 898 301 +3 1420 2449 1400 +3 2449 2528 1400 +3 894 883 770 +3 2186 1005 1003 +3 2185 2186 1003 +3 2202 1009 2205 +3 966 1604 1605 +3 1008 1005 2197 +3 2188 1004 2187 +3 2184 2190 2182 +3 711 1094 2562 +3 711 1095 1094 +3 2181 2180 288 +3 2187 2185 288 +3 2195 2220 2229 +3 2198 1008 2197 +3 2230 792 1525 +3 2407 2406 2198 +3 1112 2759 1007 +3 2579 831 2679 +3 830 2579 2679 +3 1009 1013 2205 +3 2208 2207 2206 +3 2211 2213 2212 +3 2213 1114 2208 +3 2550 2560 2549 +3 2200 2212 2204 +3 2200 2211 2212 +3 2548 2549 245 +3 1316 2414 1604 +3 2412 1153 1308 +3 2549 166 245 +3 291 1119 2207 +3 2416 2427 1190 +3 1013 1009 2207 +3 291 2208 1114 +3 2208 291 2207 +3 1655 1159 1292 +3 2002 2003 2001 +3 1654 1159 1655 +3 2210 2209 2199 +3 1012 2210 2199 +3 1010 2204 2212 +3 2213 1010 2212 +3 8 100 102 +3 1012 1961 2211 +3 2298 2297 1951 +3 2298 1950 2297 +3 2215 2217 1950 +3 843 2577 1026 +3 296 270 2401 +3 1111 2195 2214 +3 2194 2193 2227 +3 1111 2214 2215 +3 2183 474 2260 +3 353 2135 75 +3 2757 2758 2189 +3 1111 1112 1007 +3 2195 1111 1007 +3 2214 2216 2215 +3 1336 1335 270 +3 2218 2217 1949 +3 1830 1832 1829 +3 2641 1886 199 +3 2232 2231 1558 +3 2222 2225 2223 +3 97 269 271 +3 18 2641 2642 +3 1335 286 2404 +3 961 2228 2188 +3 1520 799 1522 +3 2583 1179 774 +3 2232 2233 150 +3 795 2582 2234 +3 2581 2582 795 +3 2253 2254 2234 +3 1465 432 1466 +3 1465 1466 1464 +3 2243 806 407 +3 2583 1174 1179 +3 2679 2680 830 +3 148 1902 433 +3 2237 795 2233 +3 2233 2254 150 +3 2234 2235 796 +3 2249 2234 796 +3 1175 2583 774 +3 393 1145 589 +3 2467 2469 596 +3 2579 2581 2580 +3 2579 2236 2581 +3 1473 414 1967 +3 148 433 1465 +3 2581 795 2580 +3 392 2239 487 +3 828 829 489 +3 2239 488 495 +3 487 2239 495 +3 846 487 495 +3 2241 2242 808 +3 817 808 2242 +3 2243 407 2242 +3 2240 807 2241 +3 2241 408 2240 +3 2242 2244 817 +3 807 2240 1145 +3 797 2252 2235 +3 266 87 267 +3 2245 1984 86 +3 1524 799 2250 +3 2648 995 35 +3 194 2648 35 +3 2245 1985 2246 +3 1520 2248 799 +3 118 119 20 +3 2254 2253 150 +3 150 2231 2232 +3 1821 2467 596 +3 2579 392 831 +3 2576 1943 2578 +3 2237 2233 2232 +3 797 420 2252 +3 2249 2253 2234 +3 2255 1474 1444 +3 492 1474 2255 +3 2220 2228 2256 +3 2229 2220 2256 +3 2219 2256 2228 +3 2229 2256 2219 +3 2155 2156 1058 +3 2157 1058 2156 +3 272 6 1168 +3 285 98 2403 +3 2402 2404 2403 +3 2404 2402 270 +3 2198 2406 2405 +3 1006 2198 2405 +3 2535 1526 1522 +3 284 2402 2403 +3 2163 1058 2157 +3 1272 2263 2264 +3 2263 1287 2264 +3 572 1583 1781 +3 2340 2339 1584 +3 2340 2338 2339 +3 1708 2338 2340 +3 1584 2266 1705 +3 2266 508 1705 +3 533 2735 535 +3 2735 1887 535 +3 1993 1992 886 +3 2270 1326 2272 +3 405 2299 782 +3 704 2563 842 +3 2273 1328 1325 +3 1329 1328 2273 +3 761 1328 1329 +3 1063 2276 1062 +3 2507 1040 2506 +3 2507 2513 1040 +3 2500 877 2501 +3 2277 877 2511 +3 2510 2277 2511 +3 2503 1064 2504 +3 2365 718 2286 +3 2278 1600 1064 +3 2278 1699 1600 +3 718 2362 2286 +3 2366 2014 935 +3 2322 715 2323 +3 2284 2288 2287 +3 684 2290 2153 +3 1403 2328 2327 +3 2290 2288 2284 +3 382 361 1165 +3 1504 2289 684 +3 719 1160 686 +3 684 2288 2290 +3 1504 1503 2289 +3 1154 1606 2687 +3 1606 1607 2687 +3 2319 1621 1624 +3 2315 1620 2320 +3 2280 1160 2292 +3 2279 1160 2280 +3 686 1160 2279 +3 2279 2280 2293 +3 2011 579 2010 +3 2012 2011 2010 +3 2671 1640 2674 +3 1725 698 2012 +3 698 2011 2012 +3 698 1097 1096 +3 500 514 825 +3 2291 2292 2281 +3 2292 1160 2281 +3 2430 2431 2293 +3 2431 1161 2293 +3 2300 1327 782 +3 2300 590 1327 +3 2411 2410 1290 +3 2411 2409 2410 +3 1290 2413 1159 +3 1603 1156 2301 +3 1521 1525 791 +3 801 2303 2304 +3 801 429 2303 +3 146 2304 2303 +3 2304 2143 362 +3 801 2304 362 +3 2434 496 2436 +3 2062 2310 427 +3 2314 2310 2313 +3 2314 427 2310 +3 1500 1501 2302 +3 2311 23 2312 +3 427 2311 2312 +3 429 2306 2305 +3 428 2307 2308 +3 428 2314 2313 +3 2311 427 2314 +3 1496 75 1495 +3 45 427 2312 +3 2446 2447 45 +3 1027 2446 1162 +3 2449 1420 1422 +3 1420 1401 1422 +3 2529 1410 1428 +3 870 1062 1128 +3 2317 716 1019 +3 1624 716 2317 +3 2322 1622 1621 +3 2318 2153 2290 +3 2319 1624 2317 +3 1410 2523 2520 +3 1578 2613 2603 +3 513 1564 1537 +3 1173 2363 2362 +3 386 1457 2326 +3 2002 2001 41 +3 2763 2002 41 +3 2366 2013 2014 +3 2541 2542 717 +3 2544 2541 717 +3 2434 1792 496 +3 850 1792 2434 +3 2303 429 2433 +3 626 633 2655 +3 2324 2325 723 +3 1625 1627 2325 +3 2327 1407 1408 +3 386 449 1345 +3 386 2326 449 +3 2329 1406 2330 +3 2445 2312 1162 +3 2312 2445 45 +3 136 382 379 +3 136 381 382 +3 1836 2494 2495 +3 2496 1836 2495 +3 1226 946 2334 +3 2496 2495 1239 +3 136 376 381 +3 572 2336 1708 +3 2335 947 49 +3 506 1592 514 +3 514 500 506 +3 2195 2196 2220 +3 2344 1200 2345 +3 572 1800 2336 +3 287 2194 2758 +3 531 2729 257 +3 2750 56 2747 +3 2337 2338 1708 +3 2337 2265 2338 +3 2725 2728 538 +3 447 446 187 +3 1667 862 222 +3 156 2342 105 +3 51 84 104 +3 2607 2605 1572 +3 2342 104 105 +3 2462 2463 1100 +3 1971 43 1973 +3 2641 200 2642 +3 2752 939 2749 +3 1795 2746 2745 +3 2745 2744 1795 +3 2344 1224 1200 +3 2344 2352 1224 +3 1209 2347 1200 +3 2347 2346 1200 +3 615 400 1210 +3 2347 1209 2351 +3 2745 2746 939 +3 1778 2745 939 +3 2545 1625 1626 +3 2352 1201 2353 +3 617 615 2359 +3 617 419 615 +3 2356 2355 2354 +3 426 2355 2356 +3 2354 2353 1199 +3 777 779 2488 +3 779 777 776 +3 426 617 2355 +3 1197 426 2356 +3 426 1197 1198 +3 2355 617 2359 +3 2359 2358 614 +3 2357 614 2358 +3 2355 2359 614 +3 2354 2355 614 +3 718 2364 2536 +3 2537 718 2536 +3 2360 2539 2538 +3 2360 719 2539 +3 2360 2538 2537 +3 2536 2360 2537 +3 718 2537 2362 +3 717 2545 2544 +3 719 2360 2361 +3 719 2361 1160 +3 2364 2281 1160 +3 2361 2364 1160 +3 1313 2369 372 +3 2109 229 1313 +3 229 2369 1313 +3 1300 2369 229 +3 315 316 236 +3 2370 230 2371 +3 2367 1475 2373 +3 312 313 2372 +3 1284 2367 2373 +3 315 233 316 +3 2381 2373 1476 +3 2382 1285 2383 +3 2374 2375 1380 +3 1284 2375 2374 +3 2378 1802 367 +3 2378 1271 1802 +3 2381 2380 1284 +3 1284 2373 2381 +3 1803 2376 1318 +3 2379 2372 230 +3 2371 230 2372 +3 2375 1284 2380 +3 310 1267 374 +3 2392 310 374 +3 2389 468 469 +3 468 2389 1898 +3 2378 2377 1271 +3 2380 368 2376 +3 1479 2388 2387 +3 2380 2382 368 +3 2381 2382 2380 +3 1283 2385 2386 +3 162 1480 1477 +3 2388 1898 2389 +3 2381 1285 2382 +3 2382 2385 368 +3 2384 2387 2391 +3 19 160 163 +3 163 160 159 +3 1478 1481 1480 +3 2392 2391 2395 +3 310 2392 2393 +3 368 2390 1318 +3 2376 368 1318 +3 2390 368 2385 +3 2385 1283 2390 +3 1480 162 1482 +3 1478 1480 1482 +3 1483 162 1319 +3 1283 2684 53 +3 2397 646 607 +3 646 2397 1913 +3 375 2390 2394 +3 375 1318 2390 +3 371 2391 2392 +3 310 2393 1018 +3 375 2394 1282 +3 2391 161 2395 +3 79 2736 2733 +3 1925 652 1929 +3 1665 890 2426 +3 2399 272 2398 +3 98 284 2403 +3 271 2401 2400 +3 2405 2199 2209 +3 1006 2405 2209 +3 2403 286 285 +3 1011 2406 2407 +3 2406 1011 2199 +3 2406 2199 2405 +3 2193 1011 2408 +3 2408 2197 2193 +3 1153 2411 1290 +3 1308 1605 2414 +3 1308 2414 2412 +3 2412 2414 1316 +3 1605 1604 2414 +3 1009 2202 2203 +3 1316 1601 2409 +3 1604 1601 1316 +3 1157 2410 2409 +3 2411 2412 1316 +3 1157 2415 2410 +3 2415 1157 2301 +3 2427 2396 1190 +3 2426 2421 1665 +3 2421 889 1665 +3 2422 404 759 +3 2424 591 1330 +3 1665 889 1664 +3 761 2420 2424 +3 2420 2418 2424 +3 761 1329 2420 +3 652 2425 759 +3 652 757 2425 +3 1189 1188 2419 +3 2418 2420 404 +3 760 759 2420 +3 759 404 2420 +3 760 588 1083 +3 1329 760 2420 +3 2424 1330 761 +3 1914 2428 649 +3 2423 884 889 +3 2418 763 2424 +3 890 2427 2416 +3 2427 2428 2396 +3 2427 890 2428 +3 2428 647 2396 +3 1914 647 2428 +3 1924 2423 757 +3 890 649 2428 +3 648 2423 1924 +3 862 2429 1813 +3 2291 2430 2292 +3 429 2305 2433 +3 2433 2302 2303 +3 2439 1439 1402 +3 2435 847 495 +3 847 846 495 +3 850 2435 495 +3 2482 2483 845 +3 486 845 2483 +3 2436 1900 847 +3 2434 2436 847 +3 1130 2767 396 +3 2767 2766 396 +3 850 2434 2435 +3 1899 1900 2436 +3 496 1899 2436 +3 391 2483 2482 +3 440 2440 1402 +3 440 2441 2440 +3 440 1414 2441 +3 189 2438 2439 +3 2438 1439 2439 +3 1414 442 2441 +3 1401 2444 2443 +3 1439 2438 2442 +3 2438 2437 2442 +3 2447 7 13 +3 1935 2447 13 +3 2566 342 2567 +3 425 973 2450 +3 996 61 995 +3 921 2451 2450 +3 2453 923 1995 +3 2453 1995 921 +3 2452 2453 921 +3 2452 5 2453 +3 973 5 2452 +3 978 5 973 +3 1103 1122 2577 +3 1972 253 1998 +3 2456 2457 1679 +3 2456 31 2457 +3 2455 2456 1679 +3 250 85 252 +3 907 68 963 +3 1026 2578 1945 +3 843 1074 2460 +3 2542 720 1628 +3 2461 1101 841 +3 1101 1124 841 +3 1100 2463 2464 +3 690 2464 2463 +3 2458 1101 2461 +3 2458 2462 1101 +3 2464 1092 1100 +3 2470 2654 596 +3 2469 2470 596 +3 626 2655 2470 +3 690 2465 2464 +3 2465 1092 2464 +3 1821 689 2467 +3 1222 575 94 +3 2470 1090 1089 +3 799 2248 2249 +3 2361 2536 2364 +3 2471 1637 582 +3 1127 913 2475 +3 952 1183 416 +3 2476 913 2477 +3 1057 2161 2163 +3 952 416 953 +3 2481 952 953 +3 520 502 1218 +3 1637 1640 1639 +3 577 1637 2471 +3 1638 1637 577 +3 1727 2473 582 +3 2477 174 2476 +3 810 409 827 +3 2540 2762 1173 +3 2538 2540 1173 +3 1173 2762 2543 +3 2762 2541 2543 +3 1781 1779 572 +3 952 2481 783 +3 809 409 810 +3 815 2479 409 +3 1360 695 2477 +3 695 1360 781 +3 2478 2476 827 +3 2479 2478 827 +3 2478 2479 783 +3 2767 824 2766 +3 2480 1127 2475 +3 847 391 2482 +3 1900 391 847 +3 2482 846 847 +3 1320 2488 610 +3 2710 418 2709 +3 957 2710 2709 +3 785 2712 2706 +3 2712 2709 2706 +3 2709 2712 2705 +3 610 2488 1198 +3 1813 2429 2489 +3 1035 863 2489 +3 1198 2487 2486 +3 863 1813 2489 +3 1813 863 1812 +3 2488 2487 1198 +3 2488 779 2487 +3 2429 1036 2489 +3 2609 2608 16 +3 7 2490 13 +3 13 2490 1938 +3 2493 1839 1837 +3 1974 1595 2596 +3 252 85 965 +3 2596 1973 1974 +3 2493 1843 1839 +3 2495 2494 1837 +3 1237 1835 1239 +3 948 181 1226 +3 2495 1837 1239 +3 2497 1238 740 +3 2646 2645 9 +3 2497 740 1836 +3 1128 2498 1129 +3 2770 2296 1059 +3 2769 2770 1060 +3 877 2277 2501 +3 2504 1064 2505 +3 868 2512 2509 +3 2499 2500 1042 +3 1105 864 1106 +3 2506 2505 871 +3 2507 871 1037 +3 2506 871 2507 +3 1031 2507 1037 +3 1105 2509 1040 +3 2509 1105 868 +3 2276 1063 2278 +3 2510 2276 2503 +3 2504 2510 2503 +3 2504 2277 2510 +3 875 1042 1041 +3 2276 2510 1062 +3 864 2513 2514 +3 2513 864 1105 +3 864 2514 1030 +3 1775 1893 2516 +3 2738 2739 1208 +3 1778 2753 2754 +3 2518 1893 1784 +3 2518 2516 1893 +3 1793 2518 1784 +3 1793 1783 2518 +3 1783 2516 2518 +3 1167 383 44 +3 1990 302 899 +3 901 302 1990 +3 360 302 901 +3 1409 2522 2521 +3 2521 2522 1404 +3 1989 1990 899 +3 2327 2522 1409 +3 440 1411 2524 +3 1424 1405 2528 +3 2528 1405 1416 +3 1421 1424 2528 +3 2522 1408 2526 +3 2522 2526 1404 +3 2526 1416 1404 +3 2526 2527 1416 +3 2526 1408 2527 +3 1678 2701 869 +3 376 377 349 +3 377 2531 349 +3 165 131 134 +3 377 135 2531 +3 135 2532 2531 +3 2532 349 2531 +3 139 349 2532 +3 73 139 2533 +3 74 349 908 +3 270 1335 2404 +3 2552 2551 245 +3 2360 2536 2361 +3 720 2542 1631 +3 251 254 2763 +3 841 1123 1122 +3 251 2763 41 +3 41 1999 251 +3 1631 2540 2539 +3 2540 2538 2539 +3 963 254 251 +3 2541 2544 2543 +3 2543 2544 2363 +3 2547 1627 717 +3 723 1627 1628 +3 1627 1625 2545 +3 1172 2546 3 +3 719 683 720 +3 2542 2547 717 +3 1892 101 2548 +3 29 100 2550 +3 100 29 102 +3 345 2564 1745 +3 256 2550 101 +3 256 29 2550 +3 60 1892 2551 +3 245 2553 2552 +3 2553 246 2552 +3 245 2551 2548 +3 2551 1892 2548 +3 167 2557 2558 +3 167 2554 2557 +3 67 255 248 +3 2556 63 2555 +3 2554 246 2553 +3 167 62 2555 +3 167 2555 2554 +3 2555 63 2554 +3 255 256 101 +3 67 256 255 +3 2557 2553 245 +3 166 2557 245 +3 2556 62 43 +3 1971 2556 43 +3 1680 31 2456 +3 62 2556 2555 +3 2558 2559 167 +3 2559 2558 15 +3 15 42 2559 +3 2562 1094 712 +3 842 2562 712 +3 2574 2231 150 +3 587 1651 1147 +3 2563 704 581 +3 2565 345 1747 +3 1735 324 1742 +3 2570 2571 1734 +3 2568 2571 88 +3 2571 2568 2572 +3 1735 2564 2573 +3 341 1747 1746 +3 88 2567 2568 +3 343 344 2568 +3 2569 1735 2573 +3 2569 2570 1735 +3 1734 2571 2572 +3 1333 213 1332 +3 432 147 801 +3 1731 1733 325 +3 1333 1734 2572 +3 2572 1334 1333 +3 1334 2572 344 +3 344 2572 2568 +3 432 801 114 +3 432 114 1467 +3 1467 114 2148 +3 2575 509 490 +3 1464 1463 148 +3 2235 2582 2236 +3 1103 2577 2460 +3 243 2682 2681 +3 844 243 2681 +3 2582 2235 2234 +3 2236 797 2235 +3 2237 2580 795 +3 2244 407 818 +3 1942 1937 12 +3 1549 1547 2586 +3 2586 1547 2585 +3 2585 1547 1567 +3 1547 1564 1567 +3 2586 1551 1549 +3 2588 842 712 +3 2590 1436 1135 +3 2590 2591 1441 +3 1472 1441 2591 +3 1472 1442 1441 +3 2593 2592 1440 +3 2590 1135 2591 +3 1701 2592 1135 +3 2591 1135 2592 +3 1437 2590 1441 +3 1472 2591 2592 +3 308 306 307 +3 2595 1434 1435 +3 2492 434 1471 +3 2595 2594 1434 +3 2600 251 1999 +3 2597 1973 2596 +3 2598 1595 1976 +3 251 250 252 +3 2600 250 251 +3 2598 1976 250 +3 1972 2599 253 +3 2599 2598 253 +3 550 548 976 +3 2617 1588 1593 +3 1591 506 2610 +3 2602 2604 1573 +3 974 549 968 +3 1572 2605 1574 +3 2602 1573 2603 +3 2612 2613 2614 +3 2613 1578 2614 +3 79 552 234 +3 852 79 234 +3 2605 515 2606 +3 2609 2603 1573 +3 2609 2610 2603 +3 515 498 2606 +3 2603 2610 503 +3 2616 1593 2608 +3 2612 2611 504 +3 2612 2615 2611 +3 1952 2619 1951 +3 2607 1572 2616 +3 1576 515 1575 +3 1576 1575 2601 +3 2613 2612 504 +3 2612 1577 2615 +3 1577 1994 2615 +3 1577 1579 1994 +3 1769 1579 1577 +3 1573 2607 2618 +3 2619 1953 290 +3 2616 2617 1593 +3 1572 2617 2616 +3 2617 1572 1588 +3 2620 1413 10 +3 2621 2620 10 +3 1429 2621 10 +3 10 2529 1429 +3 2529 1428 1429 +3 441 1413 2623 +3 585 2626 2625 +3 1642 1641 2624 +3 1648 1642 2624 +3 585 2625 2627 +3 608 1644 1643 +3 2625 1649 1648 +3 708 709 581 +3 398 2634 2631 +3 2635 2631 1638 +3 2629 2627 709 +3 2630 2628 2629 +3 2627 2624 709 +3 2627 2625 2624 +3 1648 2624 2625 +3 2629 708 2630 +3 2635 1638 577 +3 2628 2630 580 +3 398 803 802 +3 2633 2634 585 +3 2633 585 2632 +3 398 2631 2635 +3 2632 2629 2628 +3 2633 2632 2628 +3 398 802 2634 +3 1151 399 1150 +3 1195 1150 612 +3 2636 94 804 +3 845 486 2676 +3 2639 1473 1443 +3 215 1723 1722 +3 2643 2644 2642 +3 2145 2650 385 +3 200 31 2643 +3 200 2643 2642 +3 2645 18 2644 +3 1886 2649 196 +3 2647 2646 9 +3 1684 1728 2647 +3 1728 195 2647 +3 2645 194 1885 +3 1684 2647 9 +3 995 994 35 +3 2646 2648 194 +3 2645 2646 194 +3 1728 1729 195 +3 2649 1885 196 +3 2136 2137 358 +3 2651 2652 385 +3 144 2136 2651 +3 359 44 2652 +3 360 44 359 +3 604 787 635 +3 2655 2654 2470 +3 2655 634 2654 +3 2655 633 634 +3 1526 1528 1522 +3 785 2703 2704 +3 785 2659 2703 +3 559 2657 1505 +3 1506 2657 559 +3 2707 2706 418 +3 1433 467 2715 +3 2706 2661 785 +3 466 2660 561 +3 561 2660 562 +3 558 784 1506 +3 1835 1237 2663 +3 2663 1237 725 +3 725 1238 2663 +3 1835 1238 2497 +3 1835 2663 1238 +3 2664 687 1822 +3 687 1823 1822 +3 692 1819 1818 +3 692 1392 2666 +3 1389 598 2666 +3 2630 2672 580 +3 1191 607 1192 +3 653 2665 759 +3 512 1592 1566 +3 797 829 798 +3 1592 512 514 +3 397 803 804 +3 2012 2010 699 +3 2668 578 2673 +3 1640 2671 2667 +3 2012 699 2673 +3 578 1725 2673 +3 2760 2756 2222 +3 1638 2628 2675 +3 2675 2628 580 +3 580 2674 2675 +3 398 2636 804 +3 398 2635 2636 +3 1637 2675 2674 +3 2674 1640 1637 +3 1645 583 579 +3 1120 2677 1117 +3 2756 2760 2221 +3 1957 1115 1958 +3 1117 2677 960 +3 2682 243 2127 +3 832 2680 2679 +3 2392 374 2683 +3 371 2392 2683 +3 53 2683 1269 +3 367 1269 1268 +3 1269 374 1268 +3 374 1269 2683 +3 867 978 2685 +3 1054 2686 866 +3 1054 2294 2686 +3 905 904 2688 +3 905 322 904 +3 146 2696 363 +3 2691 111 905 +3 2690 2693 2694 +3 896 145 2699 +3 2690 300 2693 +3 2690 22 300 +3 363 2695 898 +3 2690 2696 22 +3 2692 304 111 +3 2699 898 2698 +3 2698 897 2699 +3 1501 22 2696 +3 359 145 896 +3 2700 2699 897 +3 899 2700 897 +3 302 2700 899 +3 2702 1774 1773 +3 1785 2702 1773 +3 2702 1785 519 +3 435 444 436 +3 2713 1440 437 +3 521 1771 1770 +3 527 1355 1354 +3 2715 467 2716 +3 2710 839 2711 +3 1800 2751 2336 +3 957 2705 411 +3 2707 2661 2706 +3 417 957 955 +3 2705 2712 785 +3 2708 415 1435 +3 415 838 1435 +3 1795 1780 2746 +3 2711 2708 418 +3 2710 2711 418 +3 492 1449 1661 +3 839 415 2711 +3 191 1435 2715 +3 2715 1435 2714 +3 1431 2719 1430 +3 1430 2719 1419 +3 1431 2718 2719 +3 2718 1431 1432 +3 2718 437 2719 +3 1701 1419 2719 +3 753 755 309 +3 14 306 308 +3 1017 2395 161 +3 308 307 153 +3 539 2729 2730 +3 2732 2731 537 +3 239 2731 2732 +3 2735 185 1887 +3 532 185 2735 +3 2733 522 239 +3 2733 239 2732 +3 97 2742 274 +3 2742 97 1168 +3 2741 573 1206 +3 1207 2737 2741 +3 939 2748 2749 +3 2753 1778 939 +3 2749 2747 1710 +3 1782 571 2755 +3 1779 2755 2754 +3 2541 2762 2540 +3 2196 2758 2757 +3 1007 2758 2196 +3 2758 1007 2759 +3 2759 1112 1961 +3 2225 2761 2757 +3 2756 2757 2761 +3 387 2764 1470 +3 2766 824 826 +3 825 824 2768 +3 1703 1585 2771 +3 1042 875 2769 + diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/data/torus_quad.off b/Surface_mesh_topology/examples/Surface_mesh_topology/data/torus_quad.off new file mode 100644 index 00000000000..66d29e35817 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/data/torus_quad.off @@ -0,0 +1,52 @@ +OFF +25 25 50 +0.107677 -1.54743e-018 -0.331395 +-0.281902 -1.54743e-018 -0.204814 +-0.281902 -1.54743e-018 0.204814 +0.107676 -1.54743e-018 0.331395 +0.34845 -1.54743e-018 8.92032e-008 +0.18208 0.331395 -0.560383 +-0.476691 0.331395 -0.346336 +-0.476691 0.331395 0.346336 +0.18208 0.331395 0.560384 +0.589223 0.331395 8.92032e-008 +0.302466 0.204814 -0.930895 +-0.791866 0.204814 -0.575325 +-0.791866 0.204814 0.575324 +0.302466 0.204814 0.930895 +0.978801 0.204814 8.92032e-008 +0.302466 -0.204814 -0.930895 +-0.791866 -0.204814 -0.575325 +-0.791866 -0.204814 0.575324 +0.302466 -0.204814 0.930895 +0.978801 -0.204814 8.92032e-008 +0.18208 -0.331395 -0.560383 +-0.476691 -0.331395 -0.346336 +-0.476691 -0.331395 0.346336 +0.18208 -0.331395 0.560384 +0.589222 -0.331395 8.92032e-008 +4 5 6 1 0 +4 6 7 2 1 +4 7 8 3 2 +4 8 9 4 3 +4 9 5 0 4 +4 10 11 6 5 +4 11 12 7 6 +4 12 13 8 7 +4 13 14 9 8 +4 14 10 5 9 +4 15 16 11 10 +4 16 17 12 11 +4 17 18 13 12 +4 18 19 14 13 +4 19 15 10 14 +4 20 21 16 15 +4 21 22 17 16 +4 22 23 18 17 +4 23 24 19 18 +4 24 20 15 19 +4 0 1 21 20 +4 1 2 22 21 +4 2 3 23 22 +4 3 4 24 23 +4 4 0 20 24 diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/map_2_constructor.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/map_2_constructor.cpp new file mode 100644 index 00000000000..065c18cf7b5 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/map_2_constructor.cpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +using namespace CGAL::Surface_mesh_topology; + +typedef Polygonal_schema_with_combinatorial_map<> CMap; +typedef Polygonal_schema_with_generalized_map<> GMap; + +template +void construct_map_from_edges() +{ + Map cm; + + cm.add_facet("a b c -a -b"); + cm.add_facet("-c d e -d -e"); + + Path_on_surface p(cm); p.push_back_by_label("a b d e"); + + std::cout<<"Map valid="<(); + construct_map_from_edges(); + + return EXIT_SUCCESS; +} + diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/open_path_homotopy.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/open_path_homotopy.cpp new file mode 100644 index 00000000000..04131741df4 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/open_path_homotopy.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(88); // Its starting dart + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index(300); // Its starting dart + for (int i=0; i<3; ++i) + { p.extend_negative_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_index(87); // Its starting dart + p.extend_positive_turn(1); // Extend the path + for (int i=0; i<3; ++i) + { p.extend_positive_turn(2); } + p.extend_positive_turn(1); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/double-torus.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/double-torus.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface p1(sm), p2(sm), p3(sm); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + bool res1=cst.are_base_point_homotopic(p1, p2); + std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT") + <<" base point homotopic with path p2 (green)."< > paths={p1, p2, p3}; + CGAL::draw(sm, paths); // Enable only if CGAL was compiled with Qt5 +#endif // CGAL_USE_BASIC_VIEWER + + return EXIT_SUCCESS; +} +/////////////////////////////////////////////////////////////////////////////// diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/path_homotopy.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/path_homotopy.cpp new file mode 100644 index 00000000000..805595cf533 --- /dev/null +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/path_homotopy.cpp @@ -0,0 +1,196 @@ +#include +#include +#include +#include + +/* If you want to use a viewer, you can use qglviewer. */ +#ifdef CGAL_USE_BASIC_VIEWER +#include +#endif + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +[[ noreturn ]] void usage(int /*argc*/, char** argv) +{ + std::cout<<"usage: "<= l: a random number between [l1, l2] (by default [10, 100])."<=argc) + { error_command_line(argc, argv, "Error: not enough number after -D option."); } + d1=std::stoi(std::string(argv[++i])); + d2=std::stoi(std::string(argv[++i])); + } + else if (arg=="-L") + { + if (i+2>=argc) + { error_command_line(argc, argv, "Error: not enough number after -L option."); } + l1=std::stoi(std::string(argv[++i])); + l2=std::stoi(std::string(argv[++i])); + } + else if (arg=="-N") + { + if (i==argc-1) + { error_command_line(argc, argv, "Error: no number after -nbtests option."); } + N=static_cast(std::stoi(std::string(argv[++i]))); + } + else if (arg=="-seed") + { + if (i==argc-1) + { error_command_line(argc, argv, "Error: no number after -seed option."); } + random=CGAL::Random(static_cast + (std::stoi(std::string(argv[++i])))); + // initialize the random generator with the given seed + } + else if (arg=="-time") + { time=true; } + else if (arg=="-h" || arg=="--help" || arg=="-?") + { usage(argc, argv); } + else if (arg[0]=='-') + { std::cout<<"Unknown option "<(random.get_int(l1, l2+1)); + defo=static_cast(random.get_int(d1, d2+1)); + + std::vector > paths; + std::vector > transformed_paths; + + Path_on_surface path1(lcc); + path1.generate_random_closed_path(length, random); + + std::cout<<"Path1 size: "< path2(path1); + path2.update_path_randomly(defo, random); + std::cout<<"Path2 size: "<(errors_seeds.size()*100)/ + static_cast(N)<<"%)."<(nbcontractible*100)/ + static_cast(N)<<"%)."< +#include +#include +#include +#include + +using namespace CGAL::Surface_mesh_topology; +typedef Polygonal_schema_with_combinatorial_map<> PS; + +int main() +{ + PS ps; + ps.add_facet("a b -a -b c d -c -d"); + + Path_on_surface p1(ps); p1.push_back_by_label("a"); + Path_on_surface p2(ps); p2.push_back_by_label("b c a -c -b"); + + Curves_on_surface_topology cst(ps); + + bool res1=cst.are_freely_homotopic(p1, p2); + std::cout<<"Paths p1 and p2 "<<(res1?"ARE":"ARE NOT") + <<" freely homotopic."< +#include +#include +#include +#include + +typedef CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map<> PS; + +int main() +{ + PS ps; + + ps.add_facet("a b -a c"); // First facet, giving directly its sequence of edges + ps.add_facet("d -c e -b"); // Second facet + + ps.init_facet(); // Third facet + ps.add_edges_to_facet("f"); // Here, each edge is added one at a time + ps.add_edges_to_facet("-d"); + ps.add_edges_to_facet("-f"); + ps.add_edges_to_facet("-e"); + ps.finish_facet(); + + ps.perforate_facet("f"); + + std::cout<<"Number of cells of the combinatorial maps: "; + ps.display_characteristics(std::cout)< p(ps); + p.push_back_by_label("a b -a e -b d"); + + CGAL::Surface_mesh_topology::Curves_on_surface_topology cst(ps); + bool res=cst.is_contractible(p); + std::cout<<"Path "<<(res?"IS":"IS NOT")<<" contractible."< +#include +#include +#include +#include + +#include +#include +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +static unsigned int seed; // Use the same seed for the two tests + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +template +void test(const FaceGraph& mesh) +{ + CGAL::Random random(seed); + Curves_on_surface_topology cst(mesh); + + Path_on_surface p1(mesh); // A first path + p1.generate_random_closed_path(10, random); + + Path_on_surface p2(mesh); // A second path + p2.generate_random_closed_path(10, random); + + bool res1=cst.is_contractible(p1); + std::cout<<"Path p1 "<<(res1?"IS":"IS NOT")<<" contractible."< > paths={p1, p2}; + CGAL::draw(mesh, paths); // Enable only if CGAL was compiled with Qt5 */ +#endif // CGAL_USE_BASIC_VIEWER +} +/////////////////////////////////////////////////////////////////////////////// +int main(int argc, char** argv) +{ + std::string file=(argc==1?"data/elephant.off":argv[1]); + seed=static_cast(CGAL::get_default_random().get_int(0,INT_MAX)); + + { + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, file.c_str())) + { + std::cout<<"ERROR reading file "< +// +#ifndef CGAL_CURVES_ON_SURFACE_TOPOLOGY_H +#define CGAL_CURVES_ON_SURFACE_TOPOLOGY_H 1 + +#include + +#include +#include +#include + +namespace CGAL { +namespace Surface_mesh_topology { + +template +class Curves_on_surface_topology +{ +public: + typedef internal::Minimal_quadrangulation Minimal_quadrangulation; + typedef typename Minimal_quadrangulation::Original_map Original_map; + typedef typename Minimal_quadrangulation::Reduced_map Reduced_map; + + Curves_on_surface_topology(const Mesh& amesh, bool /* display_time */=false) : + m_original_mesh(amesh), + m_minimal_quadrangulation(nullptr) + {} + + /// @return true iff the minimal quadrangulation is computed. + bool is_minimal_quadrangulation_computed() const + { return m_minimal_quadrangulation!=nullptr; } + + /// Computes the minimal quadrangulation if it is not yet computed. + void compute_minimal_quadrangulation(bool display_time=true) const + { + if (m_minimal_quadrangulation==nullptr) + { + m_minimal_quadrangulation.reset + (new Minimal_quadrangulation(m_original_mesh, display_time)); + } + } + + /// Return the original map. + const Original_map& get_original_map() const + { return m_minimal_quadrangulation->get_original_map(); } + + /// Return the reduced map computed in the minimal quadrangulation. + /// @pre is_minimal_quadrangulation_computed() + const Reduced_map& get_minimal_quadrangulation() const + { + CGAL_assertion(is_minimal_quadrangulation_computed()); + return m_minimal_quadrangulation->get_reduced_map(); + } + + /// @return true iff 'p' is contractible. + bool is_contractible(const Path_on_surface& p, + bool display_time=false) const + { + compute_minimal_quadrangulation(display_time); + return m_minimal_quadrangulation->is_contractible(p, display_time); + } + + /// @return true iff 'p1' and 'p2' are freely homotopic. + bool are_freely_homotopic(const Path_on_surface& p1, + const Path_on_surface& p2, + bool display_time=false) const + { + compute_minimal_quadrangulation(display_time); + return m_minimal_quadrangulation->are_freely_homotopic(p1, p2, + display_time); + } + + /// @return true iff 'p1' and 'p2' are base point freely homotopic. + bool are_base_point_homotopic(const Path_on_surface& p1, + const Path_on_surface& p2, + bool display_time=false) const + { + compute_minimal_quadrangulation(display_time); + return m_minimal_quadrangulation->are_base_point_homotopic(p1, p2, + display_time); + } + +protected: + const Mesh& m_original_mesh; + mutable std::unique_ptr m_minimal_quadrangulation; +}; + +} // namespace Surface_mesh_topology +} // namespace CGAL + +#endif // CGAL_CURVES_ON_SURFACE_TOPOLOGY_H // +// EOF // diff --git a/Surface_mesh_topology/include/CGAL/Path_on_surface.h b/Surface_mesh_topology/include/CGAL/Path_on_surface.h new file mode 100644 index 00000000000..bc3a5131c79 --- /dev/null +++ b/Surface_mesh_topology/include/CGAL/Path_on_surface.h @@ -0,0 +1,1266 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_PATH_ON_SURFACE_H +#define CGAL_PATH_ON_SURFACE_H 1 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// A Path_on_surface contains two vectors of equal length n +// The first one is a vector of darts called m_path and the second one a vector +// of booleans called m_flip. +// If n = 0, the path represented by those vectors is the empty path. +// Else, it is the path represented by the n-1 first elements of both vectors, +// at the one we add the m_path[n-1] dart if m_flip[n-1] is false and the +// opposite of this dart if m_flip[n-1] is true i.e. if m_flip[i] is true means +// that the i-th dart m_path[i] has to be flipped. +// We use flips because sometimes opposite darts doesn't exist on surfaces with +// boundaries. But if m_flip[i] is true doesn't necesary mean that +// m_path[i] is 2-free + +namespace CGAL { +namespace Surface_mesh_topology { + +template +class Path_on_surface +{ +public: + typedef Path_on_surface Self; + typedef Mesh_ Mesh; + typedef typename Get_map::type Map; // Mesh seen as a 2-map + typedef typename Map::Dart_const_handle Dart_const_handle; + + typedef Dart_const_handle halfedge_descriptor; // To be compatible with BGL + + Path_on_surface(const Mesh& amesh) : m_map(amesh), m_is_closed(false) + {} + + template + Path_on_surface(const internal::Path_on_surface_with_rle& apath) : + m_map(apath.get_map()), + m_is_closed(apath.is_closed()) + { + for (auto it=apath.m_path.begin(), itend=apath.m_path.end(); it!=itend; ++it) + { + push_back(it->begin, false, false); + if (it->length>0) + { extend_straight_positive(it->length, false); } + else if (it->length<0) + { extend_straight_negative(-(it->length), false); } + } + update_is_closed(); + CGAL_assertion(is_valid(true)); + } + + Path_on_surface(const Self& apath) : m_map(apath.m_map), + m_path(apath.m_path), + m_is_closed(apath.m_is_closed), + m_flip(apath.m_flip) + {} + + void swap(Self& p2) + { + if (this==&p2) { return; } + + CGAL_assertion(&m_map==&(p2.m_map)); + m_path.swap(p2.m_path); + std::swap(m_is_closed, p2.m_is_closed); + m_flip.swap(p2.m_flip); + } + + Self& operator=(const Self& other) + { + CGAL_assertion(&m_map==&(other.m_map)); + if (this!=&other) + { + m_path=other.m_path; + m_is_closed=other.m_is_closed; + m_flip=other.m_flip; + } + return *this; + } + + /// @return true iff the path is empty + bool is_empty() const + { return m_path.empty(); } + + /// @return the length of the path, i.e. its number of darts. + std::size_t length() const + { return m_path.size(); } + + /// @return true iff the path is closed. + /// (m_is_closed is updated after each path modification). + bool is_closed() const + { return m_is_closed; } + + /// @return the combinatorial map supporting this path. + const Map& get_map() const + { return m_map; } + + /// @return the combinatorial map supporting this path. + const Mesh& get_mesh() const + { return Get_map::get_mesh(m_map); } + + const std::vector& get_flip() const + { return m_flip; } + + /// clear the path. + void clear() + { + m_path.clear(); + m_flip.clear(); + m_is_closed=false; + } + + /// @return true iff the next index exists + bool next_index_exists(std::size_t i) const + { return is_closed() || i<(m_path.size()-1); } + + /// @return the index after index i. + std::size_t next_index(std::size_t i) const + { return ((is_closed() && i==(m_path.size()-1))?0:(i+1)); } + + /// @return the index before index i. + std::size_t prev_index(std::size_t i) const + { return ((is_closed() && i==0)?(m_path.size()-1):(i-1)); } + + /// @return the ith dart of the path. + Dart_const_handle get_ith_dart(std::size_t i) const + { + CGAL_assertion(i(get_ith_dart(i)): + get_ith_dart(i)); + } + + /// @return the opposite of the ith dart of the path taking into account flip. + /// return null_handle if !flip and there is no beta2 + Dart_const_handle get_opposite_ith_real_dart(std::size_t i) const + { + CGAL_assertion(i(get_ith_dart(i))); + } + + /// @return the first dart of the path, taking into account flip. + /// @pre !is_empty() + Dart_const_handle real_front() const + { + CGAL_assertion(!is_empty()); + return get_ith_real_dart(0); + } + + /// @return the last dart of the path, taking into account flip. + /// @pre !is_empty() + Dart_const_handle real_back() const + { + CGAL_assertion(!is_empty()); + return get_ith_real_dart(length()-1); + } + + /// @return true iff df can be added at the end of the path. + bool can_be_pushed(Dart_const_handle dh, bool flip=false) const + { + // This assert is too long CGAL_assertion(m_map.darts().owns(dh)); + + if (is_empty()) return true; + + return m_map.template belong_to_same_cell<0> + (m_flip.back() ? back() : m_map.other_extremity(back()), + flip ? m_map.other_extremity(dh) : dh); + } + + /// Add the given dart at the end of this path. + /// @pre can_be_pushed(dh) + void push_back(Dart_const_handle dh, bool flip=false, + bool update_isclosed=true) + { + CGAL_assertion(dh!=Map::null_handle); + /* This assert is too long, it is tested in the is_valid method. */ + // CGAL_assertion(can_be_pushed(dh, flip)); + + m_path.push_back(dh); + m_flip.push_back(flip); + if (update_isclosed) { update_is_closed(); } + } + + /// @return true iff the ith dart can be added at the end of the path. + bool can_be_pushed_by_index(std::size_t i, bool flip=false, + bool update_isclosed=true) const + { return can_be_pushed(get_map().dart_handle(i), flip, update_isclosed); } + + /// Add the given ith dart at the end of this path. + void push_back_by_index(std::size_t i, bool flip=false, + bool update_isclosed=true) + { push_back(get_map().dart_handle(i), flip, update_isclosed); } + + void push_back_by_index(std::initializer_list l, + bool update_isclosed=true) + { + for (std::size_t i : l) + { push_back_by_index(i, false, update_isclosed); } + } + + /// @return true iff the dart labeled e can be added at the end of the path. + bool can_be_pushed_by_label(const std::string& e, bool flip=false) const + { + Dart_const_handle dh=get_map().get_dart_labeled(e); + if (dh==nullptr) { return false; } + return can_be_pushed(dh, flip); + } + + /// Add the dart having the given labels at the end of this path. + /// Each label is a word, possibly starting by -, words are separated by spaces + void push_back_by_label(const std::string& s, bool update_isclosed=true) + { + std::istringstream iss(s); + for (std::string e; std::getline(iss, e, ' '); ) + { + Dart_const_handle dh=get_map().get_dart_labeled(e); + if (dh!=nullptr) { push_back(dh, false, update_isclosed); } + } + } + + void push_back_by_label(std::initializer_list l, + bool update_isclosed=true) + { + for (const char* e : l) + { push_back_by_label(e, false, update_isclosed); } + } + + Self& operator+=(const Self& other) + { + m_path.reserve(m_path.size()+other.m_path.size()); + // Be careful to the special case when *this==other + // this is the reason of the iend. + for (std::size_t i=0, iend=other.length(); i(m_path[i])) + { + m_path[i]=get_map().template beta<2>(m_path[i]); + m_flip[i]=!m_flip[i]; + } + else if (show_flips_left) + { std::cout<=length()) return; + m_path.resize(n); + m_flip.resize(n); + if (update_isclosed) { update_is_closed(); } + } + + /// copy all darts starting from begin and going to the dart before end + /// from this path to new_path. + void copy_rest_of_path(std::size_t begin, std::size_t end, + Self& new_path) + { + CGAL_assertion(begin<=end); + CGAL_assertion(end<=length()); + new_path.m_path.reserve(new_path.m_path.size()+end-begin+1); + while(begin!=end) + { + new_path.push_back(get_ith_dart(begin), get_ith_flip(begin), false); + ++begin; + } + update_is_closed(); + } + + /// Debugging method. + void display_failed_extention(const std::string& /*name_of_function*/) + { + // std::cout<<"Cant extend the path this way ("<(dh)) + { display_failed_extention("extend_straight_positive"); return; } + else + { dh=get_map().template beta<2>(dh); } + } + + for (unsigned int i=0; i(dh); + + if (get_map().template is_free<2>(dh)) + { display_failed_extention("extend_straight_positive"); return; } + dh=get_map().template beta<2, 1>(dh); + + push_back(dh, false, false); + } + + if (update_isclosed) { update_is_closed(); } + } + + /// Extend the path straight negative. + /// @pre must be non empty. + void extend_straight_negative(std::size_t nb=1, bool update_isclosed=true) + { + if (is_empty() || nb==0) + { display_failed_extention("extend_straight_negative"); return; } + + Dart_const_handle dh=back(); + if(!back_flip()) + { + if (get_map().template is_free<2>(dh)) + { display_failed_extention("extend_straight_positive"); return; } + else + { dh=get_map().template beta<2>(dh); } + } + + for (unsigned int i=0; i(dh); + + if (get_map().template is_free<2>(dh)) + { display_failed_extention("extend_straight_negative"); return; } + dh=get_map().template beta<2, 0>(dh); + + push_back(dh, true, false); + } + + if (update_isclosed) { update_is_closed(); } + } + + /// Extend the path given a positive turn. + /// @pre must be non empty. + void extend_positive_turn(std::size_t nb=1, bool update_isclosed=true) + { + if (is_empty()) + { display_failed_extention("extend_positive_turn"); return; } + + if (nb==0) + { + push_back(back(), !back_flip(), update_isclosed); + return; + } + + Dart_const_handle dh=back(); + if(back_flip()) + { + if (get_map().template is_free<2>(dh)) + { display_failed_extention("extend_positive_turn"); return; } + else + { dh=get_map().template beta<2>(dh); } + } + dh=get_map().template beta<1>(dh); + + for (unsigned int i=1; i(dh)) + { display_failed_extention("extend_positive_turn"); return; } + dh=get_map().template beta<2, 1>(dh); + } + + push_back(dh, false, update_isclosed); + } + + /// Extend the path given a negative turn. + /// @pre must be non empty. + void extend_negative_turn(std::size_t nb=1, bool update_isclosed=true) + { + if (is_empty()) { display_failed_extention("extend_negative_turn"); return; } + + if (nb==0) + { + push_back(back(), !back_flip(), update_isclosed); + return; + } + + Dart_const_handle dh=back(); + if(!back_flip()) + { + if (get_map().template is_free<2>(dh)) + { display_failed_extention("extend_negative_turn"); return; } + else + { dh=get_map().template beta<2>(dh); } + } + dh=get_map().template beta<0>(dh); + + for (unsigned int i=1; i(dh)) + { display_failed_extention("extend_negative_turn"); return; } + dh=get_map().template beta<2, 0>(dh); + } + + push_back(dh, true, update_isclosed); + } + + /// Initializes this path to a random starting path. + /// @pre must be empty. + bool initialize_random_starting_dart(CGAL::Random& random, + bool update_isclosed=true) + { + if (!is_empty() || get_map().is_empty()) { return false; } + + // first select a random edge by taking the lower index of + // the two darts when it is not a boundary + std::size_t index=static_cast + (random.get_int(0, static_cast(get_map().darts().capacity()))); + while (!get_map().darts().is_used(index) || + (!get_map().template is_free<2>(get_map().dart_handle(index)) && + get_map().dart_handle(index)>get_map(). + template beta<2>(get_map().dart_handle(index)))) + { + ++index; + if (index==get_map().darts().capacity()) index=0; + } + + // second we take randomly one of the two darts of this edge + // (potentially with the help of a flip) + bool heads_or_tails=random.get_bool(); + if (get_map().template is_free<2>(get_map().dart_handle(index))) + { + push_back(get_map().dart_handle(index), heads_or_tails, update_isclosed); + } + else + { + if (heads_or_tails) + { push_back(get_map().dart_handle(index), false, update_isclosed); } + else + { push_back(get_map().template beta<2>(get_map().dart_handle(index)), + false, update_isclosed); } + } + return true; + } + + /// Initializes this path to a random starting path. + /// @pre must be empty. + bool initialize_random_starting_dart(bool update_isclosed=true) + { + CGAL::Random& random=get_default_random(); + return initialize_random_starting_dart(random, update_isclosed); + } + + /// Extends this path with a random dart. + /// @pre must be non empty. + bool extend_path_randomly(CGAL::Random& random, + bool allow_half_turn=true, + bool update_isclosed=true) + { + if (is_empty()) + { return initialize_random_starting_dart(random, update_isclosed); } + + if(get_map().template is_free<1>(back())) + { return false; } + + Dart_const_handle next_vertex; + if (back_flip()) + { next_vertex=back(); } + else if (get_map().template is_free<2>(back())) + { next_vertex=get_map().template beta<1>(back()); } + else + { next_vertex=get_map().template beta<2>(back()); } + + std::vector > candidats; + for (auto it=get_map().template darts_of_cell<0>(next_vertex).begin(), + itend=get_map().template darts_of_cell<0>(next_vertex).end(); + it!=itend; ++it ) + { + if (back_flip() || !get_map().template is_free<2>(back())) + { + candidats.push_back(std::make_pair(it, false)); + if (get_map().template is_free<2>(get_map().template beta<0>(it))) + { candidats.push_back + (std::make_pair(get_map().template beta<0>(it), true)); } + } + else + { + if (get_map().template is_free<2>(get_map().template beta<0>(it))) + { candidats.push_back + (std::make_pair(get_map().template beta<0>(it), true)); } + candidats.push_back(std::make_pair(it, false)); + } + } + //candidats is now the list of all the darts that can be pushed back to + // the path (maybe with a flip) the first of them in the list is the + // opposite of back(), or back() itself if it is 2-free + + std::size_t i=static_cast + (random.get_int(allow_half_turn?0:1,static_cast(candidats.size()))); + auto it=candidats.begin(); + for (std::size_t nb=0; nbfirst, it->second, update_isclosed); + return true; + } + + /// Extends this path with a random dart. + /// @pre must be non empty. + bool extend_path_randomly(bool allow_half_turn=false, + bool update_isclosed=true) + { + CGAL::Random& random=get_default_random(); + return extend_path_randomly(random, allow_half_turn, update_isclosed); + } + + /// Generates a random path, with a number of darts >= length. + void generate_random_path(std::size_t length, + CGAL::Random& random=get_default_random(), + bool allow_half_turns=true, + bool update_isclosed=true) + { + m_path.reserve(m_path.size()+length); + for (std::size_t i=0; i + void generate_random_path(CGAL::Random& random, + bool update_isclosed=true) + { generate_random_path(random.get_int(1, 10000), + random, true, update_isclosed); } + + /// Generates a random path. + template + void generate_random_path(std::size_t length, + bool update_isclosed=true) + { + CGAL::Random& random=get_default_random(); + generate_random_path(length, random, true, update_isclosed); + } + + /// Generates a random path. + template + void generate_random_path(bool update_isclosed=true) + { + CGAL::Random& random=get_default_random(); + generate_random_path(random, update_isclosed); + } + + /// Generates a random closed path. + void generate_random_closed_path(std::size_t length, CGAL::Random& random) + { + m_path.reserve(m_path.size()+length); + std::size_t i=0; + while(i(get_ith_dart(i)); + do + { + p2.push_back(dh, false, false); + dh=get_map().template beta<1>(dh); + } + while(dh!=get_ith_dart(i)); + } + else + { + Dart_const_handle dh=get_map().template beta<0>(get_ith_dart(i)); + do + { + p2.push_back(dh, true, false); + dh=get_map().template beta<0>(dh); + } + while(dh!=get_ith_dart(i)); + } + + // 2) We copy the end of the path. + p2.m_path.reserve(p2.length()+length()-i); + for (std::size_t j=i+1; j + (random.get_int(0, static_cast(length()))); + std::size_t j=dartn; + while(!push_around_face(dartn, false) && dartn!=j) + { ++dartn; } + } + if (update_isclosed) { update_is_closed(); } + } + + void update_path_randomly(CGAL::Random& random, + bool update_isclosed=true) + { update_path_randomly(random.get_int(0, 10000), update_isclosed); } + + void update_path_randomly(std::size_t nb, bool update_isclosed=true) + { + CGAL::Random random; + update_path_randomly(nb, random, update_isclosed); + } + + void update_path_randomly(bool update_isclosed=true) + { + CGAL::Random& random=get_default_random(); + update_path_randomly(random, update_isclosed); + } + + /// @return true iff the i-th dart of the path and the j-th dart of the other + /// are the same (taking into account the flips !) + bool are_same_step(std::size_t i, const Self& other, std::size_t j) const + { + if (get_ith_flip(i)==other.get_ith_flip(j)) + { return get_ith_dart(i)==other[j]; } + + if (get_map().template is_free<2>(get_ith_dart(i)) || + get_map().template is_free<2>(other[j])) + { return false; } + + return get_ith_dart(i)==get_map().template beta<2>(other[j]); + } + + /// @return true if this path is equal to other path, identifying dart 0 of + /// this path with dart start in other path. + bool are_same_paths_from(const Self& other, std::size_t start) const + { + CGAL_assertion(start==0 || start *this==other + + return boost::algorithm::knuth_morris_pratt_search(pp2.m_path.begin(), + pp2.m_path.end(), + pp1.m_path.begin(), + pp1.m_path.end()) +#if BOOST_VERSION>=106200 + .first +#endif + !=pp2.m_path.end(); + } + bool operator!=(const Self& other) const + { return !(operator==(other)); } + + /// @Return true if this path is equal to other path, identifying dart 0 of + /// this path with dart start in other path. other path is given + /// by index of its darts, in text format. + bool are_same_paths_from(const char* other, std::size_t start) const + { + CGAL_assertion(start==0 || start>nb; + if (nb!=m_map.darts().index(get_ith_dart(start))) + { return false; } + start=next_index(start); + } + iss>>nb; + if (iss.good()) + { return false; } // There are more elements in other than in this path + + return true; + } + /// @return true if this path is equal to other path. For closed paths, test + /// all possible starting darts. other path is given by index of its + /// darts, in text format. + bool operator==(const char* other) const + { + if (!is_closed()) + { return are_same_paths_from(other, 0); } + + for(std::size_t start=0; start + (m_flip[i]?get_map().beta(m_path[i], 1):m_path[i], last_vertex)) + { + if (display_error) + { std::cout<<"Invalid path: dart "<(back()); + if (is_closed()) + { + if (last_vertex==Map::null_handle) + { + if (display_error) + { std::cout<<"Invalid path: one of the vertices doesn't exist" + < + (front_flip()?get_map().beta(front(), 1):front(), last_vertex)) + { + if (display_error) + { std::cout<<"Invalid path: m_is_closed is true but the path is " + <<"not closed"< + (front_flip()?get_map().beta(front(), 1):front(), last_vertex)) + { + if (display_error) + { std::cout<<"Invalid path: m_is_closed is false but the path " + <<"is closed"<(pbegin, pend); + } + } + } + + /// @return true iff the path does not pass twice through a same edge + /// or a same vertex. + bool is_simple() const + { + typename Map::size_type markvertex=m_map.get_new_mark(); + typename Map::size_type markedge=m_map.get_new_mark(); + + bool res=true; + Dart_const_handle dh_vertex; + unsigned int i=0; + for (i=0; res && i(m_path[i]):m_path[i]; + if (m_map.is_marked(dh_vertex, markvertex)) { res=false; } + else { CGAL::mark_cell(m_map, dh_vertex, markvertex); } + + if (m_map.is_marked(m_path[i], markedge)) { res=false; } + else { CGAL::mark_cell(m_map, m_path[i], markedge); } + } + + i=0; + while(m_map.number_of_marked_darts(markedge)>0 || + m_map.number_of_marked_darts(markvertex)>0) + { + CGAL_assertion(i(m_path[i]):m_path[i]; + if (m_map.is_marked(dh_vertex, markvertex)) + { CGAL::unmark_cell(m_map, dh_vertex, markvertex); } + if (m_map.is_marked(m_path[i], markedge)) + { CGAL::unmark_cell(m_map, m_path[i], markedge); } + ++i; + } + + m_map.free_mark(markvertex); + m_map.free_mark(markedge); + + return res; + } + + /// Reverse the path (i.e. negate its orientation). + void reverse() + { + bool tmpbool; + for (unsigned int i=0; i=0; --i) + { m_path.push_back(m_path[i], !m_flip[i], false); } + m_is_closed=true; + } + } + + /// @return the turn between dart number i and dart number i+1. + /// (turn is position of the second edge in the cyclic ordering of + /// edges starting from the first edge around the second extremity + /// of the first dart) + std::size_t next_positive_turn(std::size_t i) const + { + // CGAL_assertion(is_valid()); + CGAL_assertion(i(get_ith_dart(i))) || + (get_next_flip(i) && get_map().template is_free<2>(get_next_dart(i)))) + { return std::numeric_limits::max(); } + + return m_map.positive_turn(get_ith_real_dart(i), + get_ith_real_dart(next_index(i))); + } + + /// Same than next_positive_turn but turning in reverse orientation + /// around vertex. + std::size_t next_negative_turn(std::size_t i) const + { + // CGAL_assertion(is_valid()); + CGAL_assertion(i(get_ith_dart(i))) || + (!get_next_flip(i) && get_map().template is_free<2>(get_next_dart(i)))) + { return std::numeric_limits::max(); } + + return m_map.positive_turn(get_opposite_ith_real_dart(next_index(i)), + get_opposite_ith_real_dart(i)); + } + + /// Computes all positive turns of this path. + std::vector compute_positive_turns() const + { + std::vector res; + if (is_empty()) return res; + + std::size_t i; + for (i=0; i compute_negative_turns() const + { + std::vector res; + if (is_empty()) return res; + + std::size_t i; + for (i=0; i compute_turns(bool p) const + { return (p?compute_positive_turns():compute_negative_turns()); } + + bool same_turns_from(const char* turns, + const std::vector& resplus, + const std::vector& resmoins, + std::size_t start) const + { + CGAL_assertion(start==0 || start>nb; + if ((nb>=0 && resplus[start]!=static_cast(nb)) || + (nb<0 && resmoins[start]!=static_cast(-nb))) + { return false; } + + start=next_index(start); + } + iss>>nb; + if (iss.good()) + { return false; } // There are more elements in turns than in res + + return true; + } + + bool same_turns(const char* turns) const + { + std::vector resplus=compute_positive_turns(); + std::vector resmoins=compute_negative_turns(); + + if (!is_closed()) + { return same_turns_from(turns, resplus, resmoins, 0); } + + for (std::size_t start=0; start res=compute_positive_turns(); + for (std::size_t i=0; i res=compute_negative_turns(); + for (std::size_t i=0; i::storage_type m_map; // The underlying map + std::vector m_path; /// The sequence of darts + bool m_is_closed; /// True iff the path is a cycle + std::vector m_flip; /// The sequence of flips +}; + +} // namespace Surface_mesh_topology +} // namespace CGAL + +#endif // CGAL_PATH_ON_SURFACE_H // +// EOF // diff --git a/Surface_mesh_topology/include/CGAL/Polygonal_schema.h b/Surface_mesh_topology/include/CGAL/Polygonal_schema.h new file mode 100644 index 00000000000..528abcce1cb --- /dev/null +++ b/Surface_mesh_topology/include/CGAL/Polygonal_schema.h @@ -0,0 +1,597 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_POLYGONAL_SCHEMA_H +#define CGAL_POLYGONAL_SCHEMA_H 1 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace CGAL { +namespace Surface_mesh_topology { + + namespace internal + { + /// @return opposite label of label s + /// (i.e. add/remove - depending if s is positive or negative) + inline std::string opposite_label(const std::string& s) + { + CGAL_assertion(!s.empty()); + if (s[0]=='-') + { return s.substr(1, std::string::npos); } + + return std::string("-")+s; + } + + template + struct Polygonal_schema_tools + {}; + template + struct Polygonal_schema_tools + { + typedef typename CMap::Dart_handle Dart_handle; + + static Dart_handle + add_edge_to_face(CMap& cmap, const std::string& s, + Dart_handle prev_dart, + Dart_handle dart_same_label, + Dart_handle dart_opposite_label, + std::unordered_map& + edge_label_to_dart) + { + if (dart_same_label!=nullptr && dart_opposite_label!=nullptr) + { + std::cerr<<"Polygonal_schema ERROR: "<<"both labels "<(prev_dart, res); } + + if (dart_opposite_label!=nullptr) + { cmap.template link_beta<2>(res, dart_opposite_label); } + + return res; + } + + const std::string& get_label(CMap& cmap, Dart_handle dh) const + { return cmap.info(dh).m_label; } + }; + template + struct Polygonal_schema_tools + { + typedef typename GMap::Dart_handle Dart_handle; + + // In a GMap, if an edge is 2-free, only one of its two dart has one label. + // Otherwise, d has one label and alpha<0,2>(d) the opposite label. + static Dart_handle + add_edge_to_face(GMap& gmap, const std::string& s, + Dart_handle prev_dart, + Dart_handle dart_same_label, + Dart_handle dart_opposite_label, + std::unordered_map& + edge_label_to_dart) + { + if (dart_same_label!=nullptr && dart_opposite_label!=nullptr) + { + std::cerr<<"Polygonal_schema ERROR: "<<"both labels "<(res, dh2); + if (prev_dart!=gmap.null_handle) + { gmap.template link_alpha<1>(res, gmap.template alpha<0>(prev_dart)); } + + if (dart_same_label!=nullptr) + { // Here dart_same_label!=nullptr + std::string s2=internal::opposite_label(s); + edge_label_to_dart[s2]=dh2; + gmap.info(dh2).m_label=s2; + + gmap.template sew<2>(res, dart_same_label); + } + else + { // Here either dart_opposite_label!=nullptr, or both are nullptr + edge_label_to_dart[s]=res; + gmap.info(res).m_label=s; + + if (dart_opposite_label!=nullptr) + { + std::string s2=internal::opposite_label(s); + edge_label_to_dart[s2]=res; + gmap.info(res).m_label=s2; + + gmap.template sew<2>(dh2, dart_opposite_label); + } + } + + return res; + } + + std::string get_label(GMap& gmap, Dart_handle dh) const + { + if (gmap.info(dh).m_label.empty()) + { + if (!gmap.template is_free<2>(dh)) + { return gmap.info(gmap.template alpha<2>(dh)).m_label; } + else + { + return internal::opposite_label(gmap.info(gmap.template alpha<0>(dh))); + } + } + return gmap.info(dh).m_label; + } + }; + + } + // end namespace internal + + struct Combinatorial_map_tag; + struct Generalized_map_tag; + + template < class BaseModel > + class Polygonal_schema_base: public BaseModel + { + public: + typedef BaseModel Base; + typedef Polygonal_schema_base Self; + typedef BaseModel Map; // Either a GMap or a CMap + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::Dart_const_handle Dart_const_handle; + typedef typename Map::size_type size_type; + + Polygonal_schema_base() : Base(), + mark_perforated(this->get_new_mark()), + first_dart(this->null_handle), + prev_dart(this->null_handle), + facet_started(false) + {} + + /// Start a new facet. + void init_facet() + { + if (facet_started) + { + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to start a facet" + <<" but the previous facet is not yet ended."<null_handle; + prev_dart = this->null_handle; + facet_started=true; + } + + /// Add one edge to the current facet, given by its label + /// (any string, using minus sign for orientation) + void add_edge_to_facet(const std::string& s) + { + if (!facet_started) + { + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to add an edge to a facet" + <<" but the facet is not yet started."<:: + add_edge_to_face(*this, s, prev_dart, dart_same_label, + dart_opposite_label, edge_label_to_dart); + + if (prev_dart==this->null_handle) + { first_dart=cur; } + + prev_dart=cur; + } + + /// add all the given edges to the current facet. + /// @param s the sequence of labels of edges to add. + void add_edges_to_facet(const std::string& s) + { + if (!facet_started) + { + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to add edges to a facet" + <<" but the facet is not yet started."< l) + { + if (!facet_started) + { + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to add edges to a facet" + <<" but the facet is not yet started."< l) + { + if (facet_started) + { + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to add a new facet" + <<" but the previous facet is not yet ended."<null_handle && + prev_dart!=this->null_handle ); + this->set_next(prev_dart, first_dart); + + facet_started=false; + return first_dart; + } + + /// @return dart with the given label, nullptr if this dart does not exist. + Dart_handle get_dart_labeled(const std::string& s) const + { + auto ite=edge_label_to_dart.find(s); + if (ite==edge_label_to_dart.end()) + { return nullptr; } + + return ite->second; + } + + std::string get_label(Dart_handle dh) const + { return internal::Polygonal_schema_tools::get_label(dh); } + + /// marks the whole facet containing dh as perforated + /// @return the number of darts of the marked face + size_type perforate_facet(Dart_handle dh) + { + if (this->is_marked(dh, mark_perforated)) + { return 0; } + + return this->template mark_cell<2>(dh, mark_perforated); + } + + /// same method but using a label + size_type perforate_facet(const std::string& s) + { + auto ite=edge_label_to_dart.find(s); + if (ite==edge_label_to_dart.end()) + {// maybe there is no need to put an error message + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to label "<second); + } + + /// unmark the facet as being perforated, now the facet is filled + /// @return the number of darts of the unmarked face + size_type fill_facet(Dart_handle dh) + { + if (!this->is_marked(dh, mark_perforated)) + { return 0; } + + return this->template unmark_cell<2>(dh, mark_perforated); + } + + /// same fonciton but using a label + size_type fill_facet(const std::string& s) + { + auto ite=edge_label_to_dart.find(s); + if (ite==edge_label_to_dart.end()) + {// maybe there is no need to put an error message + std::cerr<<"Polygonal_schema ERROR: " + <<"you try to label "<second); + } + + /// @return true iff dh is on a perforated facet + bool is_perforated(Dart_const_handle dh) const + { return this->is_marked(dh, mark_perforated); } + + /// same thing but using a label instead of a dart + bool is_perforated(const std::string& s) const + { + auto ite=edge_label_to_dart.find(s); + if (ite==edge_label_to_dart.end()) + {// maybe there is no need to put an error message + std::cerr<<"Polygonal_schema ERROR: " + <<"you ask if label "<second); + } + + std::size_t get_perforated_mark() const + { return mark_perforated; } + + void display_perforated_darts() const + { + std::cout<<"labels is_free<2> is_perforated"<first<<" "<(it->second) + <<" "<second)< edge_label_to_dart; + std::size_t mark_perforated; // mark for perforated facets. + + // Data members used when we create a facet. + Dart_handle first_dart; + Dart_handle prev_dart; + bool facet_started; + }; + + /// Polygonal schema with combinatorial map. + template > + class Polygonal_schema_with_combinatorial_map: + public Polygonal_schema_base, + Items_, Alloc_, Storage_> > + { + public: + typedef Polygonal_schema_with_combinatorial_map Self; + typedef Combinatorial_map_base<2, Self, Items_, Alloc_, Storage_> CMap_base; + typedef Polygonal_schema_base Base; + + typedef typename Base::Dart_handle Dart_handle; + typedef typename Base::Dart_const_handle Dart_const_handle; + + Polygonal_schema_with_combinatorial_map() : Base() + {} + + Polygonal_schema_with_combinatorial_map(const Self& amap) : Base(amap) + {} + + template + Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base + & + amap) : Base(amap) + {} + + template + Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base + & + amap, const Converters& converters) : + Base(amap, converters) + {} + + template + Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base + & + amap, const Converters& converters, + const DartInfoConverter& dartinfoconverter) : + Base(amap, converters, dartinfoconverter) + {} + + template + Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base + & + amap, const Converters& converters, + const DartInfoConverter& dartinfoconverter, + const PointConverter& pointconverter) : + Base(amap, converters, dartinfoconverter, pointconverter) + {} + }; + + /// Polygonal schema with generalized map. + template > + class Polygonal_schema_with_generalized_map: + public Polygonal_schema_base, + Items_, Alloc_, Storage_> > + { + public: + typedef Polygonal_schema_with_generalized_map Self; + typedef Generalized_map_base<2, Self, Items_, Alloc_, Storage_> GMap_base; + typedef Polygonal_schema_base Base; + + typedef typename Base::Dart_handle Dart_handle; + typedef typename Base::Dart_const_handle Dart_const_handle; + + Polygonal_schema_with_generalized_map() : Base() + {} + + Polygonal_schema_with_generalized_map(const Self& amap) : Base(amap) + {} + + template + Polygonal_schema_with_generalized_map(const Generalized_map_base + & + amap) : Base(amap) + {} + + template + Polygonal_schema_with_generalized_map(const Generalized_map_base + & + amap, const Converters& converters) : + Base(amap, converters) + {} + + template + Polygonal_schema_with_generalized_map(const Generalized_map_base + & + amap, const Converters& converters, + const DartInfoConverter& dartinfoconverter) : + Base(amap, converters, dartinfoconverter) + {} + + template + Polygonal_schema_with_generalized_map(const Generalized_map_base + & + amap, const Converters& converters, + const DartInfoConverter& dartinfoconverter, + const PointConverter& pointconverter) : + Base(amap, converters, dartinfoconverter, pointconverter) + {} + }; + + /// Generate a random polygonal schema ps. + /// @param nb_labels the number of labels used to generate ps. + /// @param seed the seed used for random + /// @param max_dart_per_face maximal number of darts per face + /// @param closed if true generates a closed polygonal schema. + /// @param percentage_of_perforated percentage of perforated faces. If 0 + /// no perforated faces. + template + void generate_random_polygonal_schema(PS& ps, std::size_t nb_labels, + unsigned int seed + =static_cast(std::time(nullptr)), + std::size_t max_dart_per_face=30, + bool closed=true, + std::size_t percentage_of_perforated=20) + { + CGAL::Random random(seed); + std::vector all_labels(nb_labels*2); + for (std::size_t i=0; i(i)+1); + all_labels[(2*i)+1]=std::to_string(-(static_cast(i)+1)); + } + + std::shuffle(all_labels.begin(), all_labels.end(), + std::default_random_engine(seed)); + + std::size_t endlabel=all_labels.size(); + if (!closed) + { endlabel-=(all_labels.size()/10); } // We remove 10% of labels. + + for (std::size_t i=0; i + (random.get_int(1, static_cast(max_dart_per_face))); + i(rand()%100) +// +#ifndef CGAL_POLYGONAL_SCHEMA_MIN_ITEMS_H +#define CGAL_POLYGONAL_SCHEMA_MIN_ITEMS_H 1 + +#include +#include + +namespace CGAL { +namespace Surface_mesh_topology { + + /** @file Polygonal_schema_min_items.h + * Definition of min item class for Polygonal_schema. + */ + + /** Minimal items for polygonal schema. + * Generic_map_min_items defines what is the minimal item class for a generic map. + * One struct associated with darts, having one std::string named m_label.. + */ + struct Polygonal_schema_min_items + { + template < class Refs > + struct Dart_wrapper + { + struct Info_for_darts + { std::string m_label; }; + + typedef Info_for_darts Dart_info; + }; + }; + +} // namespace Surface_mesh_topology +} // namespace CGAL + +#endif // CGAL_POLYGONAL_SCHEMA_MIN_ITEMS_H +// EOF // diff --git a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h new file mode 100644 index 00000000000..064425a7bbe --- /dev/null +++ b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h @@ -0,0 +1,1601 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_MINIMAL_QUADRANGULATION_H +#define CGAL_MINIMAL_QUADRANGULATION_H 1 + +// Should be defined before to include Path_on_surface_with_rle.h +// If nothing is defined, use V1 +// #define CGAL_PWRLE_TURN_V1 // Compute turns by turning (method of CMap) +// #define CGAL_PWRLE_TURN_V2 // Compute turns by using an id of darts, given by an hash-table (built and given by Minimal_quadrangulation) +#define CGAL_PWRLE_TURN_V3 // Compute turns by using an id of darts, associated in Info of Darts (build by Minimal_quadrangulation) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace CGAL { +namespace Surface_mesh_topology { +namespace internal { + +struct Reduced_map_items +{ + template + struct Dart_wrapper + { +#ifdef CGAL_PWRLE_TURN_V3 + typedef std::size_t Dart_info; +#endif // CGAL_PWRLE_TURN_V3 + typedef CGAL::Cell_attribute Vertex_attribute; + typedef CGAL::cpp11::tuple Attributes; + }; +}; + +template +class Minimal_quadrangulation +{ +public: + typedef Minimal_quadrangulation Self; + typedef Mesh_ Mesh; + + typedef typename Get_map::type Original_map; // Mesh seen as a 2-map + typedef typename Original_map::Dart_const_handle Original_dart_const_handle; + + typedef CGAL::Combinatorial_map<2, Reduced_map_items> Reduced_map; + typedef typename Reduced_map::Dart_handle Dart_handle; + typedef typename Reduced_map::Dart_const_handle Dart_const_handle; + + // Associate each dart of the original map, not removed, a pair of darts in + // the reduced map. + typedef std::unordered_map > TPaths; + + // Associations between original darts and their copy. + // Use only locally during the construction of the minimal quadrangulation. + typedef std::unordered_map Origin_to_copy; + typedef std::unordered_map Copy_to_origin; + +#ifdef CGAL_PWRLE_TURN_V2 + typedef std::unordered_map TDartIds; +#endif //CGAL_PWRLE_TURN_V2 + + /// @return the original map + const Original_map& get_original_map() const + { return m_original_map; } + + /// @return the reduced map + const Reduced_map& get_reduced_map() const + { return m_reduced_map; } + + /// @return the reduced map + Reduced_map& get_reduced_map() + { return m_reduced_map; } + + /// Constructor taking a mesh as parameter. + Minimal_quadrangulation(const Mesh& amesh, bool display_time=false) : + m_original_map(amesh) + { + if (!get_original_map().is_without_boundary(1)) + { + std::cerr<<"ERROR: the given amap has 1-boundaries; " + <<"such a surface is not possible to process here." + <(dh2)) + <(dh2); + } + while(dh2!=it); + } + } + get_reduced_map().free_mark(marktemp); + get_reduced_map().display_darts(std::cout); +#endif + + if (display_time) + { + t.stop(); + std::cout<<"[TIME] Total time for computation of reduced map: " + <& p, + bool display_time=false) const + { + if (p.is_empty()) + { return true; } + + if (!p.is_closed()) + { + std::cerr<<"Error: is_contractible requires a closed path."< + pt=transform_original_path_into_quad_surface_for_torus(p); + + int a, b; + count_edges_of_path_on_torus(pt, a, b); + res=(a==0 && b==0); + } + else + { + internal::Path_on_surface_with_rle + pt=transform_original_path_into_quad_surface_with_rle(p); + + pt.canonize(); + res=pt.is_empty(); + } + + if (display_time) + { + t.stop(); + std::cout<<"[TIME] is_contractible: "<& p1, + const Path_on_surface& p2, + bool display_time=false) const + { + if (p1.is_empty() && p2.is_empty()) { return true; } + + if ((!p1.is_empty() && !p1.is_closed()) || + (!p2.is_empty() && !p2.is_closed())) + { + std::cerr<<"Error: are_freely_homotopic requires two closed paths." + < + pt1=transform_original_path_into_quad_surface_for_torus(p1); + Path_on_surface + pt2=transform_original_path_into_quad_surface_for_torus(p2); + + int a1, a2, b1, b2; + count_edges_of_path_on_torus(pt1, a1, b1); + count_edges_of_path_on_torus(pt2, a2, b2); + res=(a1==a2 && b1==b2); + } + else + { + internal::Path_on_surface_with_rle + pt1=transform_original_path_into_quad_surface_with_rle(p1); + internal::Path_on_surface_with_rle + pt2=transform_original_path_into_quad_surface_with_rle(p2); + pt1.canonize(); + pt2.canonize(); + res=(pt1==pt2); // Do here to be counted in the computation time + +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"Length of reduced paths: "<& p1, + const Path_on_surface& p2, + bool display_time=false) const + { + if (p1.is_empty() && p2.is_empty()) { return true; } + if (p1.is_empty() || p2.is_empty()) { return false; } + + if (!get_original_map().template belong_to_same_cell<0> + (p1.front_flip()?get_original_map().template beta<1>(p1.front()):p1.front(), + p2.front_flip()?get_original_map().template beta<1>(p2.front()):p2.front()) || + !get_original_map().template belong_to_same_cell<0> + (p1.back_flip()?p1.back():get_original_map().template beta<1>(p1.back()), + p2.back_flip()?p2.back():get_original_map().template beta<1>(p2.back()))) + { + std::cerr<<"Error: are_base_point_homotopic requires two paths that" + <<" share the same vertices as extremities."< path=p1; + Path_on_surface path2=p2; path2.reverse(); + path+=path2; + + bool res=is_contractible(path); + + if (display_time) + { + t.stop(); + std::cout<<"[TIME] are_base_point_homotopic: "<(dh1), dh2); +#else // defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + + CGAL_assertion((!get_reduced_map().template is_free<1>(dh1))); + CGAL_assertion((!get_reduced_map().template is_free<2>(dh1))); + + if (dh2==get_reduced_map().template beta<2>(dh1) && + dh2==get_reduced_map().template beta<1>(dh1)) + { return 0; } + + if (get_reduced_map().is_marked(dh1, m_mark_hole)) + { return std::numeric_limits::max(); } + + Dart_const_handle ddh1=dh1; + std::size_t res=1; + while (get_reduced_map().template beta<1>(ddh1)!=dh2) + { + CGAL_assertion(!get_reduced_map().template is_free<2> + (get_reduced_map().template beta<1>(ddh1))); + + ++res; + ddh1=get_reduced_map().template beta<1, 2>(ddh1); + if (get_reduced_map().is_marked(ddh1, m_mark_hole)) + { return std::numeric_limits::max(); } + + CGAL_assertion(!get_reduced_map().template is_free<1>(ddh1)); + CGAL_assertion(get_reduced_map().template beta<1>(ddh1)==dh2 || ddh1!=dh1); + } + return res; +#endif // defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + } + + /// @return the negative turn between the two given darts. + /// i.e. turning right if the face bounded by a dart lays on its left + /// and left otherwise + std::size_t negative_turn(Dart_const_handle dh1, + Dart_const_handle dh2) const + { +#if defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + return compute_negative_turn_given_ids + (get_reduced_map().template beta<2>(dh1), dh2); +#else // defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + + CGAL_assertion((!get_reduced_map().template is_free<1>(dh1))); + CGAL_assertion((!get_reduced_map().template is_free<2>(dh1))); + + if (dh2==get_reduced_map().template beta<2>(dh1) && + dh1==get_reduced_map().template beta<0>(dh2)) + { return 0; } + + if (get_reduced_map().is_marked + (get_reduced_map().template beta <2>(dh1), m_mark_hole)) + { return std::numeric_limits::max(); } + + dh1=get_reduced_map().template beta<2>(dh1); + dh2=get_reduced_map().template beta<2>(dh2); + Dart_const_handle ddh1=dh1; + std::size_t res=1; + while (get_reduced_map().template beta<0>(ddh1)!=dh2) + { + CGAL_assertion(!get_reduced_map().template is_free<2> + (get_reduced_map().template beta<0>(ddh1))); + + ++res; + ddh1=get_reduced_map().template beta<0, 2>(ddh1); + if (get_reduced_map().is_marked(ddh1, m_mark_hole)) + { return std::numeric_limits::max(); } + + CGAL_assertion(!get_reduced_map().template is_free<0>(ddh1)); + CGAL_assertion(get_reduced_map().template beta<0>(ddh1)==dh2 || ddh1!=dh1); + } + return res; +#endif // defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + } + +protected: + + /// @return true iff the dart dh is contracted, i.e. if it belongs to T + bool is_contracted(Original_dart_const_handle dh) const + { return get_original_map().is_marked(dh, m_mark_T); } + + void count_edges_of_path_on_torus + (const Path_on_surface& path, + int& a, int& b) const + { + CGAL_assertion(reduced_map_is_a_torus()); + + Dart_const_handle dha=get_reduced_map().darts().begin(); + Dart_const_handle dhb=get_reduced_map().template beta<1>(dha); + + a=0; b=0; + for (std::size_t i=0; i(dha)) { ++a; } + else if (path[i]==dhb) { --b; } + else if (path[i]==get_reduced_map().template beta<2>(dhb)) { ++b; } + } + else + { + if (path[i]==dha) { ++a; } + else if (path[i]==get_reduced_map().template beta<2>(dha)) { --a; } + else if (path[i]==dhb) { ++b; } + else if (path[i]==get_reduced_map().template beta<2>(dhb)) { --b; } + } + } + } + + Path_on_surface + transform_original_path_into_quad_surface_for_torus + (const Path_on_surface& path) const + { + CGAL_assertion(reduced_map_is_a_torus()); + + Path_on_surface res(get_reduced_map()); + if (path.is_empty()) return res; + + Dart_const_handle cur; + for (std::size_t i=0; i(cur); + } + } + } + res.update_is_closed(); + CGAL_assertion(res.is_empty() || res.is_closed()); + CGAL_assertion(res.is_valid()); + return res; + } + + internal::Path_on_surface_with_rle + transform_original_path_into_quad_surface_with_rle + (const Path_on_surface& path) const + { + internal::Path_on_surface_with_rle + res(*this +#ifdef CGAL_PWRLE_TURN_V2 + , m_dart_ids +#endif //CGAL_PWRLE_TURN_V2 + ); + + if (path.is_empty()) return res; + + for (std::size_t i=0; i(adart)) + { get_original_map().mark(get_original_map().template beta<2>(adart), + amark); } + } + + /// Mark the edge containing adart in the reduced map (which is 2-closed) + void mark_reduced_edge(Dart_const_handle adart, std::size_t amark) + { + get_reduced_map().mark(adart, amark); + get_reduced_map().mark(get_reduced_map().template beta<2>(adart), amark); + } + + /// Erase the edge given by adart (which belongs to the map m_reduced_map, i.e. the + /// copy) from the associative array copy_to_origin, and erase the + /// corresponding edge (which belongs to the map get_original_map()) from the + /// array origin_to_copy + void erase_edge_from_associative_arrays(Dart_handle adart, + Origin_to_copy& origin_to_copy, + Copy_to_origin & copy_to_origin) + { + if (!get_original_map().template is_free<2>(copy_to_origin[adart])) + { + origin_to_copy.erase(get_original_map().template beta<2> + (copy_to_origin[adart])); + copy_to_origin.erase(get_reduced_map().template beta<2>(adart)); + } + + origin_to_copy.erase(copy_to_origin[adart]); + copy_to_origin.erase(adart); + } + + Original_dart_const_handle prev_in_boundary(Original_dart_const_handle d) + { + CGAL_assertion(get_original_map().template is_free<2>(d)); + Original_dart_const_handle res=get_original_map().template beta<0>(d); + while(!get_original_map().template is_free<2>(res)) + { res=get_original_map().template beta<2, 0>(res); } + return res; + } + + /// Step 1) Transform m_reduced_map into an equivalent surface having only one + /// vertex. All edges contracted during this step belong to the spanning + /// tree T, and thus corresponding edges in get_original_map() are marked. + + /// Marks all darts belonging to T using a BFS + void compute_T() + { + Original_dart_const_handle dh; + auto grey=get_original_map().get_new_mark(); + std::queue queue; + get_original_map().template mark_cell<0> + (get_original_map().darts().begin(), grey); + queue.push(get_original_map().darts().begin()); + + while (!queue.empty()) + { + dh=queue.front(); + queue.pop(); + for (auto it=get_original_map().template darts_of_cell<0>(dh).begin(), + itend=get_original_map().template darts_of_cell<0>(dh).end(); + it!=itend; ++it) + { + if (!get_original_map().is_marked + (get_original_map().template beta<1>(it), grey)) + { + mark_original_edge(it, m_mark_T); + get_original_map().template mark_cell<0> + (get_original_map().template beta<1>(it), grey); + queue.push(get_original_map().template beta<1>(it)); + } + } + } + + CGAL_assertion(get_original_map().is_whole_map_marked(grey)); + get_original_map().free_mark(grey); + } + + /// Step 1) Create the copy of the input mesh, while contracting all edges of + /// THE spanning tree. Initializes also m_path, the pair of darts of the edge + /// in m_copy. This pair of edges will be updated later + /// (in surface_simplification_in_one_face() and in surface_quadrangulate()). + void surface_simplification_in_one_vertex + (Origin_to_copy& origin_to_copy,Copy_to_origin& copy_to_origin) + { + m_paths.clear(); + compute_T(); + + Dart_handle d1, d2; + for (typename Original_map::Dart_range::const_iterator + it=get_original_map().darts().begin(), + itend=get_original_map().darts().end(); it!=itend; ++it) + { + if (!get_original_map().is_marked(it, m_mark_T)) + { + if (get_original_map().template is_free<2>(it)) + {// case of a boundary + d1=get_reduced_map().create_dart(); + d2=get_reduced_map().create_dart(); + get_reduced_map().template basic_link_beta_for_involution<2>(d1, d2); + + origin_to_copy[it]=d1; + copy_to_origin[d1]=it; + get_reduced_map().mark(d2, m_mark_perforated); + if (get_original_map().is_perforated(it)) + { get_reduced_map().mark(d1, m_mark_perforated); } + + m_paths[it]=std::make_pair(d1, nullptr); // Initialize m_paths + } + else if (Original_dart_const_handle(it)< + get_original_map().template beta<2>(it)) + { + d1=get_reduced_map().create_dart(); + d2=get_reduced_map().create_dart(); + get_reduced_map().template basic_link_beta_for_involution<2>(d1, d2); + + origin_to_copy[it]=d1; + origin_to_copy[get_original_map().template beta<2>(it)]=d2; + copy_to_origin[d1]=it; + copy_to_origin[d2]=get_original_map().template beta<2>(it); + + if (get_original_map().is_perforated(it)) + { get_reduced_map().mark(d1, m_mark_perforated); } + if (get_original_map().is_perforated + (get_original_map().template beta<2>(it))) + { get_reduced_map().mark(d2, m_mark_perforated); } + + m_paths[it]=std::make_pair(d1, nullptr); // Initialize m_paths + } + } + } + + /// Now we only need to do the basic_link_beta_1 + Original_dart_const_handle dd1; + for (typename Original_map::Dart_range::const_iterator + it=get_original_map().darts().begin(), + itend=get_original_map().darts().end(); it!=itend; ++it) + { + if (!get_original_map().is_marked(it, m_mark_T)) + { + dd1=get_original_map().template beta<1>(it); + while(get_original_map().is_marked(dd1, m_mark_T)) + { dd1=get_original_map().template beta<1>(dd1); } + get_reduced_map().basic_link_beta_1(origin_to_copy[it], + origin_to_copy[dd1]); // let's link both + + if (get_original_map().template is_free<2>(it)) + { + dd1=prev_in_boundary(it); + while(get_original_map().is_marked(dd1, m_mark_T)) + { dd1=prev_in_boundary(dd1); } + get_reduced_map().basic_link_beta_1 + (get_reduced_map().template beta<2>(origin_to_copy[it]), + get_reduced_map().template beta<2>(origin_to_copy[dd1])); + } + } + } + } + + /// Step 2) Transform the 2-map into an equivalent surface having only + /// one face. All edges removed during this step belong to the + /// dual spanning tree L (spanning tree of the dual 2-map). + + /// Marks all darts belonging to L using a BFS + void compute_L(typename Reduced_map::size_type toremove, + Copy_to_origin& copy_to_origin) + { + Dart_handle dh; + Dart_handle ddh; + auto grey=get_reduced_map().get_new_mark(); + std::queue queue; + + for (auto it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + if (!get_reduced_map().is_marked(it, grey)) + { + get_reduced_map().template mark_cell<2>(it, grey); + if (!get_reduced_map().is_marked(it, m_mark_perforated)) + { + queue.push(it); + + while (!queue.empty()) + { + dh=queue.front(); // face(dh) is not perforated (and thus all its darts) + queue.pop(); + ddh=dh; + do + { + if (!get_reduced_map().is_marked + (get_reduced_map().template beta<2>(ddh), grey) && + !get_reduced_map().is_marked + (get_reduced_map().template beta<2>(ddh), m_mark_perforated)) + { + mark_reduced_edge(ddh, toremove); + mark_original_edge(copy_to_origin[ddh], m_mark_L); + get_reduced_map().template mark_cell<2> + (get_reduced_map().template beta<2>(ddh), grey); + queue.push(get_reduced_map().template beta<2>(ddh)); + } + ddh=get_reduced_map().template beta<1>(ddh); + } + while (dh!=ddh); + } + } + } + } + + CGAL_assertion(get_reduced_map().is_whole_map_marked(grey)); + get_reduced_map().free_mark(grey); + } + + /// Update all length two paths, before edge removal. Edges that will be + /// removed are marked with toremove mark. Dart mark as perforated are not + /// updates, since they are associated only with their corresponding dart + /// in the original map (and thus with only one dart and not two). + void update_length_two_paths_before_edge_removals + (typename Original_map::size_type toremove, Copy_to_origin& copy_to_origin) + { + // std::cout<<"************************************************"<(initdart); + while(get_reduced_map().is_marked(curdart, toremove)) + { // Here, all edges marked to remove are between two real faces. + CGAL_assertion(copy_to_origin.count(curdart)==1); + set_first_dart_of_the_path(copy_to_origin.find(curdart)->second, + initdart); + curdart=get_reduced_map().template beta<0, 2>(curdart); + } + + if (!get_reduced_map().is_marked + (get_reduced_map().template beta<2>(curdart), m_mark_perforated)) + { + d1=copy_to_origin.find(get_reduced_map().template beta<2>(curdart))->second; + if (get_original_map().template is_free<2>(d1) || + d1(d1)) + { m_paths[d1].second=initdart; } + } + } + } + +#ifndef NDEBUG + for (auto it=m_paths.begin(), itend=m_paths.end(); it!=itend; ++it) + { + CGAL_assertion(!get_reduced_map().is_marked(it->second.first, toremove)); + CGAL_assertion(it->second.second==nullptr || + !get_reduced_map().is_marked(it->second.second, toremove)); + } +#endif + } + + /// Remove all loops after having merge all real faces in one. + /// Erase from m_paths all darts linked with such a dart. + void remove_non_perforated_loops(Copy_to_origin& copy_to_origin) + { + get_reduced_map().set_automatic_attributes_management(false); + + Original_dart_const_handle origin_dart; + for (typename Reduced_map::Dart_range::iterator + it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + if (get_reduced_map().is_dart_used(it) && + !get_reduced_map().is_marked(it, m_mark_perforated) && + get_reduced_map().template beta<1>(it)==it) + { // A non perforated loop. + origin_dart=copy_to_origin[it]; + if (!get_original_map().template is_free<2>(origin_dart) && + origin_dart>get_original_map().template beta<2>(origin_dart)) + { origin_dart=get_original_map().template beta<2>(origin_dart); } + + mark_original_edge(origin_dart, m_mark_T); + + if (get_reduced_map().is_marked(get_reduced_map().template beta<2>(it), + m_mark_perforated)) + { get_reduced_map().template mark_cell<2>(it, m_mark_perforated); } + + get_reduced_map().template remove_cell<1>(it); + } + } + + get_reduced_map().set_automatic_attributes_management(true); + + /// We remove from m_paths all associations having a removed dart + for (auto it=m_paths.begin(), itend=m_paths.end(); it!=itend; ) + { + if (!get_reduced_map().is_dart_used(it->second.first)) + { + mark_original_edge(it->first, m_mark_T); + it=m_paths.erase(it); + } + else if (it->second.second!=nullptr && + !get_reduced_map().is_dart_used(it->second.second)) + { + mark_original_edge(it->first, m_mark_T); + it=m_paths.erase(it); + } + else { ++it; } + } + } + + /// Simplify the reduced map by merging all adjacent non perforated faces. + void surface_simplification_in_one_face + (Origin_to_copy& origin_to_copy, Copy_to_origin& copy_to_origin) + { + get_reduced_map().set_automatic_attributes_management(false); + + typename Reduced_map::size_type toremove=get_reduced_map().get_new_mark(); + compute_L(toremove, copy_to_origin); + + if (get_reduced_map().number_of_marked_darts(toremove)== + get_reduced_map().number_of_darts()) + { // Case of sphere; all darts are removed. + m_paths.clear(); + get_reduced_map().clear(); + } + else + { + // Update the length two paths before to remove the edges. + update_length_two_paths_before_edge_removals(toremove, copy_to_origin); + + // Then remove all the edges marekd to remove. + for (typename Reduced_map::Dart_range::iterator + it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + if (get_reduced_map().is_dart_used(it) && + get_reduced_map().is_marked(it, toremove)) + { + CGAL_assertion(get_reduced_map().is_marked + (get_reduced_map().template beta<2>(it), toremove)); + erase_edge_from_associative_arrays(it, origin_to_copy, copy_to_origin); + get_reduced_map().template remove_cell<1>(it); + } + } + } + + get_reduced_map().set_automatic_attributes_management(true); + get_reduced_map().free_mark(toremove); + +#ifndef NDEBUG + for (auto it=m_paths.begin(), itend=m_paths.end(); it!=itend; ++it) + { + CGAL_assertion(get_reduced_map().is_dart_used(it->second.first)); + CGAL_assertion(it->second.second==nullptr || + get_reduced_map().is_dart_used(it->second.second)); + } +#endif + } + + /// Step 4) quadrangulate the surface. + void surface_quadrangulate() + { + // Here the map has only one vertex and one face if we have a closed surface, + // and maybe several faces if the surface has boundaries + typename Reduced_map::size_type oldedges=get_reduced_map().get_new_mark(); + get_reduced_map().negate_mark(oldedges); // now all edges are marked + + // 1) We insert a vertex in each face which is not perforated. + // New edges created by the operation are not marked oldedges. + typename Reduced_map::size_type treated=get_reduced_map().get_new_mark(); + + for (typename Reduced_map::Dart_range::iterator + it=get_reduced_map().darts().begin(); + it!=get_reduced_map().darts().end(); ++it) + { + if (!get_reduced_map().is_marked(it, treated)) + { + get_reduced_map().template mark_cell<2>(it, treated); + if (get_reduced_map().is_marked(it, oldedges) && + !get_reduced_map().is_marked(it, m_mark_perforated)) + { + CGAL_assertion(get_reduced_map().template beta<1>(it)!=it); + get_reduced_map().negate_mark(treated); // To mark new darts treated + get_reduced_map().insert_cell_0_in_cell_2(it); + get_reduced_map().negate_mark(treated); + } + } + } + CGAL_assertion(get_reduced_map().is_whole_map_marked(treated)); + get_reduced_map().free_mark(treated); + +#ifdef NDEBUG + for (typename Reduced_map::Dart_range::iterator + it=get_reduced_map().darts().begin(); + it!=get_reduced_map().darts().end(); ++it) + { + if (!get_reduced_map().is_marked(it, m_mark_perforated)) + { + CGAL_assertion(get_reduced_map().template beta<1>(it)!=it); + CGAL_assertion((get_reduced_map().template beta<1,1,1>(it)==it)); + } + } +#endif + + // 2) We update the pair of darts + for (typename TPaths::iterator itp=m_paths.begin(), itpend=m_paths.end(); + itp!=itpend; ++itp) + { + std::pair& p=itp->second; + if (p.second!=nullptr) + { // Edge between two real faces, removed during the quadrangulation + CGAL_assertion(!get_reduced_map().is_marked(p.first, m_mark_perforated)); + CGAL_assertion(!get_reduced_map().is_marked(p.second, m_mark_perforated)); + CGAL_assertion(get_reduced_map().template beta<1>(p.first)!=p.first); + CGAL_assertion(get_reduced_map().template beta<1>(p.second)!=p.second); + CGAL_assertion(get_reduced_map().is_marked(p.first, oldedges)); + CGAL_assertion(get_reduced_map().is_marked(p.second, oldedges)); + CGAL_assertion((get_reduced_map().template beta<1,1,1>(p.first)==p.first)); + CGAL_assertion((get_reduced_map().template beta<1,1,1>(p.second)==p.second)); + p.first=get_reduced_map().template beta<0, 2>(p.first); + p.second=get_reduced_map().template beta<0>(p.second); + CGAL_assertion(!get_reduced_map().is_marked(p.first, oldedges)); + CGAL_assertion(!get_reduced_map().is_marked(p.second, oldedges)); + } + else if (!get_reduced_map().is_marked(p.first, m_mark_perforated)) + { // Edge between a real face and a perforated one, not updated during update_length_two_paths_before_edge_removals + CGAL_assertion(get_reduced_map().is_marked(p.first, oldedges)); + CGAL_assertion(get_reduced_map().template beta<1>(p.first)!=p.first); + CGAL_assertion((get_reduced_map().template beta<1,1,1>(p.first)==p.first)); + p.second=get_reduced_map().template beta<1, 2>(p.first); + p.first=get_reduced_map().template beta<0, 2>(p.first); + CGAL_assertion(!get_reduced_map().is_marked(p.first, oldedges)); + CGAL_assertion(!get_reduced_map().is_marked(p.second, oldedges)); + } + else if (!get_reduced_map().is_marked + (get_reduced_map().template beta<2>(p.first), m_mark_perforated)) + { // Edge between a perforated face and a real one, not updated during update_length_two_paths_before_edge_removals + CGAL_assertion(get_reduced_map().is_marked(p.first, oldedges)); + CGAL_assertion((get_reduced_map().template beta<2,1,1,1>(p.first)== + get_reduced_map().template beta<2>(p.first))); + CGAL_assertion((get_reduced_map().template beta<2,1>(p.first)!= + get_reduced_map().template beta<2>(p.first))); + p.first=get_reduced_map().template beta<2, 1>(p.first); + p.second=get_reduced_map().template beta<1>(p.first); + CGAL_assertion(!get_reduced_map().is_marked(p.first, oldedges)); + CGAL_assertion(!get_reduced_map().is_marked(p.second, oldedges)); + } + } + +#ifdef NDEBUG + for (auto it=m_paths.begin(), itend=m_paths.end(); it!=itend; ++it) + { + if (it->second.second==nullptr) + { + CGAL_assertion(get_reduced_map().is_marked(it->second.first, oldedges)); + CGAL_assertion(get_reduced_map().is_marked(it->second.first, m_mark_perforated) && + get_reduced_map().is_marked + (get_reduced_map().template beta<2>(it->second.first), m_mark_perforated)); + } + else + { + CGAL_assertion(!get_reduced_map().is_marked(it->second.first, oldedges)); + CGAL_assertion(!get_reduced_map().is_marked(it->second.second, oldedges)); + } + } +#endif + + // 3) We remove all the old edges, and extend the perforated faces + // (i.e. we remove edges between real and perforated faces). + for (typename Reduced_map::Dart_range::iterator + it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + if (get_reduced_map().is_dart_used(it) && + get_reduced_map().is_marked(it, oldedges) && + !get_reduced_map().is_marked(it, m_mark_perforated)) + { + get_reduced_map().unmark(it, oldedges); + if (get_reduced_map().is_marked + (get_reduced_map().template beta<2>(it), m_mark_perforated)) + { get_reduced_map().template mark_cell<2>(it, m_mark_perforated); } + get_reduced_map().template remove_cell<1>(it); + } + else { get_reduced_map().unmark(it, oldedges); } + } + + CGAL_assertion(get_reduced_map().is_whole_map_unmarked(oldedges)); + get_reduced_map().free_mark(oldedges); + +#ifdef NDEBUG + for (auto it=m_paths.begin(), itend=m_paths.end(); it!=itend; ++it) + { + CGAL_assertion(get_reduced_map().is_dart_used(it->second.first)); + CGAL_assertion(it->second.second==nullptr || + get_reduced_map().is_dart_used(it->second.second)); + } +#endif + } + +#if defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + // Initialize all vertices attributes. + // For all vertex v, the attribute of v is set to deg(v) if there is a + // hole around v and -deg(v) if there are no holes around v. + void initialize_vertices_attributes() + { + int deg; + bool hole_detected; + Dart_handle dh; + for (auto it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + if (get_reduced_map().template attribute<0>(it)==NULL) + { + // We count the degree, while testing if there is a perforated face + // incident to the vertex. + deg=0; + hole_detected=false; + dh=it; + do + { + ++deg; + if (get_reduced_map().is_marked(dh, m_mark_perforated)) + { hole_detected=true; } + dh=get_reduced_map().template beta<2, 1>(dh); + } + while(dh!=it); + + // Then we set the vertex attribute to deg id there is a + // hole and -deg otherwise + if (!hole_detected) { deg=-deg; } + + // We create the 0-attribute + get_reduced_map().template set_attribute<0> + (it, get_reduced_map().template create_attribute<0>(deg)); + } + } + } + + void initialize_ids() + { + std::size_t id; + Dart_handle dh, ddh; + auto treated=get_reduced_map().get_new_mark(); + + for (auto it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + if (!get_reduced_map().is_marked(it, treated)) + { + id=0; + if (get_reduced_map().template info<0>(it)<0) + {// there are no holes around this vertex + // we just set the ids from 0 to deg(v)-1 + dh=it; + do + { +#ifdef CGAL_PWRLE_TURN_V2 + m_dart_ids[dh]=id; +#else // CGAL_PWRLE_TURN_V2 + // this is for the turn V3 + get_reduced_map().info(dh)=id; + #endif // CGAL_PWRLE_TURN_V2 + ++id; + get_reduced_map().mark(dh, treated); + dh=get_reduced_map().template beta<2, 1>(dh); + } + while(dh!=it); + } + else + {// there is at least a hole around the vertex + // we set the 0-th dart just after a hole + // then we add 1 to the next dart if we dont cross a hole + // and we add deg(v)+1 if we cross a hole + dh=it; + while(!get_reduced_map().is_marked(dh, m_mark_perforated)) + { + dh=get_reduced_map().template beta<2, 1>(dh); + } + // now dh is right after a hole + ddh=dh; + do + { +#ifdef CGAL_PWRLE_TURN_V2 + m_dart_ids[ddh]=id; +#else // CGAL_PWRLE_TURN_V2 + // this is for the turn V3 + get_reduced_map().info(ddh)=id; + #endif // CGAL_PWRLE_TURN_V2 + if (get_reduced_map().is_marked(get_reduced_map().template beta<2>(ddh), m_mark_perforated)) + { id+=get_reduced_map().template info<0>(ddh)+1; } + else + { id+=1; } + get_reduced_map().mark(ddh, treated); + ddh=get_reduced_map().template beta<2, 1>(ddh); + } + while(ddh!=dh); + } + } + } + get_reduced_map().free_mark(treated); + } + + std::size_t get_dart_id(Dart_const_handle dh) const + { +#ifdef CGAL_PWRLE_TURN_V2 + return m_dart_ids.at(dh); +#else // CGAL_PWRLE_TURN_V2 + // this is for the turn V3 + return get_reduced_map().info(dh); +#endif // CGAL_PWRLE_TURN_V2 + std::cerr<<"Error: impossible to get dart id without method V2 or V3."<::max(); + } + + /// @return the positive turn given two darts using their ids (unsed for CGAL_PWRLE_TURN_V2 and V3) + std::size_t compute_positive_turn_given_ids(Dart_const_handle dh1, + Dart_const_handle dh2) const + { + if (get_reduced_map().template info<0>(dh1)<0) + {// there is no hole around dh1 and dh2 + if (get_dart_id(dh1)<=get_dart_id(dh2)) + { + return get_dart_id(dh2)-get_dart_id(dh1); + } + // here we have to add the degree (i.e. substract the vertex info) + return get_dart_id(dh2)-get_reduced_map().template info<0>(dh1)-get_dart_id(dh1); + } + // here we know there is a hole just before the dart 0 (plus maybe other ones) + if (get_dart_id(dh1)>get_dart_id(dh2) || // we crossed dart 0, so we crossed a hole + get_dart_id(dh2)-get_dart_id(dh1)> + static_cast(get_reduced_map().template info<0>(dh1))) // the gap is more than the degree, so we crossed a hole + {// so we return an "infinite" value + return std::numeric_limits::max(); + } + return get_dart_id(dh2)-get_dart_id(dh1); + } + + /// @return the negative turn given two darts using their ids (unsed for CGAL_PWRLE_TURN_V2 and V3) + std::size_t compute_negative_turn_given_ids(Dart_const_handle dh1, + Dart_const_handle dh2) const + { + if (get_reduced_map().template info<0>(dh1)<0) + {// there is no hole around dh1 and dh2 + if (get_dart_id(dh1)>=get_dart_id(dh2)) + { + return get_dart_id(dh1)-get_dart_id(dh2); + } + // here we have to add the degree (i.e. substract the vertex info) + return get_dart_id(dh1)-get_reduced_map().template info<0>(dh1)-get_dart_id(dh2); + } + // here we know there is a hole just before the dart 0 (plus maybe other ones) + if (get_dart_id(dh1) + static_cast(get_reduced_map().template info<0>(dh1))) // the gap is more than the degree, so we crossed a hole + {// so we return an "infinite" value + return std::numeric_limits::max(); + } + return get_dart_id(dh1)-get_dart_id(dh2); + } +#endif // defined(CGAL_PWRLE_TURN_V2) || defined(CGAL_PWRLE_TURN_V3) + + /// @return true iff the edge containing adart is associated with a path. + /// (used for debug purpose because we are suppose to be able to + /// test this by using directly the mark m_mark_T). + bool is_edge_has_path(Original_dart_const_handle adart) const + { + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { return m_paths.find(adart)!=m_paths.end(); } + return m_paths.find(get_original_map().template beta<2>(adart))!=m_paths.end(); + } + + /// @return true iff the edge containing adart is associated with a path + /// of only 1 dart (case of an edge bewteen two perforated faces) + bool edge_path_has_only_one_dart(Original_dart_const_handle adart) const + { + return + (get_original_map().is_perforated(adart) && + (get_original_map().template is_free<2>(adart) || + get_original_map().is_perforated + (get_original_map().template beta<2>(adart)))); + } + + /// @return the pair of darts associated with the edge containing adart + /// in get_original_map(). + /// @pre the edge containing adart must not belong to T. + std::pair& get_pair_of_darts + (Original_dart_const_handle adart) + { + CGAL_assertion(!is_contracted(adart)); + CGAL_assertion(is_edge_has_path(adart)); + + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + return m_paths.find(get_original_map().template beta<2>(adart))->second; + } + + /** @return the first dart of the length 2 path associated with adart. + * @param adart a dart in the original map + * @param flip to return the first dart of beta2(adart) + * @param isquadrangulation true if the minimal map is a quadrangulation, + * false otherwise (special case of a torus) + * There is a special case for an edge between two perforated faces. In this + * case there is only one dart in the path. + */ + Dart_const_handle get_first_dart_of_the_path(Original_dart_const_handle adart, + bool flip=false, + bool isquadrangulation=true) const + { + CGAL_assertion(is_edge_has_path(adart)); + + if (isquadrangulation && get_original_map().is_perforated(adart) && + (get_original_map().template is_free<2>(adart) || + get_original_map().is_perforated + (get_original_map().template beta<2>(adart)))) + { + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { + const std::pair& + p=m_paths.find(adart)->second; + return flip?get_reduced_map().template beta<2>(p.first):p.first; + } + else + { + const std::pair& + p=m_paths.find(get_original_map().template beta<2>(adart))->second; + return flip?p.first:get_reduced_map().template beta<2>(p.first); + } + } + + CGAL_assertion(!get_original_map().is_perforated(adart) || + (!get_original_map().template is_free<2>(adart) && + !get_original_map().is_perforated + (get_original_map().template beta<2>(adart)))); + + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { + const std::pair& + p=m_paths.find(adart)->second; + return flip? + (isquadrangulation?get_reduced_map().template beta<2>(p.second):p.second): + p.first; + } + + const std::pair& + p=m_paths.find(get_original_map().template beta<2>(adart))->second; + + return flip? + p.first: + (isquadrangulation?get_reduced_map().template beta<2>(p.second):p.second); + } + + /** @return the second dart of the length 2 path associated with adart. + * @param adart a dart in the original map + * @param flip to return the first dart of beta2(adart) + * @param isquadrangulation true if the minimal map is a quadrangulation, + * false otherwise (special case of a torus) + * @pre edge containing adart should be incident to at least one non + * perforated face. + */ + Dart_const_handle get_second_dart_of_the_path(Original_dart_const_handle adart, + bool flip=false, + bool isquadrangulation=true) const + { + CGAL_assertion(is_edge_has_path(adart)); + CGAL_assertion(!get_original_map().is_perforated(adart) || + (!get_original_map().template is_free<2>(adart) && + !get_original_map().is_perforated + (get_original_map().template beta<2>(adart)))); + + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { + const std::pair& + p=m_paths.find(adart)->second; + return flip? + (isquadrangulation?get_reduced_map().template beta<2>(p.first):p.first): + p.second; + } + + const std::pair& + p=m_paths.find(get_original_map().template beta<2>(adart))->second; + return flip? + p.second: + (isquadrangulation?get_reduced_map().template beta<2>(p.first):p.first); + } + + /// @return the first dart of the path, direct version without taking into + /// account possible flip and the two case of torus/quadrangulation. + Dart_handle get_first_dart_of_the_path_direct(Original_dart_const_handle adart) const + { + CGAL_assertion(is_edge_has_path(adart)); + + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { return m_paths.find(adart)->second.first; } + return m_paths.find(get_original_map().template beta<2>(adart))->second.second; + } + + void set_first_dart_of_the_path(Original_dart_const_handle adart, + Dart_handle d) + { + CGAL_assertion(is_edge_has_path(adart)); + + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { m_paths.find(adart)->second.first=d; } + else + { m_paths.find(get_original_map().template beta<2>(adart))->second.second=d; } + } + + void set_second_dart_of_the_path(Original_dart_const_handle adart, + Dart_handle d) + { + CGAL_assertion(is_edge_has_path(adart)); + + if (get_original_map().template is_free<2>(adart) || + adart(adart)) + { m_paths.find(adart)->second.second=d; } + else { m_paths.find(adart)->second.first=d; } + } + + bool reduced_map_is_a_torus() const + { + if (get_reduced_map().number_of_darts()!=4) + { return false; } + return (get_reduced_map().number_of_marked_darts(m_mark_perforated)==0); + } + + /// @return true iff the perforated faces are correctly marked + /// (i.e. either fully marked or fully unmarked). + bool perforated_faces_correctly_marked() const + { + for (typename Reduced_map::Dart_range::const_iterator + it=get_reduced_map().darts().begin(), + itend=get_reduced_map().darts().end(); it!=itend; ++it) + { + CGAL_assertion(get_reduced_map().is_without_boundary(1)); + if (get_reduced_map().is_marked(it, m_mark_perforated)) + { + if (!get_reduced_map().template is_whole_cell_marked<2> + (it, m_mark_perforated)) + { + std::cout<<"[ERROR] perforated_faces_correctly_marked: it is marked, " + <<"but its face is not fully marked."< + (it, m_mark_perforated)) + { + std::cout<<"[ERROR] perforated_faces_correctly_marked: it is not marked, " + <<"but its face is not fully unmarked."<second.first)) + { + std::cout<<"ERROR: first dart in m_paths does not exist anymore in m_reduced_map." + <second.first)) + { + std::cout<<"ERROR: first dart in m_paths does not belong to m_reduced_map." + <first)) + { + if (!get_reduced_map().is_dart_used(it->second.second)) + { + std::cout<<"ERROR: second dart in m_paths does not exist anymore in m_reduced_map." + <second.second)) + { + std::cout<<"ERROR: second dart in m_paths does not belong to m_reduced_map." + <second.first==it->second.second) + { + std::cout<<"ERROR: two darts in the same pair are equal." + < + (get_reduced_map(), dd1, d2)) + { + std::cout<<"ERROR: the two darts in a path are not consecutive." + <::storage_type m_original_map; + Reduced_map m_reduced_map; /// the reduced map + TPaths m_paths; /// Pair of edges associated with each edge of get_original_map() + /// (except the edges that belong to the spanning tree T). + std::size_t m_mark_T; /// mark each edge of get_original_map() that belong to the spanning tree T + std::size_t m_mark_L; /// mark each edge of get_original_map() that belong to the dual spanning tree L + std::size_t m_mark_perforated; /// mark each edge of m_reduced_map that bounds a hole + +#ifdef CGAL_PWRLE_TURN_V2 + TDartIds m_dart_ids; /// Ids of each dart of the transformed map, between 0 and n-1 (n being the number of darts) + /// so that darts between 0...(n/2)-1 belong to the same vertex and + /// d1=beta<1, 2>(d0), d2=beta<1, 2>(d1)... + /// The same for darts between n/2...n-1 for the second vertex + /// Thanks to these ids, we can compute in constant time the positive and + /// negative turns between two consecutive darts +#endif // CGAL_PWRLE_TURN_V2 +}; + +} // namespace internal +} // namespace Surface_mesh_topology +} // namespace CGAL + +#endif // CGAL_MINIMAL_QUADRANGULATION_H // +// EOF // diff --git a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_generators.h b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_generators.h new file mode 100644 index 00000000000..33b71ff423e --- /dev/null +++ b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_generators.h @@ -0,0 +1,231 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_PATH_GENERATORS_H +#define CGAL_PATH_GENERATORS_H 1 + +#include + +#include +#include +#include +#include + +namespace CGAL { +namespace Surface_mesh_topology { +namespace internal { + +template +void create_braket_positive(Path& p, std::size_t length, CGAL::Random& random, + bool update_isclosed=true) +{ + if (p.is_empty()) + { p.initialize_random_starting_dart(random, false); } + + p.extend_positive_turn(1, false); + p.extend_straight_positive(length, false); + p.extend_positive_turn(1, false); + if (update_isclosed) { p.update_is_closed(); } +} + +template +void create_braket_positive(Path& p, std::size_t length, + bool update_isclosed=true) +{ + CGAL::Random random; + create_braket_positive(p, length, random, update_isclosed); +} + +template +void create_braket_negative(Path& p, std::size_t length, CGAL::Random& random, + bool update_isclosed=true) +{ + if (p.is_empty()) + { p.initialize_random_starting_dart(random, false); } + + p.extend_negative_turn(1, false); + p.extend_straight_negative(length, false); + p.extend_negative_turn(1, false); + if (update_isclosed) { p.update_is_closed(); } +} + +template +void create_braket_negative(Path& p, std::size_t length, + bool update_isclosed=true) +{ + CGAL::Random random; + create_braket_negative(p, length, random, update_isclosed); +} + +template +void generate_random_positive_bracket(Path& path, + std::size_t nb1, + std::size_t nb2, std::size_t nb3, + CGAL::Random& random) +{ + path.clear(); + path.initialize_random_starting_dart(random); + path.extend_straight_positive(nb1-1); + create_braket_positive(path, nb2); + path.extend_straight_positive(nb3); + path.generate_random_path(random.get_int(0, 15), random); +} + +template +typename LCC::Dart_const_handle +generate_random_connected_set_of_faces(const LCC& lcc, std::size_t nb, + CGAL::Random& random, + std::unordered_set + & set, + typename LCC::size_type amark) +{ + set.clear(); + if (lcc.is_empty()) { return NULL; } + + std::unordered_map border_faces; + + std::size_t index=static_cast + (random.get_int(0, static_cast(lcc.darts().capacity()))); + while (!lcc.darts().is_used(index)) + { + ++index; + if (index==lcc.darts().capacity()) { index=0; } + } + + typename LCC::Dart_const_handle dh1=lcc.darts().iterator_to(lcc.darts()[index]); + border_faces[0]=dh1; + set.insert(dh1); + lcc.template mark_cell<2>(dh1, amark); + + for (std::size_t i=1; i + (random.get_int + (0, static_cast(border_faces.size()))); + int nbborder=0; + + typename LCC::Dart_const_handle dh1_init=border_faces[facenumber]; + dh1=dh1_init; + do + { + if (!lcc.template is_free<2>(dh1) && + !lcc.is_marked(lcc.template beta<2>(dh1), amark)) + { ++nbborder; } + dh1=lcc.template beta<1>(dh1); + } + while (dh1!=dh1_init); + + while(lcc.template is_free<2>(dh1) || + lcc.is_marked(lcc.template beta<2>(dh1), amark)) + { dh1=lcc.template beta<1>(dh1); } + + std::size_t dartnumber=static_cast(random.get_int(0, nbborder)); + for (std::size_t j=0; j(dh1) && + !lcc.is_marked(lcc.template beta<2>(dh1), amark)) + { ++j; } + dh1=lcc.template beta<1>(dh1); + while(lcc.template is_free<2>(dh1) || + lcc.is_marked(lcc.template beta<2>(dh1), amark)) + { dh1=lcc.template beta<1>(dh1); } + } + + // Here we have a new face + set.insert(lcc.template beta<2>(dh1)); + lcc.template mark_cell<2>(lcc.template beta<2>(dh1), amark); + + // We add it in the list of borders faces + border_faces[border_faces.size()]=lcc.template beta<2>(dh1); + + // Then we update the list of border faces (because some of them could be + // no more border due to the adding of the new face) + std::unordered_map + border_faces_new; + for (typename std::unordered_map::iterator it=border_faces.begin(), + itend=border_faces.end(); it!=itend; ++it) + { + bool isborder=false; + dh1=it->second; + do + { + if (!lcc.template is_free<2>(dh1) && + !lcc.is_marked(lcc.template beta<2>(dh1), amark)) + { isborder=true; } + else + { dh1=lcc.template beta<1>(dh1); } + } + while(!isborder && dh1!=it->second); + if (isborder) + { border_faces_new[border_faces_new.size()]=dh1; } + } + std::swap(border_faces, border_faces_new); + + if (border_faces.size()==0) + { return NULL; } + } + + assert (border_faces.size()!=0); + typename LCC::Dart_const_handle dhres=border_faces[0]; + while(lcc.template is_free<2>(dhres) || + lcc.is_marked(lcc.template beta<2>(dhres), amark)) + { dhres=lcc.template beta<1>(dhres); } + + return dhres; +} + +template +void generate_random_closed_path(Path& p, std::size_t nb, + CGAL::Random& random) +{ + std::unordered_set faces; + typename Path::Map::size_type amark=p.get_map().get_new_mark(); + + typename Path::Map::Dart_const_handle dhi= + generate_random_connected_set_of_faces(p.get_map(), nb, random, + faces, amark); + + if (dhi==NULL) + { + p.get_map().free_mark(amark); + return; // We have selected all the faces. + } + + typename Path::Map::Dart_const_handle dh=dhi; + do + { + CGAL_assertion(p.get_map().template is_free<2>(dh) || + !p.get_map().is_marked(p.get_map().template beta<2>(dh), amark)); + p.push_back(dh, false); + dh=p.get_map().template beta<1>(dh); + while(!p.get_map().template is_free<2>(dh) && + p.get_map().is_marked(p.get_map().template beta<2>(dh), amark)) + { dh=p.get_map().template beta<2, 1>(dh); } + } + while(dh!=dhi); + + for (typename std::template unordered_set::iterator + it=faces.begin(), itend=faces.end(); it!=itend; ++it) + { p.get_map().template unmark_cell<2>(*it, amark); } + + p.get_map().free_mark(amark); + + p.update_is_closed(); + CGAL_assertion(p.is_closed()); +} + +} // namespace internal +} // namespace Surface_mesh_topology +} // namespace CGAL + +#endif // CGAL_PATH_GENERATORS_H // +// EOF // diff --git a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h new file mode 100644 index 00000000000..871fc982b55 --- /dev/null +++ b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Path_on_surface_with_rle.h @@ -0,0 +1,1583 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_PATH_ON_SURFACE_WITH_RLE_H +#define CGAL_PATH_ON_SURFACE_WITH_RLE_H 1 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace CGAL { +namespace Surface_mesh_topology { + +template +class Path_on_surface; + +template +class Minimal_quadrangulation; + +namespace internal { + +// A flat is a sequence of darts given by its two extremities: begin and end, +// with +2 turns (if length>0) or -2 turns (if length<0). +// length==0 => begin==end. +template +class CFlat +{ + typedef Map_ Map; + typedef typename Map::Dart_const_handle Dart_const_handle; + typedef CFlat Self; + +public: + CFlat(Dart_const_handle dh) : begin(dh), end(dh), length(0) + {} + + CFlat(Dart_const_handle dh1, Dart_const_handle dh2, int l) : + begin(dh1), end(dh2), length(l) + {} + + bool operator==(const Self& other) const + { return begin==other.begin && end==other.end && length==other.length; } + + bool operator!=(const Self& other) const + { return !(operator==(other)); } + + friend std::ostream& operator<< (std::ostream& os, const Self& flat) + { + os<<"["<<&*(flat.begin)<<", "<<&*(flat.end)<<" (l="<0, negative flat if <0 +}; + +// Small wrapper allowing to use directly a combinatorial map as if it is a +// minimal quadrangulation. +template +class Light_MQ // MQ for minimal quadrangulation +{ +public: + typedef Map_ Reduced_map; + typedef Map_ Mesh; + typedef typename Map_::Dart_const_handle Dart_const_handle; + + Light_MQ(const Reduced_map& m): m_map(m) + {} + + const Reduced_map& get_reduced_map() const + { return m_map; } + + std::size_t positive_turn(Dart_const_handle d1, Dart_const_handle d2) const + { return m_map.positive_turn(d1, d2); } + + std::size_t negative_turn(Dart_const_handle d1, Dart_const_handle d2) const + { return m_map.negative_turn(d1, d2); } + +protected: + const Reduced_map& m_map; +}; + +template // MQ for minimal quadrangulation +class Path_on_surface_with_rle +{ +public: + typedef Path_on_surface_with_rle Self; + typedef typename MQ::Reduced_map Map; + typedef typename MQ::Mesh Mesh; + typedef typename Map::Dart_handle Dart_handle; + typedef typename Map::Dart_const_handle Dart_const_handle; + typedef CFlat Flat; + typedef std::list List_of_flats; + typedef typename List_of_flats::iterator List_iterator; + // TODO typedef typename List_of_dart_length::const_iterator List_const_iterator; + + friend class Path_on_surface; + + struct List_iterator_hash + { + std::size_t operator() (const List_iterator& lit) const + { + return std::hash()(&*lit); + } + }; + + typedef std::unordered_set Set_of_it; + +#ifdef CGAL_PWRLE_TURN_V2 + typedef std::unordered_map TDartIds; +#endif //CGAL_PWRLE_TURN_V2 + + /// Constructor + Path_on_surface_with_rle(const MQ& aMQ + #ifdef CGAL_PWRLE_TURN_V2 + , const TDartIds & darts_ids + #endif //CGAL_PWRLE_TURN_V2 + ) + : m_MQ(aMQ), + m_is_closed(false), + m_length(0), + m_use_only_positive(false), + m_use_only_negative(false) + #ifdef CGAL_PWRLE_TURN_V2 + , m_darts_ids(darts_ids) + #endif //CGAL_PWRLE_TURN_V2 + {} + + /// Creates a Path_on_surface_with_rle from a Path_on_surface. + /// If use_only_positive, consider only positive flats and not negative ones. + /// If use_only_negative, consider only negative flats and not positive ones. + /// If both are false, consider both positive and negative flats. + /// Both cannot be true at the same time. + /// Note that for a minimal surface of genus>=2, we cannot have both -2 and + /// +2 as turn, and thus these parameters are useless. + /// However, this case can occured for our unit tests on the cube, this is + /// the reason of these parameters. + Path_on_surface_with_rle(const MQ& aMQ, const Path_on_surface& apath, + bool use_only_positive=false, + bool use_only_negative=false) + : m_MQ(aMQ), + m_is_closed(apath.is_closed()), + m_length(0), + m_use_only_positive(use_only_positive), + m_use_only_negative(use_only_negative) + { + if (apath.is_empty()) return; + + std::size_t i=0, starti=0; + bool positive_flat=false; + bool negative_flat=false; + + if (apath.is_closed()) + { + if (!use_only_negative && apath.next_positive_turn(i)==2) + { positive_flat=true; negative_flat=false; } + else if (!use_only_positive && apath.next_negative_turn(i)==2) + { positive_flat=false; negative_flat=true; } + + while ((positive_flat && apath.next_positive_turn(i)==2) || + (negative_flat && apath.next_negative_turn(i)==2)) + { + i=apath.next_index(i); + if (i==0) // Case of a closed path, made of only one flat part. + { + m_path.push_back(Flat(apath.real_front(), apath.real_back(), + (positive_flat?(static_cast(apath.length()-1)): + -(static_cast(apath.length()-1))))); + m_length=apath.length(); + CGAL_assertion(is_valid()); + return; + } + } + // Here i is the last dart of a flat + i=apath.next_index(i); // Now we are sure that i is the beginning of a flat + } + + starti=i; + do + { + // Here dart i is the beginning of a flat part (maybe of length 0) + push_back(apath.get_ith_real_dart(i), false); + i=apath.next_index(i); + } + while(i p1(*this); + Path_on_surface p2(other); + return p1==p2; + } + + bool operator!=(Self& other) + { return !(operator==(other)); } + + /// @return true iff the path is empty + bool is_empty() const + { return m_path.empty(); } + + /// @return the length of the path, i.e. its number of darts + std::size_t length() const + { return m_length; } + + /// @return the number of darts in the double linked list. + /// note that size_of_list()<=length(). + std::size_t size_of_list() const + { return m_path.size(); } + + /// @return true iff the path is closed (update after each path modification). + bool is_closed() const + { return m_is_closed; } + + /// @return the underlying map. + const Map& get_map() const + { return m_MQ.get_reduced_map(); } + + /// clear the path. + void clear() + { + m_path.clear(); + m_is_closed=false; + m_length=0; + } + + /// @return true if the given flat is valid + bool is_flat_valid(const List_iterator& flat) const + { + CGAL_assertion(is_valid_iterator(flat)); + Dart_const_handle dhend=flat->begin; + int nb=0; + while(nb!=flat->length) + { + if (flat->length>0) + { dhend=get_map().template beta<1, 2, 1>(dhend); ++nb; } + else + { dhend=get_map().template beta<2, 0, 2, 0, 2>(dhend); --nb; } + } + + return dhend==flat->end; + } + + /// Display the given flat + void display_flat(std::ostream& os, const List_iterator& flat) + { + CGAL_assertion(is_valid_iterator(flat)); + os<<"["<begin)<<", " + <end)<<" (l="<length<<")]"; + } + + /// @return true iff the path is valid; i.e. a sequence of flats two by + /// two adjacent. + /// if test_minimal is true, test that there is no two consecutive flats + /// that can be merged. If test_minimal is false, this test is not done. + bool is_valid(bool test_minimal=true) + { + if (is_empty()) { return !is_closed(); } // an empty past is not closed + + unsigned int nbdarts=0,i=0; + Dart_const_handle prev=(is_closed()?back():nullptr); // Last dart of the path + for (auto it=m_path.begin(); it!=m_path.end(); ++it) + { + if (prev!=nullptr && !get_map().template belong_to_same_cell<0> + (get_map().template beta<1>(prev), begin_of_flat(it))) + { + std::cerr<<"ERROR: The path is not valid: flat in position "< + (get_map().template beta<1>(prev), begin_of_flat(m_path.begin()))) + { + std::cerr<<"ERROR: The path is not valid: first flat " + <<" does not follow the last dart for a closed path."< + (get_map().template beta<1>(back()), dh); + } + + /// Add the given dart at the end of this path. + /// @pre can_be_pushed(dh) + void push_back(Dart_const_handle dh, bool update_isclosed=true) + { + CGAL_assertion(dh!=Map::null_handle); + // This assert is too long, it is tested in the is_valid method. + // CGAL_assertion(can_be_pushed(dh)); + + List_iterator itlast=m_path.end(); + + bool positive_flat, negative_flat; + if (is_empty() || + !is_prev_flat_can_be_extended_at_end(itlast, dh, + positive_flat, negative_flat)) + { m_path.push_back(Flat(dh)); } // Create a new flat + else + { + itlast=std::prev(itlast); + set_end_of_flat(itlast, dh); // Move the last dart of the last flat + if (positive_flat && flat_length(itlast)>=0) + { + set_flat_length(itlast, flat_length(itlast)+1); // Increment the length of the flat + } + else + { + CGAL_assertion(negative_flat && flat_length(itlast)<=0); + set_flat_length(itlast, flat_length(itlast)-1); // Increment the length of the flat + } + } + + ++m_length; + if (update_isclosed) { update_is_closed(); } + } + + // Update m_is_closed to true iff the path is closed (i.e. the second + // extremity of the last dart of the path is the same vertex than the one + // of the first dart of the path). + void update_is_closed() + { + if (is_empty()) { m_is_closed=false; } + else + { + Dart_const_handle pend=get_map().other_extremity(back()); + if (pend==Map::null_handle) { m_is_closed=false; } + else + { m_is_closed=get_map().template belong_to_same_cell<0>(front(), pend); } + } + } + + /// @return true iff there is a flat after it + bool next_flat_exist(const List_iterator& it) const + { + CGAL_assertion(it!=m_path.end()); + return !is_empty() && (is_closed() || std::next(it)!=m_path.end()); + } + + /// @return true iff there is a flat before it + bool prev_flat_exist(const List_iterator& it) const + { + return !is_empty() && (is_closed() || it!=m_path.begin()); + } + + void advance_iterator(List_iterator& it) + { + CGAL_assertion(it!=m_path.end()); + it=std::next(it); + if (it==m_path.end()) + { + if (is_closed()) + { it=m_path.begin(); } // Here the path is closed, and it is the last element of the list + } + } + + void retreat_iterator(List_iterator& it) + { + if (it==m_path.begin()) + { + if (is_closed()) + { it=m_path.end(); } + else { return; } + } + it=std::prev(it); + } + + List_iterator next_iterator(const List_iterator& it) + { + List_iterator res=it; + advance_iterator(res); + return res; + } + + List_iterator prev_iterator(const List_iterator& it) + { + List_iterator res=it; + retreat_iterator(res); + return res; + } + + /// @return the beginning of the flat + Dart_const_handle begin_of_flat(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + return it->begin; + } + + /// @return the end of the flat + Dart_const_handle end_of_flat(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + return it->end; + } + + /// @return the length of the flat + int flat_length(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + return it->length; + } + + void set_flat_length(const List_iterator& it, int i) + { + CGAL_assertion(is_valid_iterator(it)); + it->length=i; + } + + void decrease_flat_length(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + CGAL_assertion(flat_length(it)!=0); + if (flat_length(it)>0) { --(it->length); } + else { ++(it->length); } + } + + void increase_flat_length(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + if (flat_length(it)>=0) { ++(it->length); } + else { --(it->length); } + } + + void set_begin_of_flat(const List_iterator& it, Dart_const_handle dh) + { + CGAL_assertion(is_valid_iterator(it)); + it->begin=dh; + } + + void set_end_of_flat(const List_iterator& it, Dart_const_handle dh) + { + CGAL_assertion(is_valid_iterator(it)); + it->end=dh; + } + + /// @return the second dart of the given flat. + Dart_const_handle second_dart_of_a_flat(const List_iterator& it) + { + if (flat_length(it)>0) + { return get_map().template beta<1, 2, 1>(begin_of_flat(it)); } + + CGAL_assertion(flat_length(it)<0); + return get_map().template beta<2, 0, 2, 0, 2>(begin_of_flat(it)); + } + + /// @return the dart before the last dart of the given flat. + Dart_const_handle before_last_dart_of_a_flat(const List_iterator& it) + { + if (flat_length(it)>0) + { return get_map().template beta<0, 2, 0>(end_of_flat(it)); } + + CGAL_assertion(flat_length(it)<0); + return get_map().template beta<2, 1, 2, 1, 2>(end_of_flat(it)); + } + + /// @return the turn between dart it and next dart. + /// (turn is position of the second edge in the cyclic ordering of + /// edges starting from the first edge around the second extremity + /// of the first dart) + std::size_t next_positive_turn(const List_iterator& it) + { + CGAL_assertion(next_flat_exist(it)); + return m_MQ.positive_turn(end_of_flat(it), begin_of_flat(next_iterator(it))); + } + + /// Same than next_positive_turn but turning in reverse orientation around vertex. + std::size_t next_negative_turn(const List_iterator& it) + { + CGAL_assertion(next_flat_exist(it)); + return m_MQ.negative_turn(end_of_flat(it), begin_of_flat(next_iterator(it))); + } + + std::vector compute_positive_turns() + { + std::vector res; + if (is_empty()) return res; + for (auto it=m_path.begin(), itend=m_path.end(); it!=itend; ++it) + { + if (next_flat_exist(it)) + { res.push_back(next_positive_turn(it)); } + } + return res; + } + + std::vector compute_negative_turns() + { + std::vector res; + if (is_empty()) return res; + for (auto it=m_path.begin(), itend=m_path.end(); it!=itend; ++it) + { + if (next_flat_exist(it)) + { res.push_back(next_negative_turn(it)); } + } + return res; + } + + std::vector compute_turns(bool positive) + { return (positive?compute_positive_turns():compute_negative_turns()); } + + void flat_modified(const List_iterator& it, + Set_of_it& modified_flats) + { + modified_flats.insert(it); + if (prev_flat_exist(it)) + { modified_flats.insert(prev_iterator(it)); } + if (next_flat_exist(it)) + { modified_flats.insert(next_iterator(it)); } + } + + void erase_flat(List_iterator& it, Set_of_it& modified_flats) + { + if (next_flat_exist(it)) + { modified_flats.insert(next_iterator(it)); } + if (prev_flat_exist(it)) + { modified_flats.insert(prev_iterator(it)); } + + modified_flats.erase(it); + + it=m_path.erase(it); // after the erase, it is the element after the erased one + if (prev_flat_exist(it)) + { + retreat_iterator(it); // this is why we move it backward here + } + } + + List_iterator merge_modified_flats_when_possible(Set_of_it& modified_flats) + { + if (m_path.empty()) + { + m_is_closed=false; + return m_path.end(); + } + + List_iterator smallest_it=m_path.end(); + for (auto it=modified_flats.begin(), itend=modified_flats.end(); + it!=itend; ++it) + { + if (prev_flat_exist(*it) && modified_flats.count(prev_iterator(*it))==0) + { smallest_it=*it; } + } + + List_iterator itcur; + if (smallest_it==m_path.end()) + { // Case of a closed path, with all paths modified + for (auto it=modified_flats.begin(); it!=modified_flats.end(); ++it) + { + itcur=*it; + while(merge_with_next_flat_if_possible(itcur, modified_flats)) + {} + } + return m_path.begin(); + } + + for (auto it=modified_flats.begin(); it!=modified_flats.end(); ++it) + { + itcur=*it; + while(merge_with_next_flat_if_possible(itcur, modified_flats)) + {} + } + + // Note that smallest is not necessarily the smallest, this is a flat + // such that the previous flat is not modified. + return smallest_it; + } + + /// Reduce the length of the flat part starting at 'it' from its beginning + /// 'it' moves to the previous flat if the current flat disapeared. + /// The path could be not valid after this operation (consistency with next + /// element should be ensure, by possibly updating the next flat part). + /// @return true iff the flat disapeared after its reduction. + bool reduce_flat_from_beginning(List_iterator& it, + Set_of_it& modified_flats) + { + CGAL_assertion(is_valid_iterator(it)); + + CGAL_assertion(m_length>0); + --m_length; + + flat_modified(it, modified_flats); + + if (flat_length(it)==0) + { + erase_flat(it, modified_flats); + return true; + } + + set_begin_of_flat(it, second_dart_of_a_flat(it)); + decrease_flat_length(it); + return false; + } + + /// Reduce the length of the flat part starting at 'it' from its end. + /// 'it' moves to the previous flat if the current flat disapeared. + /// The path could be not valid after this operation (consistency with next + /// element should be ensure, by possibly updating the next flat part). + /// @return true iff the flat disapeared after its reduction. + bool reduce_flat_from_end(List_iterator& it, + Set_of_it& modified_flats) + { + CGAL_assertion(is_valid_iterator(it)); + + CGAL_assertion(m_length>0); + --m_length; + + flat_modified(it, modified_flats); + + if (flat_length(it)==0) + { + erase_flat(it, modified_flats); + return true; + } + + set_end_of_flat(it, before_last_dart_of_a_flat(it)); + decrease_flat_length(it); + return false; + } + + /// @return true iff the flat 'it' can be merged with its next flat. + bool can_merge_with_next_flat(const List_iterator& it, + bool& positive2, bool& negative2) + { + if (m_path.size()<=1) { return false; } + if (!next_flat_exist(it)) { return false; } + + List_iterator it2=next_iterator(it); + CGAL_assertion(m_path.size()>1 || it==it2); + if (it==it2) { return false; } // only one flat in the path + + positive2=(!m_use_only_negative && (next_positive_turn(it)==2)); + negative2=(!m_use_only_positive && (next_negative_turn(it)==2)); + CGAL_assertion(!(positive2 && negative2)); + + if (!positive2 && !negative2) { return false; } // the middle turn is not a flat + + bool positive1=(flat_length(it)>=0); + bool negative1=(flat_length(it)<=0); + bool positive3=(flat_length(it2)>=0); + bool negative3=(flat_length(it2)<=0); + + return ((positive1 && positive2 && positive3) || + (negative1 && negative2 && negative3)); + } + + /// @return true iff the flat 'it' can be merged with its next flat. + bool can_merge_with_next_flat(const List_iterator& it) + { + bool dummy1, dummy2; + return can_merge_with_next_flat(it, dummy1, dummy2); + } + + /// Merge flat 'it' with its next flat if it is possible. + /// @return true if a merging was done. + bool merge_with_next_flat_if_possible(const List_iterator& it, + Set_of_it& modified_flats) + { + bool positive2=false, negative2=false; + if (!can_merge_with_next_flat(it, positive2, negative2)) + { return false; } + +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"Merge with next flat: "; + display_flat(std::cout, it); std::cout<<" and "; + display_flat(std::cout, next_iterator(it)); std::cout<(end_of_flat(it))== + begin_of_flat(next_iterator(it)); + } + + /// Remove the spur given by 'it'. + /// After the operation, either 'it' stay on the same element (if the flat + /// still exist), or 'it' move to the previous element if the flat containing + /// the spur is removed. + /// ('it' will be equal to m_path.end() if the path becomes empty). + void remove_spur(List_iterator& it) + { +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"Remove spur between flats: "; + display_flat(std::cout, it); std::cout<<" and "; + display_flat(std::cout, next_iterator(it)); std::cout<0) + { return false; } // This is not a negative bracket, we have some +2 + + if (!next_flat_exist(itend) || next_negative_turn(itend)!=1) + { return false; } + + // Now we move itend to the beginning of the third flat. + advance_iterator(itend); + return true; + } + + /// Move 'it' to the next bracket after 'it'. Go to m_path.end() if there + /// is no bracket in the path. + void move_to_next_bracket(List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + List_iterator itend=(is_closed()?it:m_path.end()); + List_iterator it2; + do + { + advance_iterator(it); + if (it!=m_path.end() && + (is_positive_bracket(it, it2) || is_negative_bracket(it, it2))) + { return; } + } + while(it!=itend); + it=m_path.end(); // Here there is no bracket in the whole path + } + + /// Remove the given negative bracket. it1 is the flat beginning + /// of the bracket; it3 is the flat end of the bracket. + void remove_negative_bracket(List_iterator& it1, List_iterator& it3) + { +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"Remove negative bracket: "; + display_flat(std::cout, it1); std::cout<<", "; + display_flat(std::cout, next_iterator(it1)); std::cout<<" and "; + display_flat(std::cout, it3); std::cout<(begin_of_flat(it1))); + set_end_of_flat(it1, get_map().template beta<2,1,2,0>(end_of_flat(it1))); + set_flat_length(it1, (-flat_length(it1))-2); + flat_modified(it1, modified_flats); + it1=merge_modified_flats_when_possible(modified_flats); + CGAL_assertion(m_length>1); + m_length-=2; + return; + } + + it2=next_iterator(it1); // it2 is the the next flat after it1 + + reduce_flat_from_end(it1, modified_flats); // decrease also m_length + reduce_flat_from_beginning(it3, modified_flats); + + it1=it2; // Beginning of the second flat, we are sure it still exists + + set_begin_of_flat(it2, get_map().template beta<2,1,1>(begin_of_flat(it2))); + set_end_of_flat(it2, get_map().template beta<2,1,1>(end_of_flat(it2))); + set_flat_length(it2, -flat_length(it2)); + + flat_modified(it2, modified_flats); + + it1=merge_modified_flats_when_possible(modified_flats); + + // CGAL_assertion(is_valid()); + } + + /// Remove the given positive bracket. 'it1' is the flat beginning + /// of the bracket; 'it3' is the flat end of the bracket. + void remove_positive_bracket(List_iterator& it1, + List_iterator& it3) + { +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"Remove positive bracket: "; + display_flat(std::cout, it1); std::cout<<", "; + display_flat(std::cout, next_iterator(it1)); std::cout<<" and "; + display_flat(std::cout, it3); std::cout<0); + set_begin_of_flat(it1, get_map().template beta<1,2,0,2>(begin_of_flat(it1))); + set_end_of_flat(it1, get_map().template beta<0,2,1,2>(end_of_flat(it1))); + set_flat_length(it1, -(flat_length(it1)-2)); + flat_modified(it1, modified_flats); + it1=merge_modified_flats_when_possible(modified_flats); + CGAL_assertion(m_length>1); + m_length-=2; + return; + } + + it2=next_iterator(it1); // it2 is the next flat after it1 + + reduce_flat_from_end(it1, modified_flats); // decrease also m_length + reduce_flat_from_beginning(it3, modified_flats); + + it1=it2; // Beginning of the second flat, we are sure it exists + + set_begin_of_flat(it2, get_map().template beta<1,1,2>(begin_of_flat(it2))); + set_end_of_flat(it2, get_map().template beta<1,1,2>(end_of_flat(it2))); + set_flat_length(it2, -flat_length(it2)); + + flat_modified(it2, modified_flats); + + it1=merge_modified_flats_when_possible(modified_flats); + + // CGAL_assertion(is_valid()); + } + + /// Simplify the path by removing all brackets, if all==true (default), + /// or by removing only one bracket, if all==false. + /// @return true iff at least one bracket was removed + bool remove_brackets(bool all=true) + { + // CGAL_assertion(is_valid()); + bool res=false; + List_iterator it1=m_path.begin(); + List_iterator it2; + while(it1!=m_path.end()) + { + // CGAL_assertion(is_valid()); + if (is_positive_bracket(it1, it2)) + { + remove_positive_bracket(it1, it2); res=true; + // CGAL_assertion(is_valid_iterator(it1)); + // CGAL_assertion(is_valid()); + } + else if (is_negative_bracket(it1, it2)) + { + remove_negative_bracket(it1, it2); res=true; + // CGAL_assertion(is_valid_iterator(it1)); + // CGAL_assertion(is_valid()); + } + else { move_to_next_bracket(it1); } + if (!all && res) { return true; } + } + // CGAL_assertion(is_valid()); + return res; + } + + /// @return true iff 'it' is the beginning of a l-shape. + bool is_l_shape(const List_iterator& it) + { + CGAL_assertion(is_valid_iterator(it)); + if (!next_flat_exist(it)) { return false; } + std::size_t t=next_negative_turn(it); + return (t==1 || + (flat_length(it)<0 && size_of_list()==1 && t==2)); + } + + /// Move it to the next l_shape after it. Go to m_path.end() if there is no + /// l_shape in the path. + void move_to_next_l_shape(List_iterator& it) + { + // CGAL_assertion(is_valid()); + CGAL_assertion(is_valid_iterator(it)); + List_iterator itend=(is_closed()?it:m_path.end()); + do + { + advance_iterator(it); + if (it!=m_path.end() && is_l_shape(it)) { return; } + } + while(it!=itend); + it=m_path.end(); // Here there is no spur in the whole path + } + + /// @return true iff the flat before flat 'it' can be extended by adding + /// dart 'dh' to its end. + bool is_prev_flat_can_be_extended_at_end(const List_iterator& it, + Dart_const_handle dh, + bool& positive_flat, + bool& negative_flat) + { + positive_flat=false; negative_flat=false; + if (!prev_flat_exist(it)) { return false; } + List_iterator ittemp=prev_iterator(it); + if (!m_use_only_negative && m_MQ.positive_turn(end_of_flat(ittemp), dh)==2) + { positive_flat=true; } + if (!m_use_only_positive && m_MQ.negative_turn(end_of_flat(ittemp), dh)==2) + { negative_flat=true; } + + if (flat_length(ittemp)==0) // Case of flat lengh 0 + { return positive_flat || negative_flat; } + + return (flat_length(ittemp)>0 && positive_flat) || + (flat_length(ittemp)<0 && negative_flat); + } + + /// @return true iff the flat before flat 'it' can be extended by adding + /// dart 'dh' to its end. + bool is_prev_flat_can_be_extended_at_end(const List_iterator& it, + Dart_const_handle dh) + { + bool dummy1, dummy2; + return is_prev_flat_can_be_extended_at_end(it, dh, dummy1, dummy2); + } + + /// @return true iff the flat after flat 'it' can be extended by adding + /// dart 'dh' to its beginning. + bool is_next_flat_can_be_extended_at_beginning(const List_iterator& it, + Dart_const_handle dh, + bool& positive_flat, + bool& negative_flat) + { + CGAL_assertion(is_valid_iterator(it)); + + positive_flat=false; negative_flat=false; + if (!next_flat_exist(it)) { return false; } + List_iterator ittemp=next_iterator(it); + if (!m_use_only_negative && m_MQ.positive_turn(dh, begin_of_flat(ittemp))==2) + { positive_flat=true; } + if (!m_use_only_positive && m_MQ.negative_turn(dh, begin_of_flat(ittemp))==2) + { negative_flat=true; } + + if (flat_length(ittemp)==0) // Case of flat lengh 0 + { return positive_flat || negative_flat; } + + return (flat_length(ittemp)>0 && positive_flat) || + (flat_length(ittemp)<0 && negative_flat); + } + + /// @return true iff the flat after flat 'it' can be extended by adding + /// dart 'dh' to its beginning. + bool is_next_flat_can_be_extended_at_beginning(const List_iterator& it, + Dart_const_handle dh) + { + bool dummy1, dummy2; + return is_next_flat_can_be_extended_at_beginning(it, dh, dummy1, dummy2); + } + + /// Add the given dart 'dh' before the flat 'it'. + void add_dart_before(const List_iterator& it, Dart_const_handle dh, + Set_of_it& modified_flats) + { + CGAL_assertion(is_valid_iterator(it)); + + bool positive_flat, negative_flat; + if (is_prev_flat_can_be_extended_at_end(it, dh, + positive_flat, negative_flat)) + { + List_iterator ittemp=prev_iterator(it); + set_end_of_flat(ittemp, dh); // Move the last dart of the previous flat + set_flat_length(ittemp, flat_length(ittemp)+(positive_flat?+1:-1)); // Increment the length of the flat + flat_modified(ittemp, modified_flats); + } + else + { + // insert the new element before 'it' + flat_modified(m_path.insert(it, Flat(dh)), modified_flats); + } + ++m_length; + } + + /// Add the given dart 'dh' after the flat 'it'. + void add_dart_after(const List_iterator& it, Dart_const_handle dh, + Set_of_it& modified_flats) + { + CGAL_assertion(is_valid_iterator(it)); + bool positive_flat, negative_flat; + List_iterator ittemp=next_iterator(it); + if (is_next_flat_can_be_extended_at_beginning(it, dh, + positive_flat, negative_flat)) + { + set_begin_of_flat(ittemp, dh); // Move the first dart of the flat + set_flat_length(ittemp, flat_length(ittemp)+(positive_flat?+1:-1)); // Increment the length of the flat + flat_modified(ittemp, modified_flats); + } + else + { + // insert the new element before 'ittemp', thus after 'it' + flat_modified(m_path.insert(ittemp, Flat(dh)), modified_flats); + } + ++m_length; + } + + /// Right push the given l-shape. + void right_push_l_shape(List_iterator& it1) + { +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"Right push l-shape: "; + display_flat(std::cout, it1); std::cout<<" and "; + display_flat(std::cout, next_iterator(it1)); std::cout<(begin_of_flat(it1))); + set_end_of_flat(it1, get_map().template beta<2,1,1>(end_of_flat(it1))); + // CGAL_assertion(is_valid()); + return; + } + else // Here negative turn is 1 + { + if (flat_length(it1)>0) // Case where the first flat is positive + { // We split the flat in two parts + CGAL_assertion(flat_length(it1)>=1); + Dart_const_handle dh1=begin_of_flat(it1); + Dart_const_handle dh2=end_of_flat(it1); + if (flat_length(it1)==1) // only one flat with two darts + { + reduce_flat_from_end(it1, modified_flats); + it1=m_path.insert(it1, Flat(dh2)); // insert dh1 before it1 + flat_modified(it1, modified_flats); + ++m_length; + } + else + { + reduce_flat_from_beginning(it1, modified_flats); + reduce_flat_from_end(it1, modified_flats); + flat_modified(m_path.insert(it1, Flat(dh1)), modified_flats); // insert dh1 before it1 + it1=m_path.insert(next_iterator(it1), Flat(dh2)); // insert dh2 after it1 + flat_modified(it1, modified_flats); + m_length+=2; + } + // Now we can continue with the normal case because we have 3 flats + CGAL_assertion(flat_length(it1)==0); + CGAL_assertion(flat_length(next_iterator(it1))==0); + } + else + { + // Here we have only one flat, with some -2 + // This case is not supposed possible. + CGAL_assertion(false); + return; + } + } + } + + List_iterator it2=next_iterator(it1); // Beginning of the second flat + CGAL_assertion(it1!=it2); + + if (flat_length(it1)>0) // Case where the first flat is positive + { // We split the flat in two parts + Dart_const_handle dh=end_of_flat(it1); // last dart of the first flat + reduce_flat_from_end(it1, modified_flats); + it1=m_path.insert(it2, Flat(dh)); // insert dh before it2 + ++m_length; + flat_modified(it1, modified_flats); + } + + if (flat_length(it2)>0) // Case where the second flat is positive, we need to + { // split it into two parts + Dart_const_handle dh=begin_of_flat(it2); // first dart of the second flat + reduce_flat_from_beginning(it2, modified_flats); + it2=m_path.insert(it2, Flat(dh)); // insert dh before the second flat + ++m_length; + flat_modified(it2, modified_flats); + } + + // CGAL_assertion(is_valid(false)); + // CGAL_assertion(is_l_shape(it1)); + + Dart_const_handle dh1=get_map().template beta<2,1>(begin_of_flat(it1)); + Dart_const_handle dh2=get_map().template beta<1>(dh1); + Dart_const_handle dh3=get_map().template beta<2,1,2,0>(end_of_flat(it1)); + Dart_const_handle dh4=get_map().template beta<2,0,2,1>(begin_of_flat(it2)); + Dart_const_handle dh5=get_map().template beta<2,0,0>(end_of_flat(it2)); + Dart_const_handle dh6=get_map().template beta<1>(dh5); + + bool first_flat_zero=(flat_length(it1)==0); + bool second_flat_zero=(flat_length(it2)==0); + + if (first_flat_zero) + { + if (second_flat_zero) + { // Special case of a l-shape with only 2 darts + set_begin_of_flat(it1, dh1); + set_end_of_flat(it1, dh1); + set_begin_of_flat(it2, dh6); + set_end_of_flat(it2, dh6); + + flat_modified(it1, modified_flats); + flat_modified(it2, modified_flats); + + it1=merge_modified_flats_when_possible(modified_flats); + + // CGAL_assertion(is_valid()); + return; + } + else + { // Here first flat length is 0, while second flat not + set_begin_of_flat(it1, dh1); + set_end_of_flat(it1, dh5); + set_begin_of_flat(it2, dh6); + set_end_of_flat(it2, dh6); + set_flat_length(it1, -flat_length(it2)); + set_flat_length(it2, 0); + + flat_modified(it1, modified_flats); + flat_modified(it2, modified_flats); + + it1=merge_modified_flats_when_possible(modified_flats); + + // CGAL_assertion(is_valid()); + return; + } + } + else + { + if (second_flat_zero) + { // Here first flat length is non zero, while second flat length is 0 + set_begin_of_flat(it1, dh1); + set_end_of_flat(it1, dh1); + set_begin_of_flat(it2, dh2); + set_end_of_flat(it2, dh6); + set_flat_length(it2, -flat_length(it1)); + set_flat_length(it1, 0); + + flat_modified(it1, modified_flats); + flat_modified(it2, modified_flats); + + it1=merge_modified_flats_when_possible(modified_flats); + + // CGAL_assertion(is_valid()); + return; + } + } + + // General case, with two flats with non zero length + if (next_iterator(it2)!=it1 || next_negative_turn(it2)!=3) + { + // 1) Add the first dart before flat 'it' + add_dart_before(it1, dh1, modified_flats); + + // 2) Add the last dart after flat 'it2' + add_dart_after(it2, dh6, modified_flats); + } + else + { // Case "-2^s -1 -2^t -3" is a special case + dh2=get_map().template beta<2,0>(dh1); + dh5=get_map().template beta<2,1>(dh6); + increase_flat_length(it1); + increase_flat_length(it2); + m_length+=2; + flat_modified(it1, modified_flats); + flat_modified(it2, modified_flats); + } + + // 3) Move the first flat + CGAL_assertion(flat_length(it1)<0); + set_begin_of_flat(it1, dh2); + set_flat_length(it1, -(flat_length(it1))-1); + if (flat_length(it1)==0) { set_end_of_flat(it1, dh2); } + else { set_end_of_flat(it1, dh3); } // End of the moved flat + flat_modified(it1, modified_flats); + + // 4) Move the second flat + CGAL_assertion(flat_length(it2)<0); + set_begin_of_flat(it2, dh4); + set_flat_length(it2, -(flat_length(it2))-1); + if (flat_length(it2)==0) { set_end_of_flat(it2, dh4); } + else { set_end_of_flat(it2, dh5); } // End of the moved flat + flat_modified(it2, modified_flats); + + CGAL_assertion(m_length>1); + m_length-=2; + + it1=merge_modified_flats_when_possible(modified_flats); + } + + /// Right push the path, if all all l-shape are pushed, otherwise only one. + /// @return true iff the path was pushed + bool right_push(bool all=true) + { + bool res=false; + List_iterator it=m_path.begin(); + while(it!=m_path.end()) + { + if (is_l_shape(it)) + { + right_push_l_shape(it); res=true; + // CGAL_assertion(is_valid_iterator(it)); + // CGAL_assertion(is_valid()); + if (!all) { return true; } + } + else { move_to_next_l_shape(it); } + } + // CGAL_assertion(is_valid()); + return res; + } + + /// Canonize the path + void canonize() + { + CGAL_assertion(is_valid()); + + if (is_empty()) { return; } + + CGAL_assertion(is_closed()); + + bool modified=false; + remove_spurs(); + + do + { + modified=remove_brackets(); + modified=modified || remove_spurs(); + } + while(modified); + + right_push(); + + CGAL_assertion(remove_brackets()==false); + CGAL_assertion(remove_spurs()==false); + CGAL_assertion(is_valid()); + } + + void display_positive_turns() + { + std::cout<<"+("; + for (List_iterator it=m_path.begin(), itend=m_path.end(); + it!=itend; ++it) + { + if (next_flat_exist(it)) + { std::cout< +// +#ifndef CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H +#define CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H + +#include + +#include + +#ifdef CGAL_USE_BASIC_VIEWER + +#include +#include + +namespace CGAL { + +// Specialisation for face graph; otherwise use the LCC_geom_utils of LCC. +template +struct LCC_geom_utils, Kernel, 3> +{ + static typename Kernel::Vector_3 + get_face_normal(const CGAL::Face_graph_wrapper& mesh, + typename CGAL::Face_graph_wrapper::Dart_const_handle dh) + { + typename Get_traits::Vector normal(CGAL::NULL_VECTOR); + const typename Get_traits::Point* + curr=&Get_traits::get_point(mesh.get_fg(), dh); + typename CGAL::Face_graph_wrapper::Dart_const_handle adart=dh; + unsigned int nb=0; + + do + { + const typename Get_traits::Point* + next=&Get_traits::get_point(mesh.get_fg(), + mesh.other_extremity(adart)); + internal::newell_single_step_3_for_lcc(*curr, *next, normal); + ++nb; + curr=next; + adart=mesh.next(adart); + } + while(adart!=dh); + + assert(nb>0); + return (typename Get_traits::Kernel:: + Construct_scaled_vector_3()(normal, 1.0/nb)); + } + static typename Kernel::Vector_3 + get_vertex_normal(const CGAL::Face_graph_wrapper& mesh, + typename CGAL::Face_graph_wrapper::Dart_const_handle dh) + { + typename Get_traits::Vector normal(CGAL::NULL_VECTOR); + unsigned int nb = 0; + + for ( typename CGAL::Face_graph_wrapper::template Dart_of_cell_range<0>:: + const_iterator it=mesh.template darts_of_cell<0>(dh).begin(), + itend=mesh.template darts_of_cell<0>(dh).end(); it!=itend; ++it ) + { + normal=typename Get_traits::Kernel::Construct_sum_of_vectors_3() + (normal, get_face_normal(mesh, it)); + ++nb; + } + + if ( nb<2 ) return normal; + return (typename Get_traits::Kernel:: + Construct_scaled_vector_3()(normal, 1.0/nb)); + } +}; + +// Viewer class for Face_graph with paths. +template +class Face_graph_with_path_viewer : public Basic_viewer_qt +{ + typedef Basic_viewer_qt Base; + typedef typename Get_map::type LCC; + typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; + +public: + /// Construct the viewer. + /// @param alcc the lcc to view + /// @param title the title of the window + /// @param anofaces if true, do not draw faces (faces are not computed; + /// this can be usefull for very big object where this time could be long) + Face_graph_with_path_viewer(QWidget* parent, + const Mesh& amesh, + const std::vector + > + *paths=nullptr, + std::size_t amark=LCC::INVALID_MARK, + const char* title="", bool anofaces=false, + const DrawingFunctorLCC& + drawing_functor=DrawingFunctorLCC()) : + Base(parent, title, true, true, true, false, true), + mesh(amesh), + lcc(amesh), + m_nofaces(anofaces), + m_drawing_functor(drawing_functor), + m_paths(paths), + m_current_path(m_paths->size()), + m_current_dart(0), + m_draw_marked_darts(true), + m_amark(amark==std::numeric_limits::max()? + LCC::INVALID_MARK:amark) + { + m_current_dart=lcc.number_of_darts(); compute_elements(); + } + +protected: + + const Point& get_point(Dart_const_handle dh) const + { return CGAL::Get_traits::get_point(mesh, dh); } + + void compute_elements() + { + clear(); + + typename LCC::size_type markfaces = lcc.get_new_mark(); + typename LCC::size_type markedges = lcc.get_new_mark(); + typename LCC::size_type markvertices = lcc.get_new_mark(); + + if (m_current_dart!=lcc.number_of_darts()) + { // We want to draw only one dart + if (lcc.darts().is_used(m_current_dart)) + { + Dart_const_handle selected_dart=lcc.dart_handle(m_current_dart); + compute_edge(selected_dart, CGAL::Color(255,0,0)); + lcc.template mark_cell<1>(selected_dart, markedges); + compute_vertex(selected_dart); + + if ( !m_nofaces ) + { compute_face(selected_dart); } + } + + for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), + itend=lcc.darts().end(); it!=itend; ++it ) + { + if ( !lcc.is_marked(it, markedges) ) + { + compute_edge(it); + lcc.template mark_cell<1>(it, markedges); + } + } + } + else + { + if (m_current_path==m_paths->size()) + { + for (std::size_t i=0; isize(); ++i) + { compute_path(i, markedges); } + } + else if (m_current_path!=m_paths->size()+1) + { compute_path(m_current_path, markedges); } + + for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), + itend=lcc.darts().end(); it!=itend; ++it ) + { + if ( !m_nofaces && !lcc.is_marked(it, markfaces) ) + { + compute_face(it); + lcc.template mark_cell<2>(it, markfaces); + } + + if ( !lcc.is_marked(it, markedges) ) + { + compute_edge(it); + lcc.template mark_cell<1>(it, markedges); + } + + /*if ( !lcc.is_marked(it, markvertices) ) + { + compute_vertex(it); + lcc.template mark_cell<0>(it, markvertices); + }*/ + } + } + + lcc.free_mark(markfaces); + lcc.free_mark(markedges); + lcc.free_mark(markvertices); + } + + void compute_face(Dart_const_handle dh) + { + // We fill only closed faces. + Dart_const_handle cur=dh; + Dart_const_handle min=dh; + do + { + if (!lcc.is_next_exist(cur)) return; // open face=>not filled + if (cur:: + get_vertex_normal(lcc, cur)); + cur=lcc.next(cur); + } + while(cur!=dh); + + face_end(); + } + + void compute_edge(Dart_const_handle dh) + { + Point p1 = get_point(dh); + Dart_const_handle d2 = lcc.other_extremity(dh); + if (d2!=LCC::null_handle) + { + if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && + (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.beta(dh, 2), m_amark))) + { add_segment(p1, get_point(d2), CGAL::Color(0, 0, 255)); } + else + { add_segment(p1, get_point(d2)); } + } + } + + void compute_edge(Dart_const_handle dh, const CGAL::Color& color) + { + Point p1 = get_point(dh); + Dart_const_handle d2 = lcc.other_extremity(dh); + if (d2!=LCC::null_handle) + { add_segment(p1, get_point(d2), color); } + } + + void compute_vertex(Dart_const_handle dh) + { add_point(get_point(dh)); } + + virtual void keyPressEvent(QKeyEvent *e) + { + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + + if ((e->key()==::Qt::Key_D) && (modifiers==::Qt::NoButton)) + { + m_current_dart=(m_current_dart+1)%(lcc.number_of_darts()+1); + if (m_current_dart==lcc.number_of_darts()) + { + displayMessage(QString("Draw all darts.")); + } + else + { + displayMessage(QString("Draw dart=%1.").arg((m_current_dart))); + } + compute_elements(); + redraw(); + } + else if ((e->key()==::Qt::Key_M) && (modifiers==::Qt::NoButton)) + { + m_draw_marked_darts=!m_draw_marked_darts; + + if (m_draw_marked_darts) + { displayMessage(QString("Draw marked darts in blue.")); } + else + { + displayMessage(QString("Do not draw marked darts in different color.")); + } + compute_elements(); + redraw(); + } + else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton)) + { + m_current_path=(m_current_path+1)%(m_paths->size()+2); + if (m_current_path==m_paths->size()) + { displayMessage(QString("Draw all paths.")); } + else if (m_current_path==m_paths->size()+1) + { displayMessage(QString("Do not draw paths.")); } + else + { displayMessage(QString("Draw path=%1, nb_darts=%2."). + arg(m_current_path). + arg((*m_paths)[m_current_path].length())); } + compute_elements(); + redraw(); + } + else if ((e->key()==::Qt::Key_P) && (modifiers==::Qt::NoButton)) + { + m_current_dart=(m_current_dart==0?lcc.number_of_darts(): + m_current_dart-1); + if (m_current_dart==lcc.number_of_darts()) + { + displayMessage(QString("Draw all darts.")); + } + else + { + displayMessage(QString("Draw dart=%1.").arg((m_current_dart))); + } + compute_elements(); + redraw(); + } + else + { Base::keyPressEvent(e); } + } + + void compute_path(std::size_t i, typename LCC::size_type amark) + { + if ((*m_paths)[i].is_empty()) + { return; } + + CGAL::Random random(static_cast(i)); + CGAL::Color color=get_random_color(random); + + add_point(get_point((*m_paths)[i].get_ith_dart(0)), color); + for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) + { + if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) + { + compute_edge((*m_paths)[i].get_ith_dart(j), color); + lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); + } + } + } + +protected: + const Mesh& mesh; + const typename Get_map::storage_type lcc; + bool m_nofaces; + const DrawingFunctorLCC& m_drawing_functor; + const std::vector >* m_paths; + std::size_t m_current_path; + std::size_t m_current_dart; + bool m_draw_marked_darts; + typename LCC::size_type m_amark; // If !=INVALID_MARK, show darts marked with this mark +}; + +template +void draw(const Mesh& alcc, + const std::vector >& paths, + const char* title="Mesh Viewer", + std::size_t amark=std::numeric_limits::max(), + bool nofill=false, + const DrawingFunctor& drawing_functor=DrawingFunctor()) +{ +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite=true; +#else + bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (!cgal_test_suite) + { + int argc=1; + const char* argv[2]={"lccviewer","\0"}; + QApplication app(argc,const_cast(argv)); + Face_graph_with_path_viewer mainwindow(app.activeWindow(), + alcc, &paths, amark, + title, nofill, + drawing_functor); + mainwindow.show(); + app.exec(); + } +} + +template +void draw(const Mesh& alcc, + const std::vector >& paths, + const char* title="LCC Viewer", + std::size_t amark=std::numeric_limits::max(), + bool nofill=false) +{ + DefaultDrawingFunctorLCC f; + return draw(alcc, paths, title, + amark, nofill, f); +} + +} // End namespace CGAL + +#endif // CGAL_USE_BASIC_VIEWER + +#endif // CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H diff --git a/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies b/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies new file mode 100644 index 00000000000..dc2f511d1b2 --- /dev/null +++ b/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies @@ -0,0 +1,28 @@ +Algebraic_foundations +Arithmetic_kernel +BGL +Cartesian_kernel +Circulator +Combinatorial_map +Distance_2 +Distance_3 +Filtered_kernel +Generalized_map +GraphicsView +Hash_map +Homogeneous_kernel +Installation +Intersections_2 +Intersections_3 +Interval_support +Kernel_23 +Kernel_d +Linear_cell_complex +Modular_arithmetic +Number_types +Profiling_tools +Property_map +Random_numbers +STL_Extension +Stream_support +Surface_mesh_topology diff --git a/Surface_mesh_topology/package_info/Surface_mesh_topology/description.txt b/Surface_mesh_topology/package_info/Surface_mesh_topology/description.txt new file mode 100644 index 00000000000..63424ce7b65 --- /dev/null +++ b/Surface_mesh_topology/package_info/Surface_mesh_topology/description.txt @@ -0,0 +1 @@ +Implementation of topological algorithms on surface meshes. diff --git a/Surface_mesh_topology/package_info/Surface_mesh_topology/license.txt b/Surface_mesh_topology/package_info/Surface_mesh_topology/license.txt new file mode 100644 index 00000000000..8bb8efcb72b --- /dev/null +++ b/Surface_mesh_topology/package_info/Surface_mesh_topology/license.txt @@ -0,0 +1 @@ +GPL (v3 or later) diff --git a/Surface_mesh_topology/package_info/Surface_mesh_topology/long_description.txt b/Surface_mesh_topology/package_info/Surface_mesh_topology/long_description.txt new file mode 100644 index 00000000000..181ab9c6032 --- /dev/null +++ b/Surface_mesh_topology/package_info/Surface_mesh_topology/long_description.txt @@ -0,0 +1 @@ +Given two walks in the vertex-edge graph of a combinatorial map, this package provides linear time algorithms to decide if the walks are homotopic, i.e. can be continuously deformed one into the other on the surface of the combinatorial map. Two notions of homotopy are proposed. Homotopy with fixed basepoints applies to non necessarily closed walks and assumes that the common endpoints of the walks stay fix during the deformation. Free homotopy applies only to closed walks and does not impose any restriction on the deformation. Another helpful algorithm is provided to test if a single curve is contractible; it is equivalent to a homotopy test where one of the closed walks is reduced to a point. diff --git a/Surface_mesh_topology/package_info/Surface_mesh_topology/maintainer b/Surface_mesh_topology/package_info/Surface_mesh_topology/maintainer new file mode 100644 index 00000000000..7c8d8367c57 --- /dev/null +++ b/Surface_mesh_topology/package_info/Surface_mesh_topology/maintainer @@ -0,0 +1,2 @@ +Guillaume Damiand +Francis Lazarus diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt new file mode 100644 index 00000000000..3c0566d65bc --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt @@ -0,0 +1,50 @@ +cmake_minimum_required(VERSION 3.1...3.15) +project(Surface_mesh_topology_Tests) + +if(NOT POLICY CMP0070 AND POLICY CMP0053) + # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. + cmake_policy(SET CMP0053 OLD) +endif() + +if(POLICY CMP0071) + cmake_policy(SET CMP0071 NEW) +endif() + +find_package(CGAL COMPONENTS Qt5) +if(CGAL_Qt5_FOUND) + add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) +endif() + +if ( NOT CGAL_FOUND ) + message(FATAL_ERROR "This program requires the CGAL library, and will not be compiled.") +endif() + +# add_definitions(-DCGAL_TRACE_PATH_TESTS) +# add_definitions(-DCGAL_TRACE_CMAP_TOOLS) +# add_definitions("-Wall -Wextra") +# add_definitions("-D_GLIBCXX_DEBUG") + +set(SOURCE_FILES + fundamental_group_of_the_circle.cpp + fundamental_group_of_the_torus.cpp + homotopy_big_cylinder.cpp + homotopy_double_torus_with_holes.cpp + homotopy_rond_point_saucisse.cpp + homotopy_small_cylinder.cpp + path_tests.cpp + path_with_rle_deformation_tests.cpp + test_homotopy.cpp + test_homotopy_with_polygonal_schema.cpp + tests_path_on_surface.cpp + ) + +foreach(cppfile ${SOURCE_FILES}) + create_single_source_cgal_program("${cppfile}") +endforeach() + +if(CGAL_Qt5_FOUND) + target_link_libraries(fundamental_group_of_the_circle PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(fundamental_group_of_the_torus PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(path_with_rle_deformation_tests PUBLIC CGAL::CGAL_Qt5) + target_link_libraries(test_homotopy PUBLIC CGAL::CGAL_Qt5) +endif() diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/Creation_of_test_cases_for_paths.h b/Surface_mesh_topology/test/Surface_mesh_topology/Creation_of_test_cases_for_paths.h new file mode 100644 index 00000000000..af0cb32a7ba --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/Creation_of_test_cases_for_paths.h @@ -0,0 +1,428 @@ +// Copyright (c) 2019 CNRS and LIRIS' Establishments (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// +#ifndef CGAL_CREATION_OF_TEST_CASES_FOR_PATHS_H +#define CGAL_CREATION_OF_TEST_CASES_FOR_PATHS_H 1 + +#include + +namespace CGAL { + +template +void generate_one_positive_spur(Path& p) +{ + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[5])); + p.extend_straight_positive(6); + p.extend_positive_turn(); + p.extend_positive_turn(0); + p.extend_straight_positive(4); +} + +template +void generate_one_negative_spur(Path& p) +{ + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[5])); + p.extend_straight_negative(6); + p.extend_negative_turn(); + p.extend_positive_turn(0); + p.extend_straight_negative(4); +} + +template +void generate_cyclic_spur(Path& p) +{ + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[5])); + p.extend_positive_turn(0); +} + +template +void generate_one_positive_bracket(Path& p) +{ + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[5])); + p.extend_straight_positive(3); + p.extend_positive_turn(3); + p.extend_positive_turn(); + p.extend_straight_positive(6); + p.extend_positive_turn(); + p.extend_positive_turn(3); + p.extend_straight_positive(2); +} + +template +void generate_one_negative_bracket(Path& p) +{ + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[5])); + p.extend_straight_negative(3); + p.extend_negative_turn(); + p.extend_straight_negative(6); + p.extend_negative_turn(); + p.extend_straight_negative(2); +} + +template +void generate_bracket_special1(Path& p, bool reverse) +{ // Case (x, 1, 2^r, 1) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[79])); + p.extend_positive_turn(1); + p.extend_straight_positive(7); + p.extend_positive_turn(); + + if (reverse) + { p.reverse(); } +} + +template +void generate_positive_bracket_special1(Path& p) +{ generate_bracket_special1(p, false); } + +template +void generate_negative_bracket_special1(Path& p) +{ generate_bracket_special1(p, true); } + +template +void generate_bracket_special2(Path& p, bool reverse) +{ // Case (1, 2^r) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + p.extend_positive_turn(1); + p.extend_straight_positive(10); + + if (reverse) + { p.reverse(); } +} + +template +void generate_positive_bracket_special2(Path& p) +{ generate_bracket_special2(p, false); } + +template +void generate_negative_bracket_special2(Path& p) +{ generate_bracket_special2(p, true); } + +template +void generate_one_l_shape(Path& p) +{ // Generic case (... x -2^s -1 -2^t y ... ): here (-2^2 -3 -2^8 -1 -2^5 -3 -2^3) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + p.extend_straight_negative(2); + p.extend_negative_turn(3); + p.extend_straight_negative(8); + p.extend_negative_turn(); + p.extend_straight_negative(5); + p.extend_negative_turn(3); + p.extend_straight_negative(3); +} + +template +void generate_l_shape_case2(Path& p) +{ // (... x -1 -2^t y ...): here (-2^2 -3 -1 -2^5 -3 -2^3) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + p.extend_straight_negative(2); + p.extend_negative_turn(3); + p.extend_negative_turn(); + p.extend_straight_negative(5); + p.extend_negative_turn(3); + p.extend_straight_negative(3); +} + +template +void generate_l_shape_case3(Path& p) +{ // (... x -2^s -1 y ...): here (-2^2 -3 -2^5 -1 -3 -2^3) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + p.extend_straight_negative(2); + p.extend_negative_turn(3); + p.extend_straight_negative(5); + p.extend_negative_turn(1); + p.extend_negative_turn(3); + p.extend_straight_negative(3); +} + +template +void generate_l_shape_case4(Path& p) +{ // (x -2^s -1 -2^t): here (-2^7 -1 -2^3 -4) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[35])); + p.extend_negative_turn(4); + p.extend_straight_negative(7); + p.extend_negative_turn(1); + p.extend_straight_negative(2); +} + +template +void generate_l_shape_case5(Path& p) +{ // (x -1 -2^t): here (-4 -1 -2^12) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[27])); + p.extend_negative_turn(1); + p.extend_straight_negative(12); +} + +template +void generate_l_shape_case6(Path& p) +{ // (x -2^t -1): here (-4 -2^12 -1) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[13])); + p.extend_straight_negative(12); + p.extend_negative_turn(1); +} + +template +void generate_l_shape_case7(Path& p) +{ // (-3 -2^s -1 -2^t): here (-2^7 -1 -2^3 -3) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[194])); + p.extend_straight_negative(7); + p.extend_negative_turn(1); + p.extend_straight_negative(3); +} + +template +void generate_l_shape_case8(Path& p) +{ // (-2^l): here (-2^20) + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[4])); + p.extend_straight_negative(19); +} + +template +void generate_g1_v0_torus(Path& p) +{ // 1st generator + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + p.extend_straight_negative(4); +} + +template +void generate_g1_v1_torus(Path& p) +{ // 1st generator v2 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[20])); + p.extend_straight_negative(4); +} + +template +void generate_g1_v2_torus(Path& p) +{ // 1st generator v3 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[20])); + p.extend_negative_turn(1); + p.extend_straight_negative(1); + p.extend_positive_turn(1); + p.extend_straight_negative(2); + p.extend_positive_turn(1); + p.extend_straight_negative(2); + p.extend_negative_turn(1); + p.extend_negative_turn(1); +} + +template +void generate_g1_torus(Path& p, std::size_t i) +{ + assert(i<3); + switch(i) + { + case 0: generate_g1_v0_torus(p); break; + case 1: generate_g1_v1_torus(p); break; + case 2: generate_g1_v2_torus(p); break; + default: assert(false); + } +} + +template +void generate_null_cycle_v0_torus(Path& p) +{ // Empty cycle + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[20])); + p.extend_positive_turn(1); + p.extend_positive_turn(1); + p.extend_positive_turn(1); +} + +template +void generate_null_cycle_v1_torus(Path& p) +{ // Empty cycle v2 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[20])); + p.extend_positive_turn(1); + p.extend_straight_positive(1); + p.extend_positive_turn(1); + p.extend_positive_turn(1); + p.extend_straight_positive(1); +} + +template +void generate_null_cycle_v2_torus(Path& p) +{ // Empty cycle v3 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[20])); + p.extend_negative_turn(1); + p.extend_straight_negative(3); + p.extend_negative_turn(1); + p.extend_straight_negative(2); + p.extend_negative_turn(1); + p.extend_straight_negative(3); + p.extend_negative_turn(1); + p.extend_straight_negative(1); +} + +template +void generate_null_cycle_torus(Path& p, std::size_t i) +{ + assert(i<3); + switch(i) + { + case 0: generate_null_cycle_v0_torus(p); break; + case 1: generate_null_cycle_v1_torus(p); break; + case 2: generate_null_cycle_v2_torus(p); break; + default: assert(false); + } +} + +template +void generate_g2_v0_torus(Path& p) +{ // 2nd generator v1 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[1])); + p.extend_straight_positive(4); +} + +template +void generate_g2_v1_torus(Path& p) +{ // 2nd generator v2 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[13])); + p.extend_straight_negative(4); +} + +template +void generate_g2_v2_torus(Path& p) +{ // 2nd generator v3 + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + p.extend_negative_turn(1); + p.extend_positive_turn(1); + p.extend_negative_turn(1); + p.extend_positive_turn(1); + p.extend_negative_turn(1); + p.extend_positive_turn(1); + p.extend_straight_negative(1); + p.extend_positive_turn(1); + p.extend_straight_negative(2); +} + +template +void generate_g2_torus(Path& p, std::size_t i) +{ + assert(i<3); + switch(i) + { + case 0: generate_g2_v0_torus(p); break; + case 1: generate_g2_v1_torus(p); break; + case 2: generate_g2_v2_torus(p); break; + default: assert(false); + } +} + +template +void generate_g1_v0_double_torus(Path& p) +{ // 1st generator + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[16])); + p.extend_straight_negative(2); +} + +template +void generate_g1_v1_double_torus(Path& p) +{ // 1st generator + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[4])); + p.extend_straight_negative(2); +} + +template +void generate_g1_v2_double_torus(Path& p) +{ // 1st generator + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[2])); + p.extend_straight_negative(2); + p.reverse(); +} + +template +void generate_g2_v1_double_torus(Path& p) +{ // 2nd generator + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[10])); + p.extend_straight_negative(2); + p.extend_negative_turn(1); +} + +template +void generate_g1_double_torus(Path& p, std::size_t i) +{ + assert(i<3); + switch(i) + { + case 0: generate_g1_v0_double_torus(p); break; + case 1: generate_g1_v1_double_torus(p); break; + case 2: generate_g1_v2_double_torus(p); break; + default: assert(false); + } +} + +template +void generate_path(Path& p, + const std::initializer_list& v1, + const std::initializer_list& v2) +{ + p.clear(); + p.push_back(p.get_map().darts().iterator_to(p.get_map().darts()[0])); + + std::vector before(v1); + for (auto it=before.begin(), itend=before.end(); it!=itend; ) + { + if (*it<0) { p.extend_negative_turn(-(*it), false); } + else { p.extend_positive_turn(*it, false); } + ++it; + + p.extend_straight_positive(*it, false); + ++it; + } + + Surface_mesh_topology::internal::create_braket_positive(p, 6, false); + + std::vector after(v2); + for (auto it=after.begin(), itend=after.end(); it!=itend; ) + { + if (*it<0) { p.extend_negative_turn(-(*it), false); } + else { p.extend_positive_turn(*it, false); } + ++it; + + p.extend_straight_positive(*it, false); + ++it; + } + + p.update_is_closed(); +} + + +} // namespace CGAL + +#endif // CGAL_CREATION_OF_TEST_CASES_FOR_PATHS_H // +// EOF // diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/2torus-3borders.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/2torus-3borders.off new file mode 100644 index 00000000000..ea69b09b492 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/2torus-3borders.off @@ -0,0 +1,717 @@ +OFF +378 337 0 +-0.104068 -1.09105 -2.19922 +0.546379 -1.585 -1.61175 +-1.41868 -0.391589 2.78987 +-2.66156 0.756377 3.51137 +-2.58826 -0.244602 3.58112 +-1.88464 -1.25177 2.555 +-2.78416 -1.13872 3.16355 +-3.87704 -0.478313 4.12888 +-3.77535 -1.31847 3.58483 +-3.18707 -1.64211 2.39123 +-3.90478 -1.77226 2.69628 +-4.7508 -1.77153 3.7732 +-4.6111 -2.10032 2.83268 +-4.22423 -1.69562 1.74535 +-4.77059 -1.94938 1.85086 +-5.22948 -2.59074 2.78564 +-5.24892 -2.32873 1.81447 +-5.17863 -1.36663 1.13945 +-5.65697 -1.74599 1.10307 +-5.6074 -2.79256 1.64014 +-6.01544 -2.20981 0.928734 +-6.32406 -1.02751 0.877293 +-6.78749 -1.62713 0.651919 +-6.21521 -2.70786 0.635344 +-7.04575 -2.27099 0.272633 +-7.67841 -1.22952 0.897583 +-8.03508 -2.11871 0.373774 +-7.07085 -2.88931 -0.219466 +-8.06975 -2.97263 -0.305832 +-8.8691 -2.29936 0.906657 +-8.91418 -3.40966 0.0230138 +-7.77866 -3.69875 -1.06759 +-8.5357 -4.35377 -0.967445 +-9.33605 -4.06163 0.662664 +-8.89085 -5.17219 -0.502412 +-7.77469 -5.0294 -1.95739 +-7.99566 -5.96693 -1.66688 +-8.73133 -5.89417 0.179864 +-7.78614 -6.73331 -1.04967 +-6.74751 -6.35973 -2.70456 +-6.46824 -7.14806 -2.14532 +-7.21263 -7.08522 -0.301704 +-5.96447 -7.47802 -1.33938 +-4.92046 -7.09346 -2.98836 +-4.4986 -7.42631 -2.13781 +-5.39614 -7.24485 -0.542617 +-4.14997 -7.20089 -1.22138 +-2.97385 -6.93569 -2.61048 +-2.85375 -6.7838 -1.62321 +-3.98526 -6.48877 -0.530035 +-2.98835 -6.168 -0.839076 +-1.64795 -6.03879 -1.70454 +-2.06097 -5.59501 -0.901633 +-3.33491 -5.28378 -0.507041 +-2.66341 -4.86888 -0.552339 +-1.30364 -4.83191 -0.710928 +-2.11503 -4.31633 -0.414251 +-3.26399 -4.09095 -0.76756 +-2.8398 -3.66353 -0.660745 +-1.74919 -3.68599 -0.10774 +-2.55682 -3.17594 -0.423649 +-3.24784 -3.08078 -1.37215 +-2.96486 -2.59319 -1.13505 +-2.44571 -2.68103 -0.0819673 +-2.85375 -2.09828 -0.793373 +-2.84378 -2.12276 -2.01609 +-2.70014 -1.48294 -1.57437 +-2.92656 -1.64966 -0.384131 +-2.79426 -0.902986 -1.04532 +-2.03364 -1.03039 -2.17701 +-2.16362 -0.229446 -1.44636 +-3.11594 -0.445734 -0.486251 +-2.60787 0.402035 -0.674272 +-1.23487 0.157113 -1.45993 +-1.81249 0.978182 -0.456042 +-3.31824 0.795624 0.0555922 +-2.73614 1.48994 0.492947 +-0.982328 1.09979 0.0991504 +-3.90572 1.63693 1.2842 +-3.4446 1.87466 2.14619 +-2.98079 1.54641 2.97645 +-4.96058 1.59975 2.79053 +-4.58148 1.25613 3.65679 +-4.17755 0.481462 4.15571 +-6.15674 0.52448 3.96099 +-5.66946 -0.211476 4.44381 +-5.14534 -1.0674 4.3738 +-6.97562 -1.24735 4.34446 +-6.25574 -1.94801 4.28934 +-5.6048 -2.44881 3.70824 +-6.24481 -3.27692 3.39699 +-5.6929 -3.19036 2.56027 +-6.60148 -4.16611 2.87318 +-5.95116 -3.83422 2.18098 +-5.80717 -3.29061 1.34675 +-5.97627 -4.45254 1.68888 +-5.82659 -3.7689 0.966096 +-6.23463 -3.18615 0.25469 +-5.66355 -4.1756 0.539429 +-6.07159 -3.59285 -0.171977 +-6.86008 -3.41509 -0.77105 +-5.74376 -3.8839 -0.598422 +-6.43627 -3.79134 -1.32235 +-7.19337 -4.21837 -1.82895 +-5.84535 -3.9773 -1.81361 +-6.37729 -4.47519 -2.50741 +-6.7136 -5.36332 -2.83954 +-5.41886 -4.44138 -3.02944 +-5.46743 -5.31936 -3.5183 +-3.75689 -5.8174 -3.97565 +-5.28163 -6.30802 -3.50299 +-3.31053 -6.57543 -3.48743 +-1.8129 -5.65011 -3.58846 +-1.55548 -6.05933 -2.70615 +-0.589874 -4.41777 -3.28049 +-0.397162 -4.8922 -2.41448 +-0.663243 -5.04659 -1.45658 +0.375564 -3.56077 -1.76706 +-0.00633046 -3.91471 -0.906196 +-0.79841 -3.96139 -0.287626 +0.251598 -2.76582 -0.113021 +-0.600038 -3.07778 0.322401 +-1.60555 -3.04617 0.333977 +-0.730019 -2.27684 1.05305 +-1.69967 -2.46622 0.863034 +-2.51851 -2.23241 0.327275 +-2.02135 -2.00896 1.4221 +-2.76734 -1.87871 0.759729 +-3.17538 -1.29596 0.0483235 +-3.16522 -1.65826 1.16853 +-3.57327 -1.07551 0.457127 +-3.63031 -0.160738 0.0422389 +-4.0771 -1.01219 0.79798 +-4.28165 -0.0788819 0.482884 +-4.21776 0.908671 0.664139 +-4.99937 -0.209035 0.787933 +-5.20895 0.728925 1.08542 +-5.1945 1.40321 1.83196 +-6.1844 0.275864 1.27379 +-6.4628 0.814131 2.07688 +-6.45249 0.906812 3.07863 +-7.5732 -0.0664868 1.99242 +-7.75865 -0.12906 2.97928 +-7.53588 -0.569267 3.85608 +-8.73752 -1.39561 2.50324 +-8.56944 -1.90658 3.35344 +-7.95449 -2.5139 3.86841 +-7.55164 -4.18089 3.20358 +-8.49999 -3.87388 3.06727 +-8.55302 -5.17992 2.02784 +-7.59672 -5.29118 2.31993 +-6.63615 -5.02003 2.19358 +-7.21824 -6.2353 1.32948 +-6.34506 -5.74614 1.43182 +-5.76549 -4.97832 1.1373 +-5.75977 -6.26576 0.670459 +-5.34168 -5.35457 0.586004 +-5.33572 -4.46665 0.112983 +-4.75077 -5.54053 0.0947359 +-4.87863 -4.61049 -0.267028 +-5.28667 -4.02774 -0.978433 +-4.3418 -4.59156 -0.559424 +-4.74985 -4.00881 -1.27083 +-5.15136 -3.95282 -2.19162 +-4.19147 -3.82914 -1.44393 +-4.4295 -3.72055 -2.41539 +-4.42195 -4.1206 -3.33848 +-3.75799 -3.30565 -2.46069 +-3.49457 -3.54761 -3.40104 +-1.1802 -3.77391 -3.77966 +-1.9807 -3.16506 -3.75351 +-1.32379 -2.03318 -3.20312 +-0.40747 -2.44249 -3.13223 +0.226025 -3.01195 -2.59689 +-1.06586 -0.884293 -2.40994 +-2.23201 -1.91399 -2.78703 +-3.20961 -2.7531 -2.3226 +-2.73724 -2.78451 -3.21034 +-3.67204 -3.5082 -1.47897 +-3.78342 -4.41188 -0.732521 +-4.05678 -5.51605 -0.283267 +-4.94369 -6.52258 -0.00799987 +-6.45723 -6.91092 0.339534 +-8.10781 -6.29048 0.862765 +-9.20141 -4.72156 1.41004 +-9.28302 -2.75559 1.70209 +-9.14542 -3.34255 2.50754 +-8.40536 -1.14321 1.58773 +-7.0384 -0.401416 1.20883 +-5.70568 -0.537094 0.92433 +-4.63228 -1.11287 1.03394 +-3.66906 -1.59494 1.50939 +-2.53573 -1.72397 1.95059 +-1.17427 -1.64536 1.82514 +-0.495031 -0.903345 1.84088 +0.0825936 -1.72441 0.836986 +0.678966 -2.20933 -0.834045 +-4.17121 -4.90228 -3.92013 +3.06239 2.38608 -0.741233 +2.89192 1.46107 -1.40117 +3.33002 1.07515 -1.02931 +3.51002 2.05184 -0.332497 +2.88714 3.2132 0.0368299 +3.32497 2.92518 0.489037 +3.60114 1.61667 0.198042 +3.42588 2.44379 0.976105 +2.79492 3.60052 1.34627 +2.92388 3.08339 1.78797 +3.15782 1.92188 1.34339 +2.73106 2.46562 2.03358 +2.14954 3.46617 2.54567 +2.07277 2.79102 2.67771 +2.27768 1.94333 2.00511 +1.7714 2.19359 2.50051 +1.25429 2.86283 3.20599 +1.14191 2.24882 2.9068 +0.389659 1.79798 2.56231 +0.885283 1.90355 2.36451 +0.565896 1.93664 1.75128 +0.182516 1.85498 1.90428 +-0.0920717 1.55828 2.64227 +-0.190118 1.66956 1.96614 +-0.0982291 2.25592 1.41482 +-0.470863 2.07051 1.47667 +-0.511624 1.4005 1.93014 +-0.792369 1.80144 1.44067 +-0.845172 2.63382 1.32928 +-1.26081 2.28598 1.28274 +-1.02791 1.47788 1.31072 +-1.5653 1.86768 1.11474 +-1.76821 2.70026 1.50647 +-2.18873 2.12258 1.27447 +-2.70026 2.16165 1.73919 +0.46703 -1.41308 0.294243 +1.26643 -1.5842 -0.443762 +1.15124 -1.17137 0.0997941 +0.396608 -0.748012 0.472769 +0.892042 -0.57299 0.331969 +1.77946 -0.760055 0.0763954 +1.34693 -0.275158 0.315026 +0.571125 0.0209614 0.179049 +0.922994 0.251343 0.165943 +1.71197 0.113208 0.423776 +1.20537 0.551757 0.250064 +0.642249 0.652289 -0.323521 +0.924622 0.952702 -0.2394 +1.38765 0.889647 0.422297 +1.1069 1.29059 -0.0671669 +0.958873 1.18875 -0.889215 +1.19452 1.62556 -0.666557 +1.16933 1.62934 0.174513 +1.27523 2.06349 -0.35412 +1.62268 1.78821 -1.18557 +1.73414 2.393 -0.754084 +1.19225 2.45508 0.0142396 +1.61955 2.93379 -0.245367 +2.40037 2.51326 -0.898394 +2.25138 3.21641 -0.236945 +1.29133 3.35198 0.285454 +1.82462 3.76015 0.453242 +2.38513 3.8528 0.848698 +1.16633 4.08556 1.09738 +1.61079 4.23558 1.60639 +1.97732 4.00468 2.1463 +0.648014 4.32004 2.22781 +0.960748 4.09386 2.80243 +1.18676 3.55063 3.16708 +-0.144619 3.8584 3.24357 +0.139885 3.32763 3.58488 +0.364321 2.67325 3.56117 +-0.877645 2.82134 3.75377 +-0.500704 2.24284 3.70475 +0.457433 2.10302 3.17997 +-0.207854 1.77199 3.2904 +-1.24704 1.61823 3.62119 +-0.78186 1.2916 3.22613 +-0.812204 0.792141 2.42773 +-0.507706 1.21044 2.59573 +-0.747162 1.07693 1.80019 +0.662291 -0.911 -2.0654 +0.975822 -1.42945 -1.73065 +1.20104 -1.68041 -1.12612 +1.99033 -0.76521 -1.76843 +2.16187 -1.05132 -1.16191 +2.08325 -1.0494 -0.474186 +2.93293 -0.230996 -0.932206 +2.73875 -0.352022 -0.278908 +2.2836 -0.223708 0.226583 +3.16189 0.43235 0.12091 +2.60903 0.37955 0.534081 +1.94762 0.550023 0.646434 +2.72049 0.984344 0.965568 +2.02833 0.987952 0.958871 +1.45008 1.2284 0.663977 +1.94535 1.37954 1.32723 +1.38589 1.5313 0.948915 +1.10515 1.93225 0.459451 +1.20205 1.76553 1.24623 +0.921309 2.16648 0.756768 +0.95459 2.75788 0.398604 +0.637733 2.30666 1.03425 +0.587991 2.9391 0.757321 +0.785043 3.60225 0.780855 +0.132182 2.97909 1.05152 +0.155555 3.65748 1.18715 +0.34785 4.15736 1.62566 +-0.528919 3.51167 1.46032 +-0.542123 3.96779 1.98083 +-0.398861 4.09704 2.6456 +-1.40715 3.53737 2.12442 +-1.41639 3.59075 2.8145 +-1.219 3.32382 3.4219 +-2.29431 2.85602 2.7162 +-2.14597 2.54804 3.31811 +-1.75556 2.08661 3.65547 +-2.82508 1.61514 2.94344 +-2.39873 1.20307 3.30063 +-1.79382 0.867112 3.31952 +-1.20238 0.713923 2.99412 +-0.092854 0.286522 -0.201502 +-0.356493 0.327527 -0.840222 +-0.519323 -0.00442653 -1.42541 +0.138941 0.502549 -0.981022 +0.16489 0.237286 -1.61986 +0.359987 -0.289665 -2.0241 +0.793104 0.648602 -1.64326 +1.17681 0.245139 -2.05452 +1.62312 -0.281909 -2.10119 +1.83231 0.942514 -1.85924 +2.39418 0.538412 -1.87148 +2.80448 0.100945 -1.52589 +2.25544 1.72689 -1.45943 +1.29724 1.18495 -1.49307 +0.593828 0.800381 -0.997965 +0.29038 0.421907 -0.310415 +0.187891 -0.114424 0.287962 +-2.93748 1.97248 2.36135 +-2.15349 2.91277 2.04085 +-1.19421 3.18064 1.57075 +-0.363442 2.87352 1.24931 +0.285151 2.33759 1.26182 +0.918479 1.90571 1.52371 +1.34109 1.86356 2.07031 +1.70769 1.68235 1.71159 +2.6059 1.52514 1.47429 +3.30681 1.21872 0.681942 +3.43066 0.691661 -0.4619 +0.545789 -1.58137 -1.60843 +0.0781202 -1.11737 -1.89938 +-0.422828 0.322954 -0.80592 +-0.187512 0.279996 -0.152554 +-1.33034 0.256557 2.65078 +-2.10306 0.686187 3.13353 +-1.94907 0.437814 3.05691 +-1.77585 1.53944 0.914442 +-2.29255 1.63074 0.973211 +-2.36801 1.62687 0.971235 +-2.88609 1.80447 1.76835 +-3.0225 1.73739 2.21755 +-0.479805 0.138356 -1.15353 +-0.632287 -0.0122137 -1.36699 +-0.407607 0.282843 -0.899695 +0.616866 -1.88678 -0.960106 +0.4252 -1.63811 0.0693239 +0.354063 -1.42087 0.352659 +0.404686 -1.12483 0.388539 +-1.69978 1.49583 0.887277 +-2.48375 0.967985 3.15682 +-0.164397 -0.719295 -1.8601 +-1.38166 0.218213 2.69089 +-2.85552 1.73235 1.47658 +-2.85562 1.53068 2.89177 +-0.404632 -0.559783 -1.8068 +-0.524108 -0.282348 -1.58574 +0.618637 -1.83758 -0.494922 +0.501809 -1.85432 -0.226461 +-1.14162 1.16344 1.11838 +0.0208206 0.124178 -0.00331679 +5 0 368 348 347 1 +7 2 351 369 353 352 3 4 +4 2 4 6 5 +4 6 4 7 8 +4 6 8 10 9 +4 10 8 11 12 +4 10 12 14 13 +4 14 12 15 16 +4 14 16 18 17 +4 18 16 19 20 +4 18 20 22 21 +4 22 20 23 24 +4 22 24 26 25 +4 26 24 27 28 +4 26 28 30 29 +4 30 28 31 32 +4 30 32 34 33 +4 34 32 35 36 +4 34 36 38 37 +4 38 36 39 40 +4 38 40 42 41 +4 42 40 43 44 +4 42 44 46 45 +4 46 44 47 48 +4 46 48 50 49 +4 50 48 51 52 +4 50 52 54 53 +4 54 52 55 56 +4 54 56 58 57 +4 58 56 59 60 +4 58 60 62 61 +4 62 60 63 64 +4 62 64 66 65 +4 66 64 67 68 +4 66 68 70 69 +4 70 68 71 72 +4 70 72 74 73 +4 74 72 75 76 +5 74 76 355 354 77 +7 76 78 79 357 370 356 355 +5 80 371 358 357 79 +4 80 79 81 82 +4 80 82 83 3 +4 83 82 84 85 +4 83 85 86 7 +4 86 85 87 88 +4 86 88 89 11 +4 89 90 91 15 +4 91 90 92 93 +4 91 93 94 19 +4 94 93 95 96 +4 94 96 97 23 +4 97 96 98 99 +4 97 99 100 27 +4 100 99 101 102 +4 100 102 103 31 +4 103 102 104 105 +4 103 105 106 35 +4 106 105 107 108 +4 110 109 111 43 +4 111 112 113 47 +4 113 112 114 115 +4 113 115 116 51 +4 116 115 117 118 +4 116 118 119 55 +4 119 118 120 121 +4 119 121 122 59 +4 122 121 123 124 +4 122 124 125 63 +4 125 124 126 127 +4 125 127 128 67 +4 128 127 129 130 +4 128 130 131 71 +4 131 130 132 133 +4 131 133 134 75 +4 134 133 135 136 +4 134 136 137 78 +4 137 136 138 139 +4 137 139 140 81 +4 140 139 141 142 +4 140 142 143 84 +4 143 142 144 145 +4 143 145 146 87 +4 147 148 149 150 +4 151 150 152 153 +4 151 153 154 95 +4 154 153 155 156 +4 154 156 157 98 +4 157 156 158 159 +4 157 159 160 101 +4 160 159 161 162 +4 160 162 163 104 +4 163 162 164 165 +4 163 165 166 107 +4 166 165 167 168 +4 169 170 171 172 +4 169 172 173 114 +4 173 172 0 1 +4 0 172 171 174 +4 171 175 69 174 +4 174 69 70 73 +8 73 359 360 373 372 368 0 174 +4 69 175 65 66 +4 65 175 177 176 +4 177 175 171 170 +4 176 177 168 167 +4 167 178 61 176 +4 176 61 62 65 +4 61 178 57 58 +4 57 178 164 179 +4 164 178 167 165 +4 179 164 162 161 +4 161 180 53 179 +4 179 53 54 57 +4 53 180 49 50 +4 49 180 158 181 +4 158 180 161 159 +4 181 158 156 155 +4 155 182 45 181 +4 181 45 46 49 +4 45 182 41 42 +4 41 182 152 183 +4 152 182 155 153 +4 183 152 150 149 +4 149 184 37 183 +4 183 37 38 41 +4 37 184 33 34 +4 33 184 186 185 +4 186 184 149 148 +4 185 186 145 144 +4 144 187 29 185 +4 185 29 30 33 +4 29 187 25 26 +4 25 187 141 188 +4 141 187 144 142 +4 188 141 139 138 +4 138 189 21 188 +4 188 21 22 25 +4 21 189 17 18 +4 17 189 135 190 +4 135 189 138 136 +4 190 135 133 132 +4 132 191 13 190 +4 190 13 14 17 +4 13 191 9 10 +4 9 191 129 192 +4 129 191 132 130 +4 192 129 127 126 +4 126 193 5 192 +4 192 5 6 9 +4 5 193 194 2 +4 194 193 123 195 +4 123 193 126 124 +4 195 123 121 120 +8 120 196 374 375 363 364 365 195 +5 196 1 347 362 374 +4 1 196 117 173 +4 117 196 120 118 +4 173 117 115 114 +4 166 197 108 107 +4 163 107 105 104 +4 160 104 102 101 +4 157 101 99 98 +4 154 98 96 95 +4 151 95 93 92 +4 143 87 85 84 +4 140 84 82 81 +4 137 81 79 78 +4 134 78 76 75 +4 131 75 72 71 +4 128 71 68 67 +4 125 67 64 63 +4 122 63 60 59 +4 119 59 56 55 +4 116 55 52 51 +4 113 51 48 47 +4 111 47 44 43 +4 110 43 40 39 +4 103 35 32 31 +4 100 31 28 27 +4 97 27 24 23 +4 94 23 20 19 +4 91 19 16 15 +4 89 15 12 11 +4 86 11 8 7 +4 83 7 4 3 +5 80 3 352 367 371 +5 74 77 361 359 73 +4 199 198 201 200 +4 201 198 202 203 +4 201 203 205 204 +4 205 203 206 207 +4 205 207 209 208 +4 209 207 210 211 +4 209 211 213 212 +4 213 211 214 215 +4 217 216 219 218 +4 219 216 220 221 +4 219 221 223 222 +4 223 221 224 225 +4 223 225 227 226 +4 227 225 228 229 +4 227 229 231 230 +6 231 229 366 354 355 356 +4 231 356 370 232 +3 233 364 363 +5 233 363 375 234 235 +4 233 235 237 236 +4 237 235 238 239 +4 237 239 241 240 +4 241 239 242 243 +4 241 243 245 244 +4 245 243 246 247 +4 245 247 249 248 +4 249 247 250 251 +4 249 251 253 252 +4 253 251 254 255 +4 253 255 257 256 +4 257 255 258 259 +4 257 259 260 202 +4 260 259 261 262 +4 260 262 263 206 +4 263 262 264 265 +4 263 265 266 210 +4 266 265 267 268 +4 266 268 269 214 +4 269 268 270 271 +4 269 271 273 272 +4 273 271 274 275 +4 277 276 278 224 +4 279 280 347 348 +4 281 362 347 280 +4 281 280 282 283 +4 281 283 284 234 +4 284 283 285 286 +4 284 286 287 238 +4 287 286 288 289 +4 287 289 290 242 +4 290 289 291 292 +4 290 292 293 246 +4 293 292 294 295 +4 293 295 296 250 +4 296 295 297 298 +4 296 298 299 254 +4 299 298 300 301 +4 299 301 302 258 +4 302 301 303 304 +4 302 304 305 261 +4 305 304 306 307 +4 305 307 308 264 +4 308 307 309 310 +4 308 310 311 267 +4 311 310 312 313 +4 311 313 314 270 +4 314 313 315 316 +4 314 316 317 274 +5 317 316 367 352 353 +4 317 353 369 318 +4 319 320 349 350 +6 321 360 359 361 349 320 +4 321 320 322 323 +5 321 323 324 372 373 +4 324 323 325 326 +4 324 326 327 279 +4 327 326 328 329 +4 327 329 330 282 +4 330 329 199 200 +4 199 329 328 331 +4 328 332 252 331 +4 331 252 253 256 +4 256 198 199 331 +4 198 256 257 202 +4 252 332 248 249 +4 248 332 325 333 +4 325 332 328 326 +4 333 325 323 322 +4 322 334 244 333 +4 333 244 245 248 +4 244 334 240 241 +4 319 334 322 320 +4 335 236 237 240 +4 336 358 371 315 +4 315 371 367 316 +4 336 315 313 312 +4 312 337 232 336 +5 336 232 370 357 358 +4 232 337 230 231 +4 230 337 309 338 +4 309 337 312 310 +4 338 309 307 306 +4 306 339 226 338 +4 338 226 227 230 +4 226 339 222 223 +4 222 339 303 340 +4 303 339 306 304 +4 340 303 301 300 +4 300 341 218 340 +4 340 218 219 222 +4 218 341 342 217 +4 342 341 297 343 +4 297 341 300 298 +4 343 297 295 294 +4 294 344 212 343 +4 212 344 208 209 +4 208 344 291 345 +4 291 344 294 292 +4 345 291 289 288 +4 288 346 204 345 +4 345 204 205 208 +4 204 346 200 201 +4 200 346 285 330 +4 285 346 288 286 +4 330 285 283 282 +4 327 282 280 279 +5 324 279 348 368 372 +3 321 373 360 +3 319 350 377 +4 317 318 275 274 +4 314 274 271 270 +4 311 270 268 267 +4 308 267 265 264 +4 305 264 262 261 +4 302 261 259 258 +4 299 258 255 254 +4 296 254 251 250 +4 293 250 247 246 +4 290 246 243 242 +4 287 242 239 238 +4 284 238 235 234 +5 281 234 375 374 362 +4 228 376 366 229 +4 278 228 225 224 +4 277 224 221 220 +4 269 272 215 214 +4 266 214 211 210 +4 263 210 207 206 +4 260 206 203 202 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/3torus-smooth.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/3torus-smooth.off new file mode 100644 index 00000000000..7c616d9c485 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/3torus-smooth.off @@ -0,0 +1,1148 @@ +OFF +571 575 0 +-0.791599 0.687593 -0.511604 +-0.776057 0.679243 -0.515754 +-0.819617 0.691753 -0.557426 +-0.828663 0.707506 -0.501706 +-0.858373 0.711917 -0.550298 +-0.8729 0.731272 -0.489893 +-0.904631 0.735984 -0.54179 +-0.909963 0.751185 -0.479996 +-0.943387 0.756148 -0.534661 +-0.925506 0.759535 -0.475845 +-0.724789 0.677673 -0.402335 +-0.71094 0.669574 -0.409255 +-0.757815 0.696986 -0.385835 +-0.797234 0.720037 -0.366141 +-0.83026 0.73935 -0.34964 +-0.84411 0.747449 -0.342721 +-0.645048 0.665833 -0.271918 +-0.633219 0.658034 -0.282142 +-0.673256 0.68443 -0.247537 +-0.706923 0.706628 -0.218436 +-0.73513 0.725225 -0.194055 +-0.746959 0.733024 -0.18383 +-0.578238 0.655912 -0.162649 +-0.568102 0.648365 -0.175643 +-0.602408 0.673911 -0.131665 +-0.631257 0.695392 -0.0946835 +-0.655427 0.713391 -0.0636991 +-0.665563 0.720938 -0.0507056 +-0.550221 0.651752 -0.116827 +-0.572698 0.669499 -0.0830736 +-0.599526 0.690681 -0.0427873 +-0.622003 0.708428 -0.00903383 +-0.696789 -0.130497 -0.738842 +-0.683648 -0.118117 -0.737234 +-0.675274 -0.177794 -0.724625 +-0.728123 -0.160021 -0.742676 +-0.705308 -0.210176 -0.7276 +-0.765522 -0.195259 -0.747252 +-0.741156 -0.248824 -0.731151 +-0.796856 -0.224782 -0.751086 +-0.77119 -0.281206 -0.734126 +-0.809996 -0.237163 -0.752694 +-0.748092 -0.0177135 -0.772743 +-0.733652 -0.00819075 -0.770276 +-0.782527 -0.0404216 -0.778626 +-0.823626 -0.0675249 -0.785648 +-0.85806 -0.090233 -0.791531 +-0.8725 -0.0997558 -0.793998 +-0.809325 0.1169 -0.813207 +-0.793333 0.123011 -0.809714 +-0.84746 0.102326 -0.821535 +-0.892976 0.0849316 -0.831475 +-0.93111 0.070358 -0.839803 +-0.947102 0.0642464 -0.843295 +-0.860629 0.229683 -0.847108 +-0.843337 0.232937 -0.842757 +-0.901864 0.221925 -0.857485 +-0.95108 0.212665 -0.86987 +-0.992314 0.204907 -0.880247 +-1.00961 0.201654 -0.884598 +-1.02806 0.487063 -0.320356 +-1.05009 0.480926 -0.307449 +-1.04854 0.490104 -0.353852 +-0.975553 0.501698 -0.351135 +-0.996033 0.504739 -0.384631 +-0.912878 0.519166 -0.387871 +-0.933359 0.522207 -0.421366 +-0.860367 0.533801 -0.418649 +-0.880847 0.536842 -0.452145 +-0.979227 0.479812 -0.240482 +-1.00125 0.473674 -0.227575 +-0.926715 0.494447 -0.27126 +-0.864041 0.511914 -0.307996 +-0.811529 0.526549 -0.338775 +-0.920937 0.471157 -0.145148 +-0.942958 0.465019 -0.13224 +-0.868425 0.485791 -0.175926 +-0.805751 0.503259 -0.212662 +-0.753239 0.517894 -0.24344 +-0.872099 0.463905 -0.065273 +-0.89412 0.457768 -0.0523659 +-0.819588 0.47854 -0.0960516 +-0.756913 0.496007 -0.132787 +-0.704401 0.510642 -0.163566 +-0.851619 0.460864 -0.0317772 +-0.799107 0.475499 -0.0625558 +-0.736433 0.492966 -0.0992915 +-0.683921 0.507601 -0.13007 +-0.958757 -0.110957 -0.486466 +-0.980778 -0.117094 -0.473559 +-0.943031 -0.14553 -0.476074 +-0.906246 -0.096322 -0.517245 +-0.890519 -0.130895 -0.506852 +-0.843572 -0.0788544 -0.55398 +-0.827845 -0.113428 -0.543588 +-0.79106 -0.0642194 -0.584759 +-0.775333 -0.0987929 -0.574367 +-0.99626 -0.0285125 -0.511248 +-1.01828 -0.0346497 -0.498341 +-0.943749 -0.0138775 -0.542027 +-0.881074 0.00359006 -0.578762 +-0.828563 0.018225 -0.609541 +-1.04102 0.069889 -0.540826 +-1.06304 0.0637517 -0.527919 +-0.98851 0.084524 -0.571605 +-0.925835 0.101992 -0.60834 +-0.873324 0.116626 -0.639119 +-1.07852 0.152333 -0.565608 +-1.10054 0.146196 -0.552701 +-1.02601 0.166968 -0.596387 +-0.963338 0.184436 -0.633122 +-0.910827 0.199071 -0.663901 +-0.705152 0.0968942 0.045046 +-0.727173 0.0907569 0.0579532 +-0.652641 0.111529 0.0142675 +-0.589966 0.128997 -0.0224682 +-0.537455 0.143632 -0.0532468 +-0.515434 0.149769 -0.0661539 +-0.716487 0.0217013 -0.0100467 +-0.738508 0.015564 0.00286039 +-0.663976 0.0363362 -0.0408253 +-0.601301 0.0538037 -0.077561 +-0.54879 0.0684386 -0.10834 +-0.526769 0.0745758 -0.121247 +-0.730016 -0.0680451 -0.0758026 +-0.752037 -0.0741824 -0.0628955 +-0.677505 -0.0534102 -0.106581 +-0.61483 -0.0359427 -0.143317 +-0.562319 -0.0213077 -0.174095 +-0.540298 -0.0151705 -0.187003 +-0.741351 -0.143238 -0.130895 +-0.763372 -0.149375 -0.117988 +-0.68884 -0.128603 -0.161674 +-0.626165 -0.111136 -0.19841 +-0.573654 -0.0965006 -0.229188 +-0.551633 -0.0903634 -0.242095 +-1.14372 0.686036 -0.342982 +-1.17715 0.690999 -0.397647 +-1.15917 0.651488 -0.322101 +-1.1909 0.6562 -0.373997 +-1.17761 0.610254 -0.297178 +-1.20732 0.614666 -0.345769 +-1.19306 0.575706 -0.276297 +-1.22107 0.579867 -0.322119 +-1.06402 0.674201 -0.212626 +-1.08351 0.640253 -0.198348 +-1.10676 0.599734 -0.181306 +-1.12625 0.565786 -0.167028 +-0.968891 0.660076 -0.0570405 +-0.993194 0.626844 -0.0506434 +-1.0222 0.587179 -0.0430081 +-1.04651 0.553946 -0.036611 +-0.889188 0.648242 0.0733151 +-0.917529 0.615608 0.0731092 +-0.951355 0.576659 0.0728635 +-0.979696 0.544026 0.0726577 +-0.855764 0.643279 0.12798 +-0.885798 0.610897 0.125005 +-0.921645 0.572248 0.121455 +-0.951679 0.539866 0.11848 +-1.03062 -0.289931 -0.614072 +-1.00495 -0.346355 -0.597112 +-1.05179 -0.275043 -0.579459 +-1.02743 -0.328609 -0.563358 +-1.07707 -0.257273 -0.538147 +-1.05425 -0.307427 -0.523072 +-1.09825 -0.242384 -0.503535 +-1.07673 -0.289681 -0.489318 +-1.09182 -0.155382 -0.654516 +-1.1099 -0.147309 -0.617855 +-1.13147 -0.137673 -0.574098 +-1.14955 -0.1296 -0.537436 +-1.16487 0.00520872 -0.702789 +-1.17925 0.00514737 -0.663682 +-1.19641 0.00507416 -0.617006 +-1.21078 0.00501281 -0.5779 +-1.22607 0.139758 -0.743233 +-1.23735 0.132881 -0.702077 +-1.25081 0.124673 -0.652957 +-1.26209 0.117797 -0.611801 +-0.61673 0.0492806 0.253357 +-0.599058 0.0502425 0.257268 +-0.658872 0.0469869 0.244031 +-0.709171 0.0442493 0.232901 +-0.751313 0.0419557 0.223575 +-0.635229 -0.073434 0.163446 +-0.61795 -0.0750788 0.165446 +-0.676434 -0.0695118 0.158674 +-0.725614 -0.0648304 0.152979 +-0.766819 -0.0609081 0.148208 +-0.657309 -0.2199 0.0561319 +-0.640498 -0.224656 0.0558533 +-0.697395 -0.208559 0.0567963 +-0.74524 -0.195022 0.0575893 +-0.785327 -0.183681 0.0582538 +-0.675808 -0.342614 -0.0337795 +-0.65939 -0.349977 -0.0359681 +-0.714957 -0.325057 -0.0285608 +-0.761684 -0.304102 -0.0223319 +-0.800833 -0.286545 -0.0171132 +0.208929 -0.60526 -0.277216 +0.214684 -0.603079 -0.260167 +0.163408 -0.633947 -0.274605 +0.195207 -0.61046 -0.317871 +0.146935 -0.640881 -0.315102 +0.178828 -0.616667 -0.366394 +0.127273 -0.649157 -0.363438 +0.165106 -0.621867 -0.407049 +0.1108 -0.65609 -0.403935 +0.159351 -0.624048 -0.424098 +0.31748 -0.536852 -0.283441 +0.320484 -0.536404 -0.266234 +0.310317 -0.537918 -0.324472 +0.301767 -0.539191 -0.373445 +0.294604 -0.540257 -0.414476 +0.2916 -0.540705 -0.431683 +0.44704 -0.455203 -0.290871 +0.44676 -0.456825 -0.273476 +0.447706 -0.451336 -0.332351 +0.448501 -0.44672 -0.38186 +0.449167 -0.442852 -0.42334 +0.449447 -0.441231 -0.440735 +0.55559 -0.386795 -0.297096 +0.55256 -0.390151 -0.279543 +0.562816 -0.378794 -0.338953 +0.57144 -0.369244 -0.38891 +0.578666 -0.361243 -0.430767 +0.581696 -0.357888 -0.448319 +0.601111 -0.358108 -0.299707 +0.611088 -0.348373 -0.341721 +0.622995 -0.336754 -0.391867 +0.632972 -0.32702 -0.433881 +-0.155744 -0.123376 0.326689 +-0.140748 -0.133407 0.328434 +-0.149241 -0.0802395 0.358294 +-0.191503 -0.0994566 0.322527 +-0.184608 -0.0537135 0.356042 +-0.234184 -0.0709077 0.31756 +-0.226819 -0.0220535 0.353355 +-0.269943 -0.0469884 0.313398 +-0.262186 0.00447253 0.351103 +-0.171251 -0.22624 0.251322 +-0.155862 -0.233664 0.254977 +-0.207947 -0.208536 0.242606 +-0.251746 -0.187406 0.232203 +-0.288443 -0.169703 0.223487 +-0.189759 -0.349013 0.161368 +-0.173901 -0.353325 0.167302 +-0.227573 -0.338728 0.147216 +-0.272707 -0.326453 0.130325 +-0.310522 -0.316169 0.116173 +-0.205265 -0.451876 0.0860009 +-0.189014 -0.453582 0.0938454 +-0.244017 -0.447808 0.0672946 +-0.290269 -0.442952 0.0449678 +-0.329021 -0.438883 0.0262615 +0.0759064 -0.304892 -0.434656 +0.065259 -0.289686 -0.45322 +0.0426308 -0.325862 -0.432748 +0.101296 -0.341153 -0.39039 +0.0680207 -0.362123 -0.388482 +0.131601 -0.384431 -0.337557 +0.0983249 -0.405402 -0.335648 +0.156991 -0.420692 -0.293291 +0.123715 -0.441662 -0.291382 +0.155256 -0.254886 -0.439207 +0.144609 -0.23968 -0.45777 +0.180646 -0.291147 -0.394941 +0.21095 -0.334425 -0.342107 +0.23634 -0.370686 -0.297841 +0.249964 -0.195201 -0.444638 +0.239316 -0.179995 -0.463201 +0.275354 -0.231462 -0.400372 +0.305658 -0.274741 -0.347539 +0.331048 -0.311002 -0.303272 +0.329313 -0.145196 -0.449189 +0.318666 -0.129989 -0.467752 +0.354703 -0.181456 -0.404923 +0.385008 -0.224735 -0.352089 +0.410398 -0.260996 -0.307823 +0.362589 -0.124225 -0.451097 +0.387979 -0.160486 -0.406831 +0.418283 -0.203765 -0.353997 +0.443673 -0.240025 -0.309731 +-0.190668 0.0473625 0.00679431 +-0.185914 0.078895 0.0298977 +-0.165278 0.0111019 0.0510603 +-0.160524 0.0426344 0.0741638 +-0.134974 -0.0321769 0.103894 +-0.13022 -0.000644371 0.126997 +-0.109584 -0.0684374 0.14816 +-0.10483 -0.0369049 0.171263 +-0.202003 -0.0278304 -0.0482985 +-0.176613 -0.064091 -0.00403242 +-0.146309 -0.10737 0.0488012 +-0.120919 -0.14363 0.0930673 +-0.215532 -0.117577 -0.114054 +-0.190142 -0.153837 -0.0697883 +-0.159838 -0.197116 -0.0169546 +-0.134448 -0.233377 0.0273114 +-0.226867 -0.19277 -0.169147 +-0.201477 -0.22903 -0.124881 +-0.171173 -0.272309 -0.0720474 +-0.145783 -0.308569 -0.0277814 +0.379774 0.189534 -0.203937 +0.369126 0.20474 -0.2225 +0.405164 0.153273 -0.159671 +0.435468 0.109995 -0.106837 +0.460858 0.0737339 -0.0625714 +0.471505 0.0585278 -0.0440082 +0.311759 0.214721 -0.144294 +0.301112 0.229927 -0.162857 +0.337149 0.17846 -0.100028 +0.367453 0.135181 -0.0471941 +0.392843 0.0989208 -0.00292803 +0.403491 0.0837148 0.0156352 +0.230581 0.244783 -0.0731066 +0.219933 0.259989 -0.0916698 +0.255971 0.208522 -0.0288406 +0.286275 0.165243 0.0239931 +0.311665 0.128983 0.0682592 +0.322312 0.113777 0.0868224 +0.162566 0.26997 -0.0134632 +0.151919 0.285176 -0.0320264 +0.187956 0.233709 0.0308028 +0.21826 0.19043 0.0836365 +0.24365 0.15417 0.127903 +0.254298 0.138964 0.146466 +0.0520792 -0.460449 -0.604105 +0.0404118 -0.418988 -0.607716 +0.0264862 -0.369502 -0.612026 +0.0148188 -0.328042 -0.615637 +0.181578 -0.378839 -0.611531 +0.163351 -0.341512 -0.614766 +0.141596 -0.296961 -0.618627 +0.123369 -0.259633 -0.621862 +0.336141 -0.281434 -0.620395 +0.310085 -0.249041 -0.623181 +0.278985 -0.210378 -0.626506 +0.252929 -0.177985 -0.629292 +0.465639 -0.199825 -0.627822 +0.433024 -0.171565 -0.630232 +0.394095 -0.137836 -0.633108 +0.36148 -0.109577 -0.635517 +0.519945 -0.165601 -0.630936 +0.484579 -0.139075 -0.633188 +0.442367 -0.107416 -0.635876 +0.407001 -0.0808897 -0.638128 +0.54799 0.346453 -0.227571 +0.563417 0.346206 -0.218059 +0.511203 0.347042 -0.250255 +0.467296 0.347744 -0.277329 +0.430509 0.348333 -0.300013 +0.436991 0.387558 -0.130233 +0.45006 0.388185 -0.118653 +0.405826 0.386065 -0.157847 +0.36863 0.384282 -0.190807 +0.337465 0.382788 -0.218421 +0.304508 0.436619 -0.0140555 +0.314762 0.438287 -7.4964e-06 +0.280054 0.43264 -0.0475547 +0.250867 0.427891 -0.0875376 +0.226413 0.423913 -0.121037 +0.193508 0.477724 0.0832825 +0.201405 0.480266 0.0993981 +0.174677 0.471663 0.0448528 +0.152201 0.464429 -0.00101489 +0.133369 0.458368 -0.0394446 +0.678111 -0.191235 0.983291 +0.671976 -0.199546 0.968397 +0.720063 -0.220074 1.0009 +0.69274 -0.171416 1.01881 +0.737228 -0.201998 1.03748 +0.710201 -0.147762 1.0612 +0.757715 -0.180424 1.08114 +0.724831 -0.127943 1.09671 +0.774879 -0.162348 1.11772 +0.730966 -0.119632 1.11161 +0.57807 -0.122463 0.941291 +0.57447 -0.132517 0.927462 +0.586654 -0.0984889 0.974269 +0.5969 -0.0698742 1.01363 +0.605484 -0.0458998 1.04661 +0.609084 -0.035846 1.06044 +0.458667 -0.0403814 0.891162 +0.458093 -0.0525152 0.878603 +0.460036 -0.0114468 0.92111 +0.46167 0.023088 0.956855 +0.463039 0.0520225 0.986804 +0.463613 0.0641564 0.999363 +0.358627 0.02839 0.849162 +0.360588 0.0145134 0.837667 +0.35395 0.0614803 0.876572 +0.348369 0.100975 0.909288 +0.343692 0.134066 0.936699 +0.341731 0.147942 0.948193 +1.06996 -0.235029 0.225377 +1.0539 -0.242231 0.229689 +1.10827 -0.217857 0.215093 +1.15399 -0.197361 0.202818 +1.1923 -0.180189 0.192534 +1.20837 -0.172988 0.188221 +1.07696 -0.269345 0.348969 +1.06072 -0.275677 0.35015 +1.11569 -0.254246 0.346153 +1.16192 -0.236226 0.342793 +1.20065 -0.221127 0.339977 +1.21689 -0.214795 0.338797 +1.08531 -0.310302 0.496482 +1.06885 -0.315596 0.493925 +1.12454 -0.297679 0.502581 +1.17137 -0.282612 0.50986 +1.21061 -0.269988 0.515958 +1.22706 -0.264695 0.518516 +1.09231 -0.344618 0.620075 +1.07567 -0.349042 0.614385 +1.13196 -0.334068 0.633642 +1.1793 -0.321476 0.649835 +1.21896 -0.310926 0.663402 +1.23559 -0.306502 0.669091 +0.59306 0.396989 0.423813 +0.606027 0.419162 0.429236 +0.564538 0.407551 0.448825 +0.562141 0.344114 0.410883 +0.533619 0.354676 0.435895 +0.525237 0.281005 0.39545 +0.496715 0.291567 0.420461 +0.494318 0.22813 0.382519 +0.465796 0.238692 0.407531 +0.661075 0.371802 0.36417 +0.674041 0.393975 0.369592 +0.630155 0.318927 0.351239 +0.593251 0.255818 0.335806 +0.562332 0.202943 0.322876 +0.742253 0.34174 0.292983 +0.755219 0.363913 0.298405 +0.711333 0.288865 0.280052 +0.67443 0.225756 0.264619 +0.643511 0.172881 0.251689 +0.810267 0.316553 0.233339 +0.823233 0.338726 0.238762 +0.779348 0.263678 0.220409 +0.742444 0.200569 0.204976 +0.711525 0.147694 0.192045 +0.838789 0.305991 0.208328 +0.80787 0.253116 0.195397 +0.770966 0.190007 0.179964 +0.740047 0.137132 0.167034 +0.849369 0.124778 0.924045 +0.862335 0.146951 0.929467 +0.880036 0.103696 0.93692 +0.818449 0.0719027 0.911114 +0.849116 0.0508211 0.923989 +0.781546 0.00879388 0.895681 +0.812213 -0.0122877 0.908556 +0.750626 -0.044081 0.88275 +0.781293 -0.0651626 0.895625 +0.77624 0.175049 0.893343 +0.789206 0.197222 0.898765 +0.745321 0.122174 0.880412 +0.708417 0.0590654 0.864979 +0.677497 0.00619046 0.852048 +0.688957 0.235051 0.856698 +0.701923 0.257224 0.862121 +0.658038 0.182176 0.843768 +0.621134 0.119067 0.828334 +0.590215 0.0661919 0.815404 +0.615828 0.285322 0.825996 +0.628795 0.307495 0.831419 +0.584909 0.232447 0.813066 +0.548005 0.169338 0.797632 +0.517086 0.116463 0.784702 +1.13581 0.0927637 0.370013 +1.14877 0.114937 0.375435 +1.10489 0.0398887 0.357082 +1.06799 -0.02322 0.341649 +1.03707 -0.076095 0.328719 +1.14092 0.0676791 0.460358 +1.15389 0.0898525 0.465781 +1.11 0.0148042 0.447428 +1.0731 -0.0483046 0.431995 +1.04218 -0.10118 0.419064 +1.14703 0.0377395 0.56819 +1.15999 0.0599129 0.573612 +1.11611 -0.0151354 0.555259 +1.0792 -0.0782442 0.539826 +1.04829 -0.131119 0.526896 +1.15214 0.012655 0.658535 +1.16511 0.0348283 0.663958 +1.12122 -0.04022 0.645605 +1.08432 -0.103329 0.630172 +1.0534 -0.156204 0.617241 +0.444176 0.551684 0.337899 +0.397627 0.568922 0.378718 +0.481654 0.562238 0.356666 +0.437463 0.578602 0.395418 +0.526385 0.574834 0.379065 +0.485009 0.590156 0.415349 +0.563864 0.585387 0.397832 +0.524845 0.599837 0.432048 +0.555175 0.510579 0.240561 +0.58703 0.523215 0.264259 +0.625052 0.538296 0.292542 +0.656907 0.550932 0.31624 +0.687658 0.461519 0.124384 +0.712803 0.476639 0.153966 +0.742814 0.494687 0.189273 +0.767959 0.509807 0.218856 +0.798657 0.420414 0.0270456 +0.81818 0.437616 0.0615582 +0.84148 0.458149 0.102751 +0.861002 0.475352 0.137263 +0.845206 0.403176 -0.0137736 +0.86237 0.421252 0.0228067 +0.882856 0.442826 0.0664671 +0.900021 0.460902 0.103047 +0.862472 0.107436 1.15427 +0.91252 0.0730307 1.17529 +0.878761 0.140492 1.13169 +0.926275 0.10783 1.15164 +0.898204 0.179946 1.10473 +0.942692 0.149364 1.12341 +0.914494 0.213003 1.08215 +0.956446 0.184163 1.09976 +0.743125 0.189479 1.10417 +0.76546 0.218379 1.08412 +0.792118 0.252873 1.06019 +0.814454 0.281774 1.04015 +0.60068 0.287401 1.04437 +0.63023 0.311342 1.02735 +0.6655 0.339916 1.00704 +0.695051 0.363856 0.990018 +0.481333 0.369444 0.99426 +0.516929 0.389229 0.97978 +0.559415 0.412843 0.962497 +0.59501 0.432627 0.948017 +1.32994 0.0551897 0.250095 +1.32255 0.0908924 0.27331 +1.31373 0.133505 0.301018 +1.30634 0.169208 0.324232 +1.33829 0.0142517 0.397539 +1.33048 0.052028 0.413285 +1.32115 0.0971159 0.432079 +1.31334 0.134892 0.447825 +1.34825 -0.0346098 0.57352 +1.33993 0.00564156 0.580352 +1.33001 0.0536835 0.588506 +1.32169 0.0939348 0.595338 +1.3566 -0.0755478 0.720963 +1.34786 -0.0332228 0.720327 +1.33743 0.0172941 0.719567 +1.32869 0.0596191 0.71893 +-0.631429 0.71587 0.00512083 +-0.540795 0.64431 -0.130982 +-0.803364 0.683297 -0.560416 +-0.95964 0.764604 -0.531672 +-0.662679 -0.164215 -0.723377 +-0.783785 -0.294785 -0.735374 +-0.87364 0.454727 -0.0188701 +-1.07057 0.483967 -0.340945 +-0.965051 -0.151668 -0.463167 +0.637155 -0.322937 -0.4515 +0.596928 -0.36219 -0.282088 +0.170316 -0.631039 -0.257622 +-0.13441 -0.0913633 0.359239 +0.351942 -0.109019 -0.46966 +0.712865 -0.227655 0.985564 +0.782077 -0.154768 1.13306 +0.851755 0.328164 0.21375 +0.577504 0.429724 0.454247 +0.893002 0.125869 0.942342 +4 0 1 554 2 +4 3 0 2 4 +4 5 3 4 6 +4 7 5 6 8 +4 9 7 8 555 +4 10 11 1 0 +4 12 10 0 3 +4 13 12 3 5 +4 14 13 5 7 +4 15 14 7 9 +4 16 17 11 10 +4 18 16 10 12 +4 19 18 12 13 +4 20 19 13 14 +4 21 20 14 15 +4 22 23 17 16 +4 24 22 16 18 +4 25 24 18 19 +4 26 25 19 20 +4 27 26 20 21 +4 23 22 28 553 +4 28 22 24 29 +4 29 24 25 30 +4 30 25 26 31 +4 31 26 27 552 +4 32 33 556 34 +4 35 32 34 36 +4 37 35 36 38 +4 39 37 38 40 +4 41 39 40 557 +4 42 43 33 32 +4 44 42 32 35 +4 45 44 35 37 +4 46 45 37 39 +4 47 46 39 41 +4 48 49 43 42 +4 50 48 42 44 +4 51 50 44 45 +4 52 51 45 46 +4 53 52 46 47 +4 54 55 49 48 +4 56 54 48 50 +4 57 56 50 51 +4 58 57 51 52 +4 59 58 52 53 +4 55 54 2 554 +4 2 54 56 4 +4 4 56 57 6 +4 6 57 58 8 +4 8 58 59 555 +4 60 61 559 62 +4 63 60 62 64 +4 65 63 64 66 +4 67 65 66 68 +4 1 67 68 554 +4 69 70 61 60 +4 71 69 60 63 +4 72 71 63 65 +4 73 72 65 67 +4 11 73 67 1 +4 74 75 70 69 +4 76 74 69 71 +4 77 76 71 72 +4 78 77 72 73 +4 17 78 73 11 +4 79 80 75 74 +4 81 79 74 76 +4 82 81 76 77 +4 83 82 77 78 +4 23 83 78 17 +4 80 79 84 558 +4 84 79 81 85 +4 85 81 82 86 +4 86 82 83 87 +4 87 83 23 553 +4 88 89 560 90 +4 91 88 90 92 +4 93 91 92 94 +4 95 93 94 96 +4 33 95 96 556 +4 97 98 89 88 +4 99 97 88 91 +4 100 99 91 93 +4 101 100 93 95 +4 43 101 95 33 +4 102 103 98 97 +4 104 102 97 99 +4 105 104 99 100 +4 106 105 100 101 +4 49 106 101 43 +4 107 108 103 102 +4 109 107 102 104 +4 110 109 104 105 +4 111 110 105 106 +4 55 111 106 49 +4 108 107 62 559 +4 62 107 109 64 +4 64 109 110 66 +4 66 110 111 68 +4 68 111 55 554 +4 112 113 558 84 +4 114 112 84 85 +4 115 114 85 86 +4 116 115 86 87 +4 117 116 87 553 +4 118 119 113 112 +4 120 118 112 114 +4 121 120 114 115 +4 122 121 115 116 +4 123 122 116 117 +4 124 125 119 118 +4 126 124 118 120 +4 127 126 120 121 +4 128 127 121 122 +4 129 128 122 123 +4 130 131 125 124 +4 132 130 124 126 +4 133 132 126 127 +4 134 133 127 128 +4 135 134 128 129 +4 131 130 90 560 +4 90 130 132 92 +4 92 132 133 94 +4 94 133 134 96 +4 96 134 135 556 +4 136 9 555 137 +4 138 136 137 139 +4 140 138 139 141 +4 142 140 141 143 +4 61 142 143 559 +4 144 15 9 136 +4 145 144 136 138 +4 146 145 138 140 +4 147 146 140 142 +4 70 147 142 61 +4 148 21 15 144 +4 149 148 144 145 +4 150 149 145 146 +4 151 150 146 147 +4 75 151 147 70 +4 152 27 21 148 +4 153 152 148 149 +4 154 153 149 150 +4 155 154 150 151 +4 80 155 151 75 +4 27 152 156 552 +4 156 152 153 157 +4 157 153 154 158 +4 158 154 155 159 +4 159 155 80 558 +4 160 41 557 161 +4 162 160 161 163 +4 164 162 163 165 +4 166 164 165 167 +4 89 166 167 560 +4 168 47 41 160 +4 169 168 160 162 +4 170 169 162 164 +4 171 170 164 166 +4 98 171 166 89 +4 172 53 47 168 +4 173 172 168 169 +4 174 173 169 170 +4 175 174 170 171 +4 103 175 171 98 +4 176 59 53 172 +4 177 176 172 173 +4 178 177 173 174 +4 179 178 174 175 +4 108 179 175 103 +4 59 176 137 555 +4 137 176 177 139 +4 139 177 178 141 +4 141 178 179 143 +4 143 179 108 559 +4 180 181 552 156 +4 182 180 156 157 +4 183 182 157 158 +4 184 183 158 159 +4 113 184 159 558 +4 185 186 181 180 +4 187 185 180 182 +4 188 187 182 183 +4 189 188 183 184 +4 119 189 184 113 +4 190 191 186 185 +4 192 190 185 187 +4 193 192 187 188 +4 194 193 188 189 +4 125 194 189 119 +4 195 196 191 190 +4 197 195 190 192 +4 198 197 192 193 +4 199 198 193 194 +4 131 199 194 125 +4 196 195 161 557 +4 161 195 197 163 +4 163 197 198 165 +4 165 198 199 167 +4 167 199 131 560 +4 200 201 563 202 +4 203 200 202 204 +4 205 203 204 206 +4 207 205 206 208 +4 209 207 208 557 +4 210 211 201 200 +4 212 210 200 203 +4 213 212 203 205 +4 214 213 205 207 +4 215 214 207 209 +4 216 217 211 210 +4 218 216 210 212 +4 219 218 212 213 +4 220 219 213 214 +4 221 220 214 215 +4 222 223 217 216 +4 224 222 216 218 +4 225 224 218 219 +4 226 225 219 220 +4 227 226 220 221 +4 223 222 228 562 +4 228 222 224 229 +4 229 224 225 230 +4 230 225 226 231 +4 231 226 227 561 +4 232 233 564 234 +4 235 232 234 236 +4 237 235 236 238 +4 239 237 238 240 +4 181 239 240 552 +4 241 242 233 232 +4 243 241 232 235 +4 244 243 235 237 +4 245 244 237 239 +4 186 245 239 181 +4 246 247 242 241 +4 248 246 241 243 +4 249 248 243 244 +4 250 249 244 245 +4 191 250 245 186 +4 251 252 247 246 +4 253 251 246 248 +4 254 253 248 249 +4 255 254 249 250 +4 196 255 250 191 +4 252 251 202 563 +4 202 251 253 204 +4 204 253 254 206 +4 206 254 255 208 +4 208 255 196 557 +4 256 257 556 258 +4 259 256 258 260 +4 261 259 260 262 +4 263 261 262 264 +4 201 263 264 563 +4 265 266 257 256 +4 267 265 256 259 +4 268 267 259 261 +4 269 268 261 263 +4 211 269 263 201 +4 270 271 266 265 +4 272 270 265 267 +4 273 272 267 268 +4 274 273 268 269 +4 217 274 269 211 +4 275 276 271 270 +4 277 275 270 272 +4 278 277 272 273 +4 279 278 273 274 +4 223 279 274 217 +4 276 275 280 565 +4 280 275 277 281 +4 281 277 278 282 +4 282 278 279 283 +4 283 279 223 562 +4 284 117 553 285 +4 286 284 285 287 +4 288 286 287 289 +4 290 288 289 291 +4 233 290 291 564 +4 292 123 117 284 +4 293 292 284 286 +4 294 293 286 288 +4 295 294 288 290 +4 242 295 290 233 +4 296 129 123 292 +4 297 296 292 293 +4 298 297 293 294 +4 299 298 294 295 +4 247 299 295 242 +4 300 135 129 296 +4 301 300 296 297 +4 302 301 297 298 +4 303 302 298 299 +4 252 303 299 247 +4 135 300 258 556 +4 258 300 301 260 +4 260 301 302 262 +4 262 302 303 264 +4 264 303 252 563 +4 304 305 565 280 +4 306 304 280 281 +4 307 306 281 282 +4 308 307 282 283 +4 309 308 283 562 +4 310 311 305 304 +4 312 310 304 306 +4 313 312 306 307 +4 314 313 307 308 +4 315 314 308 309 +4 316 317 311 310 +4 318 316 310 312 +4 319 318 312 313 +4 320 319 313 314 +4 321 320 314 315 +4 322 323 317 316 +4 324 322 316 318 +4 325 324 318 319 +4 326 325 319 320 +4 327 326 320 321 +4 323 322 285 553 +4 285 322 324 287 +4 287 324 325 289 +4 289 325 326 291 +4 291 326 327 564 +4 328 209 557 40 +4 329 328 40 38 +4 330 329 38 36 +4 331 330 36 34 +4 257 331 34 556 +4 332 215 209 328 +4 333 332 328 329 +4 334 333 329 330 +4 335 334 330 331 +4 266 335 331 257 +4 336 221 215 332 +4 337 336 332 333 +4 338 337 333 334 +4 339 338 334 335 +4 271 339 335 266 +4 340 227 221 336 +4 341 340 336 337 +4 342 341 337 338 +4 343 342 338 339 +4 276 343 339 271 +4 227 340 344 561 +4 344 340 341 345 +4 345 341 342 346 +4 346 342 343 347 +4 347 343 276 565 +4 348 349 561 344 +4 350 348 344 345 +4 351 350 345 346 +4 352 351 346 347 +4 305 352 347 565 +4 353 354 349 348 +4 355 353 348 350 +4 356 355 350 351 +4 357 356 351 352 +4 311 357 352 305 +4 358 359 354 353 +4 360 358 353 355 +4 361 360 355 356 +4 362 361 356 357 +4 317 362 357 311 +4 363 364 359 358 +4 365 363 358 360 +4 366 365 360 361 +4 367 366 361 362 +4 323 367 362 317 +4 364 363 31 552 +4 31 363 365 30 +4 30 365 366 29 +4 29 366 367 28 +4 28 367 323 553 +4 368 369 566 370 +4 371 368 370 372 +4 373 371 372 374 +4 375 373 374 376 +4 377 375 376 567 +4 378 379 369 368 +4 380 378 368 371 +4 381 380 371 373 +4 382 381 373 375 +4 383 382 375 377 +4 384 385 379 378 +4 386 384 378 380 +4 387 386 380 381 +4 388 387 381 382 +4 389 388 382 383 +4 390 391 385 384 +4 392 390 384 386 +4 393 392 386 387 +4 394 393 387 388 +4 395 394 388 389 +4 391 390 234 564 +4 234 390 392 236 +4 236 392 393 238 +4 238 393 394 240 +4 240 394 395 552 +4 396 397 562 228 +4 398 396 228 229 +4 399 398 229 230 +4 400 399 230 231 +4 401 400 231 561 +4 402 403 397 396 +4 404 402 396 398 +4 405 404 398 399 +4 406 405 399 400 +4 407 406 400 401 +4 408 409 403 402 +4 410 408 402 404 +4 411 410 404 405 +4 412 411 405 406 +4 413 412 406 407 +4 414 415 409 408 +4 416 414 408 410 +4 417 416 410 411 +4 418 417 411 412 +4 419 418 412 413 +4 415 414 370 566 +4 370 414 416 372 +4 372 416 417 374 +4 374 417 418 376 +4 376 418 419 567 +4 420 421 569 422 +4 423 420 422 424 +4 425 423 424 426 +4 427 425 426 428 +4 327 427 428 564 +4 429 430 421 420 +4 431 429 420 423 +4 432 431 423 425 +4 433 432 425 427 +4 321 433 427 327 +4 434 435 430 429 +4 436 434 429 431 +4 437 436 431 432 +4 438 437 432 433 +4 315 438 433 321 +4 439 440 435 434 +4 441 439 434 436 +4 442 441 436 437 +4 443 442 437 438 +4 309 443 438 315 +4 440 439 444 568 +4 444 439 441 445 +4 445 441 442 446 +4 446 442 443 447 +4 447 443 309 562 +4 448 449 570 450 +4 451 448 450 452 +4 453 451 452 454 +4 455 453 454 456 +4 369 455 456 566 +4 457 458 449 448 +4 459 457 448 451 +4 460 459 451 453 +4 461 460 453 455 +4 379 461 455 369 +4 462 463 458 457 +4 464 462 457 459 +4 465 464 459 460 +4 466 465 460 461 +4 385 466 461 379 +4 467 468 463 462 +4 469 467 462 464 +4 470 469 464 465 +4 471 470 465 466 +4 391 471 466 385 +4 468 467 422 569 +4 422 467 469 424 +4 424 469 470 426 +4 426 470 471 428 +4 428 471 391 564 +4 472 473 568 444 +4 474 472 444 445 +4 475 474 445 446 +4 476 475 446 447 +4 397 476 447 562 +4 477 478 473 472 +4 479 477 472 474 +4 480 479 474 475 +4 481 480 475 476 +4 403 481 476 397 +4 482 483 478 477 +4 484 482 477 479 +4 485 484 479 480 +4 486 485 480 481 +4 409 486 481 403 +4 487 488 483 482 +4 489 487 482 484 +4 490 489 484 485 +4 491 490 485 486 +4 415 491 486 409 +4 488 487 450 570 +4 450 487 489 452 +4 452 489 490 454 +4 454 490 491 456 +4 456 491 415 566 +4 492 364 552 493 +4 494 492 493 495 +4 496 494 495 497 +4 498 496 497 499 +4 421 498 499 569 +4 500 359 364 492 +4 501 500 492 494 +4 502 501 494 496 +4 503 502 496 498 +4 430 503 498 421 +4 504 354 359 500 +4 505 504 500 501 +4 506 505 501 502 +4 507 506 502 503 +4 435 507 503 430 +4 508 349 354 504 +4 509 508 504 505 +4 510 509 505 506 +4 511 510 506 507 +4 440 511 507 435 +4 349 508 512 561 +4 512 508 509 513 +4 513 509 510 514 +4 514 510 511 515 +4 515 511 440 568 +4 516 377 567 517 +4 518 516 517 519 +4 520 518 519 521 +4 522 520 521 523 +4 449 522 523 570 +4 524 383 377 516 +4 525 524 516 518 +4 526 525 518 520 +4 527 526 520 522 +4 458 527 522 449 +4 528 389 383 524 +4 529 528 524 525 +4 530 529 525 526 +4 531 530 526 527 +4 463 531 527 458 +4 532 395 389 528 +4 533 532 528 529 +4 534 533 529 530 +4 535 534 530 531 +4 468 535 531 463 +4 395 532 493 552 +4 493 532 533 495 +4 495 533 534 497 +4 497 534 535 499 +4 499 535 468 569 +4 536 401 561 512 +4 537 536 512 513 +4 538 537 513 514 +4 539 538 514 515 +4 473 539 515 568 +4 540 407 401 536 +4 541 540 536 537 +4 542 541 537 538 +4 543 542 538 539 +4 478 543 539 473 +4 544 413 407 540 +4 545 544 540 541 +4 546 545 541 542 +4 547 546 542 543 +4 483 547 543 478 +4 548 419 413 544 +4 549 548 544 545 +4 550 549 545 546 +4 551 550 546 547 +4 488 551 547 483 +4 419 548 517 567 +4 517 548 549 519 +4 519 549 550 521 +4 521 550 551 523 +4 523 551 488 570 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/3torus.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/3torus.off new file mode 100644 index 00000000000..059026db6b3 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/3torus.off @@ -0,0 +1,44 @@ +OFF +19 23 0 +-0.32821 0.728949 0.785375 +-0.253234 0.54351 0.0549907 +-0.844014 0.631231 -0.911234 +-1.50977 0.904391 -1.14708 +-0.390354 -0.366081 -0.611454 +-0.60245 -1.09023 -0.547515 +-0.888454 0.366475 0.427312 +-1.47923 0.454195 -0.538913 +-1.02557 -0.543117 -0.239133 +1.3173 0.119589 -0.65761 +0.876658 -0.199807 -0.131025 +-0.083217 -0.804717 -0.0759778 +0.053903 0.104874 0.590467 +0.569521 0.23883 -0.666502 +0.938527 -0.503249 0.961862 +1.44104 -0.487296 1.52816 +1.25068 0.439809 0.0253912 +0.427929 0.74449 0.746884 +1.31255 0.136367 1.11828 +4 0 1 2 3 +4 3 2 4 5 +4 1 6 7 2 +4 2 7 8 4 +4 4 8 6 1 +4 6 0 3 7 +4 7 3 5 8 +4 8 5 0 6 +4 9 10 11 5 +4 5 11 12 0 +4 10 13 4 11 +4 11 4 1 12 +4 12 1 13 10 +4 13 9 5 4 +4 1 0 9 13 +4 0 12 14 15 +4 15 14 10 9 +4 10 16 17 12 +4 12 17 18 14 +4 14 18 16 10 +4 16 9 0 17 +4 17 0 15 18 +4 18 15 9 16 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/case4-right-shift-squared.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/case4-right-shift-squared.off new file mode 100644 index 00000000000..e0a4313e6a1 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/case4-right-shift-squared.off @@ -0,0 +1,116 @@ +OFF +58 56 0 +-3.59691 -2.34215 2.48 +-3.20292 -3.08793 2.48 +-2.85113 -2.34215 2.48 +-2.90813 -1.88152 2.48 +-2.56249 -2.27086 2.48 +-2.67649 -1.34961 2.48 +-4.05405 -2.27086 2.48 +-3.26606 -3.76242 2.48 +1.15125 -1.96625 2.48 +-0.930221 1.0781 2.48 +-1.7745 -4.46599 2.48 +-1.7745 -4.46599 -0.02 +-3.26606 -3.76242 -0.02 +-1.07093 -2.97443 2.48 +-2.56249 -2.27086 -0.02 +-1.07093 -2.97443 -0.02 +-5.46118 -5.05698 2.48 +-5.46118 -5.05698 -0.02 +-5.54561 -3.67799 2.48 +-4.05405 -2.27086 -0.02 +-5.54561 -3.67799 -0.02 +-8.27544 -4.66298 2.48 +-8.27544 -4.66298 -0.02 +-7.31859 -3.87499 2.48 +-7.31859 -3.87499 -0.02 +-9.26043 -2.35529 2.48 +-9.26043 -2.35529 -0.02 +-8.02215 -2.35529 2.48 +-8.02215 -2.35529 -0.02 +-7.76887 0.402682 2.48 +-7.76887 0.402682 -0.02 +-7.17788 -0.976305 2.48 +-7.17788 -0.976305 -0.02 +-5.0109 1.35953 2.48 +-5.0109 1.35953 -0.02 +-5.17975 0.121256 2.48 +-5.17975 0.121256 -0.02 +-2.81577 0.993676 2.48 +-2.81577 0.993676 -0.02 +-3.0972 -0.0194569 2.48 +-3.0972 -0.0194569 -0.02 +-0.930221 1.0781 -0.02 +-1.74943 -1.01422 2.48 +-1.15536 -0.0475995 -0.02 +1.20862 0.627823 2.48 +1.20862 0.627823 -0.02 +-0.66532 -1.54747 2.48 +0.0547696 -0.469738 -0.02 +2.69115 -2.60495 2.48 +2.69115 -2.60495 -0.02 +1.15125 -1.96625 -0.02 +-0.564367 -4.94441 2.48 +-0.564367 -4.94441 -0.02 +-0.311084 -3.84685 2.48 +-0.311084 -3.84685 -0.02 +-2.67649 -1.34961 -0.02 +-0.871786 -2.25201 2.48 +-0.0964756 -1.9298 -0.02 +4 0 1 7 6 +4 1 0 3 2 +4 1 2 4 7 +4 2 3 5 4 +4 3 0 6 5 +4 9 8 39 37 +4 8 9 44 48 +4 10 7 4 13 +4 10 11 12 7 +4 12 11 15 14 +4 6 7 16 18 +4 7 12 17 16 +4 12 19 20 17 +4 18 16 21 23 +4 16 17 22 21 +4 17 20 24 22 +4 23 21 25 27 +4 21 22 26 25 +4 22 24 28 26 +4 27 25 29 31 +4 25 26 30 29 +4 26 28 32 30 +4 31 29 33 35 +4 29 30 34 33 +4 30 32 36 34 +4 35 33 37 39 +4 33 34 38 37 +4 34 36 40 38 +4 37 38 41 9 +4 42 39 8 46 +4 38 40 43 41 +4 9 41 45 44 +4 41 43 47 45 +4 44 45 49 48 +4 45 47 50 49 +4 8 48 51 53 +4 48 49 52 51 +4 49 50 54 52 +4 53 51 10 13 +4 51 52 11 10 +4 52 54 15 11 +4 27 6 18 23 +4 19 28 24 20 +4 35 6 27 31 +4 19 36 32 28 +4 39 5 6 35 +4 55 40 36 19 +4 42 56 5 39 +4 57 43 40 55 +4 8 56 42 46 +4 57 50 47 43 +4 14 55 19 12 +4 56 13 4 5 +4 15 57 55 14 +4 8 53 13 56 +4 54 50 57 15 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/case7-right-shift-squared.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/case7-right-shift-squared.off new file mode 100644 index 00000000000..d9f29d6c04e --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/case7-right-shift-squared.off @@ -0,0 +1,108 @@ +OFF +54 52 0 +1.15125 -1.96625 2.48 +-3.0972 -0.0194569 2.48 +1.15125 -1.96625 -0.02 +-0.0964756 -1.9298 -0.02 +-1.07093 -2.97443 -0.02 +-0.311084 -3.84685 -0.02 +-0.871786 -2.25201 2.48 +-1.07093 -2.97443 2.48 +-0.311084 -3.84685 2.48 +-2.67649 -1.34961 -0.02 +-2.56249 -2.27086 -0.02 +-2.67649 -1.34961 2.48 +-2.56249 -2.27086 2.48 +-4.05405 -2.27086 -0.02 +-3.26606 -3.76242 -0.02 +-4.05405 -2.27086 2.48 +-3.26606 -3.76242 2.48 +0.0547696 -0.469738 -0.02 +-1.15536 -0.0475995 -0.02 +-0.66532 -1.54747 2.48 +-1.74943 -1.01422 2.48 +-3.0972 -0.0194569 -0.02 +-5.17975 0.121256 -0.02 +-5.17975 0.121256 2.48 +-7.17788 -0.976305 -0.02 +-8.02215 -2.35529 -0.02 +-7.17788 -0.976305 2.48 +-8.02215 -2.35529 2.48 +-7.31859 -3.87499 -0.02 +-5.54561 -3.67799 -0.02 +-7.31859 -3.87499 2.48 +-5.54561 -3.67799 2.48 +-1.7745 -4.46599 -0.02 +-0.564367 -4.94441 -0.02 +-1.7745 -4.46599 2.48 +-0.564367 -4.94441 2.48 +2.69115 -2.60495 -0.02 +2.69115 -2.60495 2.48 +1.20862 0.627823 -0.02 +1.20862 0.627823 2.48 +-0.930221 1.0781 -0.02 +-0.930221 1.0781 2.48 +-2.81577 0.993676 -0.02 +-2.81577 0.993676 2.48 +-5.0109 1.35953 -0.02 +-5.0109 1.35953 2.48 +-7.76887 0.402682 -0.02 +-7.76887 0.402682 2.48 +-9.26043 -2.35529 -0.02 +-9.26043 -2.35529 2.48 +-8.27544 -4.66298 -0.02 +-8.27544 -4.66298 2.48 +-5.46118 -5.05698 -0.02 +-5.46118 -5.05698 2.48 +4 0 1 20 19 +4 1 0 41 43 +4 3 2 5 4 +4 0 6 7 8 +4 9 3 4 10 +4 6 11 12 7 +4 13 9 10 14 +4 11 15 16 12 +4 17 2 3 18 +4 0 19 20 6 +4 21 18 3 9 +4 20 1 11 6 +4 22 21 9 13 +4 1 23 15 11 +4 24 22 13 25 +4 23 26 27 15 +4 28 25 13 29 +4 27 30 31 15 +4 4 5 33 32 +4 8 7 34 35 +4 32 33 35 34 +4 5 2 36 33 +4 0 8 35 37 +4 33 36 37 35 +4 2 17 38 36 +4 0 37 39 41 +4 36 38 39 37 +4 17 18 40 38 +4 38 40 41 39 +4 18 21 42 40 +4 40 42 43 41 +4 21 22 44 42 +4 23 1 43 45 +4 42 44 45 43 +4 22 24 46 44 +4 26 23 45 47 +4 44 46 47 45 +4 24 25 48 46 +4 27 26 47 49 +4 46 48 49 47 +4 25 28 50 48 +4 30 27 49 51 +4 48 50 51 49 +4 28 29 52 50 +4 31 30 51 53 +4 50 52 53 51 +4 29 13 14 52 +4 15 31 53 16 +4 52 14 16 53 +4 4 32 14 10 +4 34 7 12 16 +4 14 32 34 16 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/cases5-6-right-shift-squared.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/cases5-6-right-shift-squared.off new file mode 100644 index 00000000000..4cd7b75dc2b --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/cases5-6-right-shift-squared.off @@ -0,0 +1,108 @@ +OFF +54 52 0 +-0.165648 -3.52452 -0.0225537 +1.07263 -2.37067 -0.023212 +0.763058 -0.794688 -0.0240101 +-0.531502 -0.147408 -0.024279 +-0.165648 -3.52452 2.47745 +1.07263 -2.37067 2.47679 +0.763058 -0.794688 2.47599 +-0.531502 -0.147408 2.47572 +-1.99492 0.471729 -0.0245247 +-3.74477 -0.520175 0.0098994 +-2.90391 -2.03577 0.022642 +-1.29135 -1.01983 -0.0237901 +-1.99492 0.471729 2.47548 +-3.74477 -0.520175 2.5099 +-2.90391 -2.03577 2.52264 +-1.29135 -1.01983 2.47621 +-3.56633 1.14457 -0.0170782 +-5.6816 1.06272 -0.0246437 +-5.76602 -0.316263 -0.0239274 +-3.56633 1.14457 2.48292 +-5.6816 1.06272 2.47536 +-5.76602 -0.316263 2.47607 +-8.49585 0.668727 -0.0242981 +-7.53901 -0.119265 -0.0239396 +-8.49585 0.668727 2.4757 +-7.53901 -0.119265 2.47606 +-9.48084 -1.63896 -0.0230568 +-8.24257 -1.63896 -0.0231193 +-9.48084 -1.63896 2.47694 +-8.24257 -1.63896 2.47688 +-7.98929 -4.39694 -0.0217081 +-7.39829 -3.01795 -0.0224499 +-7.98929 -4.39694 2.47829 +-7.39829 -3.01795 2.47755 +-5.23131 -5.35379 -0.0213533 +-5.40017 -4.11551 -0.0219841 +-5.23131 -5.35379 2.47865 +-5.40017 -4.11551 2.47802 +-3.03619 -4.98793 -0.0216531 +-3.31762 -3.9748 -0.022162 +-3.03619 -4.98793 2.47835 +-3.31762 -3.9748 2.47784 +-1.15064 -5.07236 -0.0217047 +-1.37578 -3.94666 -0.0222746 +-1.15064 -5.07236 2.4783 +-1.37578 -3.94666 2.47773 +0.988198 -4.62208 -0.0220453 +0.988198 -4.62208 2.47795 +2.42347 -2.14553 -0.0233965 +2.42347 -2.14553 2.4766 +1.55105 0.16216 -0.024544 +1.55105 0.16216 2.47546 +-0.784785 0.950153 -0.0248329 +-0.784785 0.950153 2.47517 +4 0 1 2 3 +4 5 4 7 6 +4 8 9 10 11 +4 8 12 13 9 +4 13 12 15 14 +4 9 16 17 18 +4 9 13 19 16 +4 19 13 21 20 +4 16 19 20 17 +4 18 17 22 23 +4 20 21 25 24 +4 17 20 24 22 +4 23 22 26 27 +4 24 25 29 28 +4 22 24 28 26 +4 27 26 30 31 +4 28 29 33 32 +4 26 28 32 30 +4 31 30 34 35 +4 32 33 37 36 +4 30 32 36 34 +4 35 34 38 39 +4 36 37 41 40 +4 34 36 40 38 +4 39 38 42 43 +4 40 41 45 44 +4 38 40 44 42 +4 43 42 46 0 +4 44 45 4 47 +4 42 44 47 46 +4 0 46 48 1 +4 47 4 5 49 +4 46 47 49 48 +4 1 48 50 2 +4 49 5 6 51 +4 48 49 51 50 +4 2 50 52 3 +4 51 6 7 53 +4 50 51 53 52 +4 3 52 8 11 +4 53 7 15 12 +4 52 53 12 8 +4 31 18 23 27 +4 21 33 29 25 +4 35 9 18 31 +4 13 37 33 21 +4 10 9 35 39 +4 13 14 41 37 +4 43 11 10 39 +4 15 45 41 14 +4 0 3 11 43 +4 7 4 45 15 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/cube-mesh-5-5.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/cube-mesh-5-5.off new file mode 100644 index 00000000000..6533c3f2ad4 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/cube-mesh-5-5.off @@ -0,0 +1,304 @@ +OFF +152 150 0 +0.950508 -9.37486 -2.46983 +2.37913 -8.62152 -2.67216 +1.71897 -7.67871 -3.82311 +0.290347 -8.43205 -3.62079 +1.0588 -6.73591 -4.97407 +-0.369815 -7.48924 -4.77174 +0.398643 -5.7931 -6.12503 +-1.02998 -6.54643 -5.9227 +-0.261519 -4.85029 -7.27598 +-1.69014 -5.60362 -7.07366 +-0.921681 -3.90748 -8.42694 +-2.3503 -4.66081 -8.22461 +3.80775 -7.86819 -2.87448 +3.14759 -6.92538 -4.02544 +2.48742 -5.98257 -5.1764 +1.82726 -5.03976 -6.32735 +1.1671 -4.09695 -7.47831 +0.506939 -3.15414 -8.62927 +5.23637 -7.11485 -3.07681 +4.57621 -6.17205 -4.22777 +3.91604 -5.22924 -5.37873 +3.25588 -4.28643 -6.52968 +2.59572 -3.34362 -7.68064 +1.93556 -2.40081 -8.8316 +6.66499 -6.36152 -3.27914 +6.00483 -5.41871 -4.4301 +5.34466 -4.4759 -5.58105 +4.6845 -3.53309 -6.73201 +4.02434 -2.59029 -7.88297 +3.36418 -1.64748 -9.03392 +8.09361 -5.60819 -3.48147 +7.43345 -4.66538 -4.63242 +6.77328 -3.72257 -5.78338 +6.11312 -2.77976 -6.93434 +5.45296 -1.83695 -8.08529 +4.7928 -0.894142 -9.23625 +-1.12696 -3.91362 3.19534 +0.301659 -3.16029 2.99301 +-0.358503 -2.21748 1.84206 +-1.78712 -2.97081 2.04438 +-1.01866 -1.27467 0.691098 +-2.44728 -2.02801 0.893426 +-1.67883 -0.331862 -0.459858 +-3.10745 -1.0852 -0.257531 +-2.33899 0.610946 -1.61082 +-3.76761 -0.142388 -1.40849 +-2.99915 1.55376 -2.76177 +-4.42777 0.800421 -2.55944 +1.73028 -2.40695 2.79068 +1.07012 -1.46415 1.63973 +0.409955 -0.521337 0.488771 +-0.250207 0.421472 -0.662186 +-0.910368 1.36428 -1.81314 +-1.57053 2.30709 -2.9641 +3.1589 -1.65362 2.58836 +2.49874 -0.710811 1.4374 +1.83858 0.231997 0.286443 +1.17841 1.17481 -0.864514 +0.518252 2.11761 -2.01547 +-0.14191 3.06042 -3.16643 +4.58752 -0.900286 2.38603 +3.92736 0.0425226 1.23507 +3.2672 0.985331 0.0841159 +2.60703 1.92814 -1.06684 +1.94687 2.87095 -2.2178 +1.28671 3.81376 -3.36875 +6.01614 -0.146952 2.1837 +5.35598 0.795857 1.03275 +4.69581 1.73867 -0.118212 +4.03565 2.68147 -1.26917 +3.37549 3.62428 -2.42013 +2.71533 4.56709 -3.57108 +-0.125147 -7.3398 -2.48775 +0.535014 -8.28261 -1.3368 +-0.540641 -6.24755 -1.35472 +0.119521 -7.19036 -0.203761 +-0.956135 -5.15531 -0.221684 +-0.295973 -6.09812 0.929272 +-1.37163 -4.06306 0.911349 +-0.711467 -5.00587 2.06231 +-0.785309 -6.39699 -3.63871 +-1.2008 -5.30475 -2.50568 +-1.6163 -4.2125 -1.37264 +-2.03179 -3.12025 -0.239608 +-1.44547 -5.45418 -4.78967 +-1.86096 -4.36194 -3.65663 +-2.27646 -3.26969 -2.5236 +-2.69195 -2.17744 -1.39056 +-2.10563 -4.51137 -5.94062 +-2.52113 -3.41913 -4.80759 +-2.93662 -2.32688 -3.67456 +-3.35211 -1.23463 -2.54152 +-2.76579 -3.56857 -7.09158 +-3.18129 -2.47632 -5.95855 +-3.59678 -1.38407 -4.82551 +-4.01228 -0.291826 -3.69248 +7.01795 -3.57313 -3.49939 +7.67811 -4.51594 -2.34843 +6.60246 -2.48088 -2.36636 +7.26262 -3.42369 -1.2154 +6.18696 -1.38864 -1.23332 +6.84713 -2.33145 -0.0823653 +5.77147 -0.29639 -0.100288 +6.43163 -1.2392 1.05067 +6.35779 -2.63032 -4.65035 +5.9423 -1.53807 -3.51731 +5.5268 -0.445828 -2.38428 +5.11131 0.646419 -1.25125 +5.69763 -1.68751 -5.8013 +5.28213 -0.595266 -4.66827 +4.86664 0.496981 -3.53524 +4.45115 1.58923 -2.4022 +5.03747 -0.744704 -6.95226 +4.62197 0.347543 -5.81923 +4.20648 1.43979 -4.68619 +3.79099 2.53204 -3.55316 +4.37731 0.198104 -8.10322 +3.96181 1.29035 -6.97018 +3.54632 2.3826 -5.83715 +3.13082 3.47484 -4.70412 +1.96363 -7.52928 -1.53912 +3.39225 -6.77594 -1.74145 +4.82087 -6.02261 -1.94378 +6.24949 -5.26927 -2.14611 +1.54814 -6.43703 -0.406089 +2.97676 -5.68369 -0.608416 +4.40538 -4.93036 -0.810744 +5.834 -4.17703 -1.01307 +1.13265 -5.34478 0.726945 +2.56127 -4.59145 0.524617 +3.98989 -3.83811 0.32229 +5.41851 -3.08478 0.119962 +0.717153 -4.25254 1.85998 +2.14577 -3.4992 1.65765 +3.57439 -2.74587 1.45532 +5.00301 -1.99253 1.253 +-1.33717 -2.81523 -7.29391 +0.0914455 -2.0619 -7.49623 +1.52007 -1.30856 -7.69856 +2.94869 -0.55523 -7.90089 +-1.75267 -1.72299 -6.16087 +-0.324048 -0.969651 -6.3632 +1.10457 -0.216317 -6.56553 +2.53319 0.537017 -6.76786 +-2.16816 -0.630739 -5.02784 +-0.739542 0.122596 -5.23017 +0.689078 0.87593 -5.43249 +2.1177 1.62926 -5.63482 +-2.58366 0.461508 -3.89481 +-1.15504 1.21484 -4.09713 +0.273584 1.96818 -4.29946 +1.7022 2.72151 -4.50179 +4 0 1 2 3 +4 3 2 4 5 +4 5 4 6 7 +4 7 6 8 9 +4 9 8 10 11 +4 1 12 13 2 +4 2 13 14 4 +4 4 14 15 6 +4 6 15 16 8 +4 8 16 17 10 +4 12 18 19 13 +4 13 19 20 14 +4 14 20 21 15 +4 15 21 22 16 +4 16 22 23 17 +4 18 24 25 19 +4 19 25 26 20 +4 20 26 27 21 +4 21 27 28 22 +4 22 28 29 23 +4 24 30 31 25 +4 25 31 32 26 +4 26 32 33 27 +4 27 33 34 28 +4 28 34 35 29 +4 37 36 39 38 +4 38 39 41 40 +4 40 41 43 42 +4 42 43 45 44 +4 44 45 47 46 +4 48 37 38 49 +4 49 38 40 50 +4 50 40 42 51 +4 51 42 44 52 +4 52 44 46 53 +4 54 48 49 55 +4 55 49 50 56 +4 56 50 51 57 +4 57 51 52 58 +4 58 52 53 59 +4 60 54 55 61 +4 61 55 56 62 +4 62 56 57 63 +4 63 57 58 64 +4 64 58 59 65 +4 66 60 61 67 +4 67 61 62 68 +4 68 62 63 69 +4 69 63 64 70 +4 70 64 65 71 +4 0 3 72 73 +4 73 72 74 75 +4 75 74 76 77 +4 77 76 78 79 +4 79 78 39 36 +4 3 5 80 72 +4 72 80 81 74 +4 74 81 82 76 +4 76 82 83 78 +4 78 83 41 39 +4 5 7 84 80 +4 80 84 85 81 +4 81 85 86 82 +4 82 86 87 83 +4 83 87 43 41 +4 7 9 88 84 +4 84 88 89 85 +4 85 89 90 86 +4 86 90 91 87 +4 87 91 45 43 +4 9 11 92 88 +4 88 92 93 89 +4 89 93 94 90 +4 90 94 95 91 +4 91 95 47 45 +4 31 30 97 96 +4 96 97 99 98 +4 98 99 101 100 +4 100 101 103 102 +4 102 103 66 67 +4 32 31 96 104 +4 104 96 98 105 +4 105 98 100 106 +4 106 100 102 107 +4 107 102 67 68 +4 33 32 104 108 +4 108 104 105 109 +4 109 105 106 110 +4 110 106 107 111 +4 111 107 68 69 +4 34 33 108 112 +4 112 108 109 113 +4 113 109 110 114 +4 114 110 111 115 +4 115 111 69 70 +4 35 34 112 116 +4 116 112 113 117 +4 117 113 114 118 +4 118 114 115 119 +4 119 115 70 71 +4 0 73 120 1 +4 1 120 121 12 +4 12 121 122 18 +4 18 122 123 24 +4 24 123 97 30 +4 73 75 124 120 +4 120 124 125 121 +4 121 125 126 122 +4 122 126 127 123 +4 123 127 99 97 +4 75 77 128 124 +4 124 128 129 125 +4 125 129 130 126 +4 126 130 131 127 +4 127 131 101 99 +4 77 79 132 128 +4 128 132 133 129 +4 129 133 134 130 +4 130 134 135 131 +4 131 135 103 101 +4 79 36 37 132 +4 132 37 48 133 +4 133 48 54 134 +4 134 54 60 135 +4 135 60 66 103 +4 92 11 10 136 +4 136 10 17 137 +4 137 17 23 138 +4 138 23 29 139 +4 139 29 35 116 +4 93 92 136 140 +4 140 136 137 141 +4 141 137 138 142 +4 142 138 139 143 +4 143 139 116 117 +4 94 93 140 144 +4 144 140 141 145 +4 145 141 142 146 +4 146 142 143 147 +4 147 143 117 118 +4 95 94 144 148 +4 148 144 145 149 +4 149 145 146 150 +4 150 146 147 151 +4 151 147 118 119 +4 47 95 148 46 +4 46 148 149 53 +4 53 149 150 59 +4 59 150 151 65 +4 65 151 119 71 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/cylinder-2-borders-12darts.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/cylinder-2-borders-12darts.off new file mode 100644 index 00000000000..499f18619a9 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/cylinder-2-borders-12darts.off @@ -0,0 +1,11 @@ +OFF +6 3 0 +-1 -0.866025 0.5 +1 -0.866025 0.5 +1 0 -1 +-1 0 -1 +-1 0.866025 0.5 +1 0.866025 0.5 +4 0 1 2 3 +4 4 5 1 0 +4 3 2 5 4 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/cylinder-with-two-borders.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/cylinder-with-two-borders.off new file mode 100644 index 00000000000..a11b7d589d8 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/cylinder-with-two-borders.off @@ -0,0 +1,92 @@ +OFF +50 40 0 +0.5 -0.587785 -0.809017 +1 -0.587785 -0.809017 +1 0 -1 +0.5 0 -1 +4.9538e-17 -0.587785 -0.809017 +6.12323e-17 0 -1 +-0.5 -0.587785 -0.809017 +-0.5 0 -1 +-1 -0.587785 -0.809017 +-1 0 -1 +0.5 -0.951057 -0.309017 +1 -0.951057 -0.309017 +1.89218e-17 -0.951057 -0.309017 +-0.5 -0.951057 -0.309017 +-1 -0.951057 -0.309017 +0.5 -0.951057 0.309017 +1 -0.951057 0.309017 +-1.89218e-17 -0.951057 0.309017 +-0.5 -0.951057 0.309017 +-1 -0.951057 0.309017 +0.5 -0.587785 0.809017 +1 -0.587785 0.809017 +-4.9538e-17 -0.587785 0.809017 +-0.5 -0.587785 0.809017 +-1 -0.587785 0.809017 +0.5 0 1 +1 0 1 +-6.12323e-17 0 1 +-0.5 0 1 +-1 0 1 +0.5 0.587785 0.809017 +1 0.587785 0.809017 +-4.9538e-17 0.587785 0.809017 +-0.5 0.587785 0.809017 +-1 0.587785 0.809017 +0.5 0.951057 0.309017 +1 0.951057 0.309017 +-1.89218e-17 0.951057 0.309017 +-0.5 0.951057 0.309017 +-1 0.951057 0.309017 +0.5 0.951057 -0.309017 +1 0.951057 -0.309017 +1.89218e-17 0.951057 -0.309017 +-0.5 0.951057 -0.309017 +-1 0.951057 -0.309017 +0.5 0.587785 -0.809017 +1 0.587785 -0.809017 +4.9538e-17 0.587785 -0.809017 +-0.5 0.587785 -0.809017 +-1 0.587785 -0.809017 +4 0 1 2 3 +4 4 0 3 5 +4 6 4 5 7 +4 8 6 7 9 +4 10 11 1 0 +4 12 10 0 4 +4 13 12 4 6 +4 14 13 6 8 +4 15 16 11 10 +4 17 15 10 12 +4 18 17 12 13 +4 19 18 13 14 +4 20 21 16 15 +4 22 20 15 17 +4 23 22 17 18 +4 24 23 18 19 +4 25 26 21 20 +4 27 25 20 22 +4 28 27 22 23 +4 29 28 23 24 +4 30 31 26 25 +4 32 30 25 27 +4 33 32 27 28 +4 34 33 28 29 +4 35 36 31 30 +4 37 35 30 32 +4 38 37 32 33 +4 39 38 33 34 +4 40 41 36 35 +4 42 40 35 37 +4 43 42 37 38 +4 44 43 38 39 +4 45 46 41 40 +4 47 45 40 42 +4 48 47 42 43 +4 49 48 43 44 +4 3 2 46 45 +4 5 3 45 47 +4 7 5 47 48 +4 9 7 48 49 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/double-torus-example.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/double-torus-example.off new file mode 100644 index 00000000000..8057aeea46f --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/double-torus-example.off @@ -0,0 +1,453 @@ +OFF +231 220 0 +-0.955208 -0.407325 -0.787544 +-2.08027 1.27659 2.23891 +-1.89394 0.627623 2.6022 +-1.35085 -0.32611 1.92438 +-2.0187 -0.118527 2.47749 +-2.98275 0.471686 3.09898 +-2.82311 -0.233732 2.84451 +-2.38146 -0.524773 1.93784 +-2.90146 -0.599248 2.1751 +-3.60475 -0.648909 2.95275 +-3.40675 -0.867637 2.24507 +-3.17192 -0.410747 1.48287 +-3.56274 -0.618335 1.53699 +-3.79724 -1.27678 2.13389 +-3.86477 -0.934793 1.451 +-3.98134 -0.0470402 1.2433 +-4.37183 -0.456187 1.13212 +-4.01819 -1.29744 1.24193 +-4.57018 -0.925055 0.861821 +-5.02139 -0.121326 1.36406 +-5.32823 -0.846626 0.945918 +-4.53711 -1.36078 0.485927 +-5.27707 -1.52065 0.364442 +-5.84827 -1.1081 1.44496 +-5.77902 -2.02043 0.6579 +-4.87804 -2.00991 -0.265205 +-5.23892 -2.68267 -0.19436 +-5.74894 -2.56735 1.1944 +-5.1504 -3.30124 0.249929 +-4.33495 -2.96364 -0.94302 +-4.14862 -3.61261 -0.579731 +-4.66433 -3.50327 0.807404 +-3.76036 -3.78424 0.0587442 +-2.94201 -3.4398 -1.13026 +-2.67155 -3.6283 -0.438035 +-3.3976 -3.37799 0.598396 +-2.59319 -3.26279 0.231378 +-1.61356 -3.06634 -0.584539 +-1.81155 -2.84761 0.123141 +-2.75284 -2.55737 0.485847 +-2.24755 -2.28898 0.415877 +-1.2075 -2.2147 0.295123 +-1.85706 -1.87983 0.527054 +-2.66615 -1.71769 0.122188 +-2.36412 -1.40123 0.208179 +-1.65871 -1.41097 0.797358 +-2.2107 -1.03858 0.417248 +-2.43165 -1.05924 -0.47471 +-2.23329 -0.59037 -0.204406 +-2.23628 -0.701564 0.707986 +-2.26637 -0.154647 0.171488 +-1.71325 -0.328896 -0.703447 +-1.76441 0.345132 -0.121971 +-2.52431 0.161632 0.57852 +-2.16344 0.83439 0.507675 +-2.46853 1.44822 1.60043 +-2.83129 1.04197 1.06078 +-2.95605 0.295824 0.936075 +-2.43579 -0.456935 1.02281 +-2.76972 -0.353144 1.29936 +-3.47605 0.221349 1.17333 +-1.94973 -0.658965 1.58028 +-1.69178 -0.975244 1.17325 +-0.951822 -0.815367 1.29474 +-0.900662 -1.4894 0.713261 +-0.38062 -1.22792 0.21422 +-0.795936 -2.20965 -0.351752 +-0.863465 -1.86766 -1.03464 +-1.76955 -2.81704 -1.29261 +-1.37052 -1.38906 -1.35352 +-2.18815 -2.24574 -1.5863 +-3.24614 -2.80771 -1.4398 +-2.62414 -1.68711 -1.29357 +-3.40578 -2.10229 -1.18533 +-4.21019 -2.2175 -0.818312 +-3.32743 -1.73677 -0.515917 +-3.84743 -1.81125 -0.27866 +-4.27916 -1.67706 0.0788946 +-3.45917 -1.98288 0.359816 +-3.7931 -1.87909 0.636369 +-3.99261 -1.63446 0.951193 +-3.70458 -2.49765 1.08066 +-3.96252 -2.18138 1.48769 +-3.99559 -1.74565 1.86358 +-4.46448 -2.68115 1.78115 +-4.51564 -2.00713 2.36263 +-4.2088 -1.28183 2.78076 +-5.27368 -1.9287 2.44672 +-4.85836 -0.946965 3.0127 +-4.04074 -0.0902782 3.24548 +-5.36542 -0.468358 2.69382 +-4.45934 0.481017 2.95179 +-3.28688 1.10378 2.78944 +-4.61533 0.730319 2.24372 +-3.55734 1.29228 2.09721 +-3.6357 0.926767 1.4278 +-4.41734 0.511591 1.53604 +-5.43295 -0.126368 2.01093 +-5.82568 -1.55631 2.06661 +-5.20443 -2.84103 1.65966 +-4.06545 -3.17041 1.1515 +-3.27284 -2.63185 0.723104 +-3.05697 -1.92527 0.176307 +-2.82214 -1.46838 -0.585887 +-2.02009 -1.0542 -1.12159 +2.84039 3.05644 -0.113547 +2.853 2.13918 -0.872153 +3.39492 1.75991 -0.50561 +3.38094 2.77641 0.335073 +2.35696 3.74549 0.728177 +2.84521 3.54002 1.26787 +3.40711 2.24707 0.874502 +2.92369 2.93613 1.71623 +1.89383 3.89949 2.10802 +2.06519 3.26051 2.47436 +2.54642 2.28757 1.81061 +1.91216 2.52722 2.37072 +1.00166 3.15596 2.99873 +1.12643 2.44998 2.75813 +1.52439 2.12918 1.85781 +1.01646 2.07925 2.10825 +0.344842 2.07115 2.89611 +0.511204 1.83436 2.19745 +0.736163 2.26094 1.4298 +0.34537 2.07152 1.49879 +0.108702 1.44301 2.10774 +0.034051 1.76883 1.42941 +-0.0555178 2.64372 1.2094 +-0.45802 2.25237 1.11969 +-0.136133 1.41281 1.23539 +-0.678049 1.79208 0.868843 +-1.07926 2.61038 1.36002 +-1.41963 1.89834 0.971979 +-0.672026 1.354 0.506539 +-1.41031 1.22067 0.411524 +-1.92646 1.66935 1.48438 +-1.05316 0.711603 -0.210338 +-0.571926 -0.261335 -0.874081 +-0.400567 -0.900322 -0.507746 +-0.00520413 -1.0707 0.113969 +0.778032 -0.784465 -1.08886 +1.05833 -0.966152 -0.410409 +0.382565 -0.672659 0.626872 +1.1683 -0.595421 0.239464 +2.11625 -0.453389 -0.597175 +1.94988 -0.216593 0.101481 +1.04352 0.11056 0.480072 +1.54878 0.355452 0.390874 +2.57252 0.388793 0.240254 +1.95128 0.746801 0.480583 +1.14789 0.927649 0.101481 +1.45921 1.23034 0.170868 +2.17131 1.2071 0.731432 +1.62939 1.58636 0.364889 +1.38456 1.55616 -0.507466 +1.60459 2.01646 -0.256618 +1.62473 1.92519 0.645116 +1.59856 2.45453 0.105686 +2.11142 2.24544 -0.769017 +2.10211 2.92311 -0.208562 +1.36768 2.78362 0.507687 +1.74495 3.43218 0.413301 +1.49846 4.06987 1.48631 +1.1107 3.67183 0.973404 +0.957671 2.93854 0.869764 +1.44616 2.17973 0.956047 +1.12903 2.29956 1.2361 +0.449736 2.88861 1.1202 +1.9344 1.97426 1.49574 +2.16529 1.64517 1.09374 +2.90357 1.7785 1.18875 +2.91289 1.10083 0.628296 +3.41972 1.32982 0.115897 +2.95902 0.366033 -0.409339 +2.88437 0.691855 -1.08767 +1.95041 -0.216224 -1.29583 +2.3923 1.1754 -1.39739 +1.54952 0.355974 -1.58522 +0.491605 -0.156789 -1.39846 +1.14842 0.928019 -1.29583 +0.366832 0.549191 -1.15785 +-0.418901 0.471953 -0.770442 +0.476802 0.919923 -0.507977 +-0.031132 0.869992 -0.257539 +-0.441144 1.02491 0.104538 +0.364231 0.699617 0.364176 +0.0471035 0.819441 0.644228 +-0.131474 1.07398 0.955159 +0.125578 0.21555 1.09259 +-0.105304 0.544637 1.49459 +-0.111327 0.982712 1.85689 +-0.608846 0.076062 1.80884 +-0.618163 0.753727 2.36929 +-0.277795 1.46577 2.75733 +-1.35974 0.859992 2.47243 +-0.899037 1.82378 2.99766 +-0.0562639 2.6432 3.1855 +-1.39111 2.30732 2.68795 +-0.457151 3.2154 2.89611 +0.715229 3.78364 2.68913 +-0.622986 3.45256 2.19745 +0.434933 3.96532 2.01068 +0.324963 3.59459 1.36081 +-0.456624 3.21576 1.49879 +-1.46576 2.63314 2.00961 +-1.90166 1.23926 2.10589 +-0.25169 -0.433009 1.18697 +0.53559 0.0606295 0.730511 +0.757098 0.738236 0.170472 +0.982056 1.16481 -0.597175 +1.77106 1.5334 -1.15706 +-0.561015 -0.673257 -0.516099 +-0.97055 -0.110718 -0.522061 +-1.90141 1.221 2.09078 +-1.35435 0.467997 2.14823 +-1.32934 0.452132 2.1346 +-1.0988 0.14376 1.8749 +-1.74516 1.06687 0.748005 +-1.70695 0.944633 0.59665 +-1.3247 0.440138 -0.0497789 +-1.28047 0.320835 -0.153469 +-0.446838 -0.882839 -0.466885 +-0.396754 -0.907847 -0.229717 +-0.653543 -0.51838 1.12035 +-0.620442 -0.621786 0.997254 +-0.403829 -0.92008 0.46599 +-1.90392 1.27273 1.13283 +-1.92107 1.27736 1.16019 +-1.04378 -0.00248243 1.75286 +-0.980005 -0.0806305 -0.505709 +-0.405416 -0.901236 0.496048 +4 0 229 212 211 +5 1 2 215 214 213 +5 3 216 215 2 4 +4 4 2 5 6 +4 4 6 8 7 +4 8 6 9 10 +4 8 10 12 11 +4 12 10 13 14 +4 12 14 16 15 +4 16 14 17 18 +4 16 18 20 19 +4 20 18 21 22 +4 20 22 24 23 +4 24 22 25 26 +4 24 26 28 27 +4 28 26 29 30 +4 28 30 32 31 +4 32 30 33 34 +4 32 34 36 35 +4 36 34 37 38 +4 36 38 40 39 +4 40 38 41 42 +4 40 42 44 43 +4 44 42 45 46 +4 44 46 48 47 +4 48 46 49 50 +4 48 50 52 51 +4 52 50 53 54 +5 52 54 217 218 219 +6 52 219 220 229 0 51 +5 55 226 217 54 56 +4 56 54 53 57 +4 53 58 59 57 +4 57 59 11 60 +4 59 7 8 11 +4 7 59 58 61 +4 58 49 62 61 +4 61 62 63 3 +4 62 45 64 63 +6 63 64 65 230 224 223 +4 64 41 66 65 +5 65 66 67 221 222 +4 66 37 68 67 +4 67 68 70 69 +4 68 33 71 70 +4 70 71 73 72 +4 71 29 74 73 +4 73 74 76 75 +4 74 25 77 76 +4 76 77 79 78 +4 77 21 80 79 +4 79 80 82 81 +4 80 17 83 82 +4 82 83 85 84 +4 83 13 86 85 +4 85 86 88 87 +4 86 9 89 88 +4 88 89 91 90 +4 89 5 92 91 +4 91 92 94 93 +4 92 1 55 94 +4 94 55 56 95 +4 95 56 57 60 +4 60 15 96 95 +4 95 96 93 94 +4 93 96 19 97 +4 19 96 15 16 +4 97 19 20 23 +4 23 98 90 97 +4 97 90 91 93 +4 90 98 87 88 +4 87 98 27 99 +4 27 98 23 24 +4 99 27 28 31 +4 31 100 84 99 +4 99 84 85 87 +4 84 100 81 82 +4 81 100 35 101 +4 35 100 31 32 +4 101 35 36 39 +4 39 102 78 101 +4 101 78 79 81 +4 78 102 75 76 +4 75 102 43 103 +4 43 102 39 40 +4 103 43 44 47 +4 47 104 72 103 +4 103 72 73 75 +4 72 104 69 70 +4 69 104 51 0 +4 51 104 47 48 +5 69 0 211 221 67 +4 15 60 11 12 +5 55 1 213 227 226 +4 1 92 5 2 +4 5 89 9 6 +4 9 86 13 10 +4 13 83 17 14 +4 17 80 21 18 +4 21 77 25 22 +4 25 74 29 26 +4 29 71 33 30 +4 33 68 37 34 +4 37 66 41 38 +4 65 222 225 230 +4 41 64 45 42 +5 63 223 228 216 3 +4 45 62 49 46 +4 61 3 4 7 +4 49 58 53 50 +4 106 105 108 107 +4 108 105 109 110 +4 108 110 112 111 +4 112 110 113 114 +4 112 114 116 115 +4 116 114 117 118 +4 116 118 120 119 +4 120 118 121 122 +4 120 122 124 123 +4 124 122 125 126 +4 124 126 128 127 +4 128 126 129 130 +4 128 130 132 131 +4 132 130 133 134 +7 132 134 218 217 226 227 135 +5 134 136 220 219 218 +5 137 138 221 211 212 +5 139 225 222 221 138 +4 139 138 140 141 +4 139 141 143 142 +4 143 141 144 145 +4 143 145 147 146 +4 147 145 148 149 +4 147 149 151 150 +4 151 149 152 153 +4 151 153 155 154 +4 155 153 156 157 +4 155 157 159 158 +4 159 157 160 161 +4 159 161 109 105 +4 159 105 106 158 +4 109 161 163 162 +4 163 161 160 164 +4 160 165 166 164 +4 164 166 123 167 +4 166 119 120 123 +4 119 166 165 168 +4 165 156 169 168 +4 168 169 170 115 +4 169 152 171 170 +4 170 171 172 111 +4 171 148 173 172 +4 172 173 174 107 +4 173 144 175 174 +4 174 175 177 176 +4 175 140 178 177 +4 177 178 180 179 +4 178 137 181 180 +4 180 181 183 182 +4 181 136 184 183 +4 183 184 186 185 +4 184 133 187 186 +4 186 187 189 188 +4 187 129 190 189 +4 189 190 192 191 +4 190 125 193 192 +4 192 193 195 194 +4 193 121 196 195 +4 195 196 198 197 +4 196 117 199 198 +4 198 199 201 200 +4 199 113 162 201 +4 201 162 163 202 +4 202 163 164 167 +4 167 127 203 202 +4 202 203 200 201 +4 200 203 131 204 +4 131 203 127 128 +4 204 131 132 135 +4 135 205 197 204 +4 204 197 198 200 +4 197 205 194 195 +4 194 205 213 214 +5 206 191 228 223 224 +4 191 206 188 189 +4 188 206 142 207 +6 142 206 224 230 225 139 +4 207 142 143 146 +4 146 208 185 207 +4 207 185 186 188 +4 185 208 182 183 +4 182 208 150 209 +4 150 208 146 147 +4 209 150 151 154 +4 154 210 179 209 +4 209 179 180 182 +4 179 210 176 177 +4 176 210 158 106 +4 158 210 154 155 +4 176 106 107 174 +7 194 214 215 216 228 191 192 +4 205 135 227 213 +4 127 167 123 124 +4 162 113 110 109 +4 113 199 117 114 +4 117 196 121 118 +4 121 193 125 122 +4 125 190 129 126 +4 129 187 133 130 +4 133 184 136 134 +6 136 181 137 212 229 220 +4 137 178 140 138 +4 140 175 144 141 +4 144 173 148 145 +4 172 107 108 111 +4 148 171 152 149 +4 170 111 112 115 +4 152 169 156 153 +4 168 115 116 119 +4 156 165 160 157 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/double-torus.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/double-torus.off new file mode 100644 index 00000000000..05e7817f6bb --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/double-torus.off @@ -0,0 +1,32 @@ +OFF +14 16 0 +-0.357143 4.44089e-16 1.03098 +-0.25 -0.433013 0.288675 +-0.5 -0.866025 0 +-0.714286 4.44089e-16 1.48461 +-0.25 0.433013 0.288675 +-0.5 0.866025 0 +-0.821429 -0.433013 0.206197 +-0.821429 0.433013 0.206197 +-0.928571 4.44089e-16 0.948504 +0.5 0 0.288675 +1 0 0 +-0.25 -0.433013 -0.288675 +0.5 0 -0.288675 +-0.25 0.433013 -0.288675 +4 0 1 2 3 +4 4 0 3 5 +4 6 7 4 1 +4 8 6 1 0 +4 7 8 0 4 +4 2 5 7 6 +4 3 2 6 8 +4 5 3 8 7 +4 1 9 10 2 +4 9 4 5 10 +4 11 12 9 1 +4 13 11 1 4 +4 12 13 4 9 +4 2 10 12 11 +4 5 2 11 13 +4 10 5 13 12 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/elephant.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/elephant.off new file mode 100644 index 00000000000..cf7cc2b68ca --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/elephant.off @@ -0,0 +1,8337 @@ +OFF +2775 5558 0 + +0.262933 0.102269 0.138247 +0.0843142 0.0418575 -0.0419302 +0.0676609 -0.0308717 0.133371 +0.202895 0.468475 0.0802072 +0.113075 -0.465378 -0.0546734 +0.225577 -0.277149 -0.193776 +-0.146525 -0.22403 -0.169286 +-0.0249865 -0.129931 -0.13238 +-0.160965 -0.480027 -0.0707824 +0.0794063 -0.415277 -0.0839096 +0.0469116 -0.050008 0.252355 +-0.0998372 -0.193745 -0.16268 +-0.111131 -0.104825 -0.14166 +-0.061459 -0.0977343 -0.133353 +-0.247783 -0.131539 0.0722694 +-0.145972 -0.486627 -0.0633275 +0.0916759 0.0333604 -0.133002 +-0.184954 -0.325468 -0.133853 +0.0847778 -0.432659 -0.0978527 +-0.210776 -0.299151 0.0751516 +-0.151539 -0.388715 0.01282 +-0.154564 -0.438244 -0.0249412 +-0.123411 -0.0182656 0.0135824 +0.00773278 -0.053391 -0.0428874 +-0.0774524 -0.292395 -0.106335 +0.0201594 -0.263586 0.119859 +-0.105646 -0.0365155 -0.0770751 +-0.113391 -0.41896 -0.0906771 +-0.128213 -0.46259 -0.0994907 +-0.160526 -0.468057 -0.0393445 +0.197609 -0.127492 -0.0574767 +0.0757306 -0.449539 -0.0614557 +0.147148 -0.412461 -0.0801639 +0.103782 -0.333007 0.0288926 +0.108917 -0.401981 -0.00841926 +0.11392 -0.408931 -0.0973654 +0.129733 -0.31331 -0.0672325 +0.0904388 -0.356531 -0.0803906 +0.0359798 -0.255445 -0.113562 +-0.22312 -0.107007 -0.0611904 +-0.163408 -0.433458 -0.0704785 +-0.0915185 -0.473885 -0.0165533 +-0.141417 -0.474418 -0.0834065 +-0.0944539 -0.479454 -0.0663683 +-0.085985 -0.101282 0.158093 +-0.0225438 -0.0889567 -0.0848587 +0.092707 -0.109496 -0.114561 +-0.159213 -0.159272 -0.138793 +-0.24541 -0.230248 -0.110578 +0.183744 -0.231931 0.0176086 +0.294273 -0.0955008 0.116328 +-0.16477 -0.385872 -0.0413331 +-0.185303 -0.313456 -0.00374653 +-0.297084 -0.262835 -0.00415653 +0.167756 -0.128776 0.197921 +-0.0273811 0.0608812 -0.0989637 +0.208303 0.00452459 -0.0746544 +-0.150831 -0.448909 -0.0901866 +-0.0720206 -0.147118 -0.154796 +-0.0197986 -0.210658 -0.154154 +-0.130593 -0.498558 -0.021161 +0.129662 -0.373473 -0.0794411 +-0.120692 -0.481168 -0.0685411 +-0.108692 -0.494274 -0.0429275 +-0.0970902 -0.252938 -0.14843 +-0.0098054 -0.335319 -0.0147292 +0.0769246 -0.410346 -0.0391239 +-0.132409 -0.464154 -0.0197707 +-0.102806 -0.4217 0.00855496 +-0.0760332 -0.34128 0.100617 +-0.104435 -0.377391 0.0553722 +-0.14788 -0.33188 0.0922673 +-0.151409 -0.218926 0.165812 +-0.111518 -0.286925 0.148566 +-0.0458796 -0.210094 0.18627 +0.0439919 -0.147905 0.137964 +-0.0358575 -0.361749 0.0457868 +0.0284346 -0.311464 0.0537885 +0.0409609 -0.0869988 -0.085353 +0.118462 -0.0465078 -0.0483438 +-0.141108 -0.422593 -0.0846889 +-0.129145 -0.379198 -0.0712284 +-0.149426 -0.329507 -0.0473837 +-0.212723 -0.300322 -0.0706413 +-0.156151 -0.403775 -0.0651516 +-0.077704 -0.400019 -0.0437424 +-0.0783601 -0.342543 -0.0687412 +-0.0202922 -0.309739 -0.0758353 +0.0501325 -0.290557 -0.0430839 +0.0954448 -0.256567 0.0733017 +0.144565 -0.158299 0.0913557 +0.0562207 -0.179498 -0.140905 +0.16863 -0.175124 -0.176771 +0.121523 -0.241503 -0.138152 +0.196749 0.136407 0.00365942 +0.14057 0.277481 0.154966 +0.156168 -0.385879 -0.0324162 +-0.146564 -0.288069 -0.168907 +-0.212533 -0.256019 -0.170893 +0.0775241 -0.353084 -0.0221894 +-0.161054 -0.48311 -0.0516067 +-0.151386 -0.488726 -0.0297486 +-0.167299 -0.464731 -0.058517 +-0.167494 -0.44542 -0.0440266 +-0.166175 -0.416312 -0.0405929 +-0.155665 -0.409399 -0.0112037 +-0.130777 -0.428881 -0.00549876 +-0.162855 -0.460869 -0.0783452 +-0.0949104 -0.0628065 -0.118829 +-0.171364 -0.0681205 -0.104606 +-0.189411 -0.0391257 -0.0301772 +-0.201329 -0.0450332 0.0672375 +-0.0621659 -0.0595357 -0.0819357 +-0.0724451 -0.0386843 -0.0212262 +-0.0317016 -0.00827391 0.0812953 +0.125617 -0.445138 -0.086335 +0.16914 -0.45638 -0.0514974 +-0.188699 -0.102786 0.151505 +-0.127982 -0.406882 0.0143939 +-0.130706 -0.384 0.0373578 +-0.17253 -0.34721 0.0442322 +-0.136499 -0.357829 0.0655808 +-0.101729 -0.398953 0.0314689 +-0.06477 -0.393705 0.00175031 +-0.0683606 -0.382507 0.0422398 +-0.0619729 -0.361557 0.0725343 +-0.0129886 -0.329893 0.099078 +-0.0485077 -0.306718 0.14972 +-0.0586671 -0.359537 -0.0297503 +-0.105132 -0.354471 0.0834642 +-0.111953 -0.324339 0.110194 +-0.146952 -0.298663 0.122985 +-0.147935 -0.259899 0.146585 +-0.224685 -0.230598 0.12386 +-0.194785 -0.274899 0.125615 +-0.1144 -0.250007 0.185149 +-0.10665 -0.185071 0.204627 +-0.155805 -0.154327 0.174517 +-0.215755 -0.165279 0.142947 +-0.0743299 -0.277016 0.17853 +-0.0218198 -0.257755 0.16445 +0.000800113 -0.199671 0.138749 +-0.0254547 -0.133829 0.140633 +0.0635315 -0.20852 0.111271 +-0.0256804 -0.0569419 0.140514 +-0.0948894 -0.0414189 0.110395 +-0.0705488 -0.0374163 0.0415111 +-0.00760713 -0.0195458 0.0164934 +0.0499878 0.0289775 0.0673286 +0.140466 0.0718009 0.144428 +-0.00188983 0.0792593 -0.003093 +0.0559872 -0.0140882 -0.011506 +-0.227407 -0.0888195 0.0117762 +-0.273528 -0.167121 -0.0102922 +-0.0402782 -0.263586 -0.140793 +-0.137564 -0.296782 -0.109847 +-0.166109 -0.381665 -0.0120175 +-0.16983 -0.360755 0.0137933 +-0.16456 -0.354211 -0.0308766 +-0.185156 -0.334386 0.0190529 +-0.207978 -0.298552 0.0310885 +-0.252507 -0.243462 0.0511336 +-0.223388 -0.268692 -0.019703 +-0.193938 -0.322649 0.048456 +-0.175095 -0.332532 0.0736524 +-0.176111 -0.310734 0.103586 +-0.147337 -0.494175 -0.0467278 +-0.129359 -0.490613 -0.0537016 +-0.148829 -0.364106 -0.0543963 +-0.120087 -0.343197 -0.0662243 +-0.130345 -0.305692 -0.0722136 +-0.171529 -0.299424 -0.0833938 +-0.181343 -0.292949 -0.0416997 +0.207831 -0.217496 -0.0966998 +0.180453 0.174523 0.151623 +0.0997558 -0.44202 -0.0211251 +0.141829 -0.427452 -0.0246256 +0.231902 -0.0518172 0.0262484 +0.222165 -0.00765217 0.131632 +0.257605 0.0468554 0.0496674 +0.134457 -0.362329 0.00455646 +0.162364 -0.298449 0.0119315 +0.167632 -0.334853 -0.0258239 +0.166781 -0.258058 -0.0451734 +0.196618 -0.203737 -0.0367216 +0.204966 -0.148702 0.029823 +0.188775 -0.0899398 0.0842549 +0.118735 -0.0897053 0.120666 +0.108518 -0.0623755 0.19827 +0.0943505 -0.134977 0.262277 +0.0987744 0.0186293 0.19077 +0.164162 -0.016078 0.17849 +0.217401 -0.0732307 0.174029 +0.244384 -0.159022 0.158735 +0.0938974 -0.414078 -0.0986619 +0.0882094 -0.386204 -0.0874415 +0.110237 -0.433985 -0.106491 +0.0752909 -0.377302 -0.0545033 +0.136893 -0.424401 -0.103861 +0.101623 -0.446793 -0.0879738 +0.0803589 -0.447974 -0.0828166 +0.0955794 -0.458697 -0.0690652 +0.0852254 -0.472952 -0.043714 +0.0423481 -0.131534 -0.117698 +0.0102534 -0.163639 -0.135844 +-0.0294235 -0.16777 -0.154302 +-0.0581903 -0.19678 -0.162941 +-0.0495263 -0.23206 -0.157295 +0.0213258 -0.204668 -0.142847 +0.0591534 -0.221375 -0.128414 +0.094939 -0.204956 -0.158559 +0.102368 -0.149902 -0.152017 +0.161838 -0.127189 -0.119413 +0.0883157 -0.255475 -0.0965547 +0.00337956 -0.243572 -0.138992 +-0.00441584 -0.28038 -0.109802 +0.139454 -0.244447 -0.0884262 +0.17799 -0.253819 -0.13106 +0.239512 -0.249475 -0.139746 +0.239769 -0.199663 -0.201225 +0.139899 -0.220537 -0.184787 +0.188104 -0.214287 -0.208834 +0.241446 -0.186766 -0.139849 +0.209446 -0.161297 -0.101029 +-0.199048 -0.317265 -0.100601 +-0.293252 -0.31357 -0.122798 +-0.243299 -0.355691 -0.130502 +-0.247594 -0.319033 -0.0988683 +-0.291668 -0.287409 -0.0637038 +-0.248832 -0.272185 -0.0865389 +-0.259174 -0.220646 -0.0469428 +-0.282126 -0.263379 -0.124759 +-0.269731 -0.294935 -0.18724 +-0.247297 -0.165961 -0.0866554 +0.0601914 -0.0464014 -0.0549033 +-0.211085 -0.18579 -0.128927 +-0.200721 -0.132547 -0.108259 +-0.0634953 -0.15489 0.179525 +0.153912 -0.0887253 -0.0733484 +0.185145 -0.0471144 -0.0260532 +0.211443 0.0144377 0.0032337 +0.139575 0.0029693 0.000737671 +0.166751 0.0710484 -0.0323169 +0.107842 0.107181 0.0410238 +0.241648 0.0800111 -0.0150955 +-0.140262 -0.4992 -0.033581 +-0.123763 -0.497978 -0.0364981 +-0.108133 -0.495253 -0.0202341 +-0.1219 -0.481038 -0.0158085 +-0.110456 -0.461331 -0.014079 +-0.087635 -0.441699 -0.0445804 +-0.0916102 -0.451765 -0.0239283 +-0.0811529 -0.421697 -0.020421 +-0.0723115 -0.470105 -0.0423155 +-0.102577 -0.44033 -0.0062072 +-0.139118 -0.480546 -0.0199347 +-0.149266 -0.466768 -0.0254061 +0.222317 -0.0925366 -0.0161067 +-0.0417433 -0.361447 0.00632817 +-0.00965295 -0.347119 0.0218202 +0.0216724 -0.318231 0.010836 +-0.00474667 -0.341486 0.0613973 +0.0698488 -0.285166 0.0205835 +-0.108371 -0.29389 -0.0941984 +-0.11094 -0.279255 -0.127432 +-0.0852691 -0.31423 -0.083395 +-0.0516331 -0.309713 -0.0908278 +-0.0463843 -0.329032 -0.0615785 +-0.13427 -0.295211 -0.140976 +-0.16029 -0.312528 -0.151535 +-0.208046 -0.313472 -0.188061 +-0.177638 -0.29982 -0.178676 +-0.173332 -0.259819 -0.179118 +-0.186949 -0.225139 -0.161631 +-0.121077 -0.271737 -0.158365 +-0.222098 -0.229029 -0.143015 +-0.254895 -0.254361 -0.158387 +-0.119307 -0.241249 -0.168619 +-0.0940058 -0.224454 -0.161034 +-0.119452 -0.213541 -0.164903 +-0.133444 -0.181194 -0.153714 +-0.123212 -0.142937 -0.146434 +-0.154852 -0.114002 -0.127562 +-0.16919 -0.193253 -0.151916 +-0.202578 -0.281459 -0.18846 +-0.238459 -0.276537 -0.185897 +-0.240282 -0.308392 -0.197824 +-0.31592 -0.411023 -0.222975 +-0.28556 -0.354091 -0.210885 +-0.235315 -0.349789 -0.176342 +-0.247249 -0.413591 -0.205119 +-0.313616 -0.39085 -0.145549 +-0.265064 -0.38952 -0.162643 +-0.137308 -0.0765217 -0.126585 +-0.138269 -0.043252 -0.101811 +-0.149787 -0.024537 -0.0569204 +-0.190238 -0.325155 -0.164883 +-0.214126 -0.342005 -0.145019 +-0.11169 -0.0249744 -0.0351987 +-0.154494 -0.0206052 -0.0150451 +-0.170024 -0.0235376 0.033341 +-0.149964 -0.0212297 0.0915499 +-0.146292 -0.0570396 0.143171 +-0.204533 -0.050976 0.0222898 +-0.222839 -0.0748301 0.0497298 +-0.218112 -0.0836084 0.106186 +-0.241131 -0.10804 0.0423425 +-0.253857 -0.126023 0.000914005 +-0.268045 -0.155579 0.0359862 +-0.254096 -0.191499 0.0837602 +-0.284127 -0.206805 0.0257642 +-0.255388 -0.139415 -0.0455141 +-0.266486 -0.179542 -0.0496151 +-0.255448 -0.200689 -0.0776309 +-0.238672 -0.192995 -0.107883 +-0.225097 -0.163824 -0.109937 +-0.22995 -0.135947 -0.0896828 +-0.209528 -0.114818 -0.0862766 +-0.197715 -0.0771741 -0.074156 +-0.18152 -0.102481 -0.104911 +-0.212552 -0.0754645 -0.0336012 +-0.179069 -0.0426745 -0.0757348 +-0.191113 -0.0400122 0.118805 +0.0761558 -0.344791 -0.0536197 +0.0734921 -0.316433 -0.0291825 +0.0865869 -0.298841 -0.0691012 +0.0805876 -0.328744 0.0029047 +0.0952029 -0.361348 0.00820626 +0.11906 -0.273469 -0.0673767 +0.0841053 -0.310717 0.0264162 +0.125408 -0.292597 0.041066 +0.0878905 -0.285295 0.052224 +0.0491288 -0.272854 0.0806291 +0.143869 -0.242882 0.0528378 +0.117789 -0.207199 0.0870858 +0.169353 -0.193132 0.0552639 +0.0969256 -0.166289 0.115505 +0.054006 -0.288058 0.0505697 +0.0199581 -0.301066 0.0971587 +-0.00766116 -0.296894 0.132807 +0.0766599 -0.302889 0.00259846 +0.0459981 -0.299327 0.00649094 +0.0275534 -0.307808 -0.0222832 +0.0149271 -0.300169 -0.0594622 +0.0407712 -0.276916 -0.0798141 +0.0598138 -0.291021 -0.0166231 +0.105499 -0.310063 0.042044 +0.129965 -0.318676 0.0271739 +-0.0843085 -0.494264 -0.0321529 +-0.0752323 -0.238787 0.196776 +-0.295928 -0.43397 -0.176216 +0.0851801 -0.382062 -0.0130588 +0.0187394 -0.0952484 0.145146 +0.0700063 -0.10227 0.135872 +0.0221841 -0.0461712 0.144279 +0.0234739 0.0145751 0.123876 +-0.00955997 -0.0145334 0.135796 +-0.0455413 -0.0274983 0.116817 +-0.0630042 -0.0646849 0.123712 +-0.0996182 -0.0685448 0.139479 +-0.129134 -0.0937854 0.159793 +-0.112763 -0.133107 0.183753 +-0.0586283 -0.0384282 0.0801443 +-0.0976008 -0.0306336 0.0712047 +-0.187313 -0.236737 0.146886 +-0.186919 -0.194456 0.158247 +-0.276732 -0.200888 -0.0224537 +-0.291326 -0.23573 -0.0313163 +-0.262172 -0.26119 -0.0228289 +-0.244304 -0.258186 0.0138536 +-0.238049 -0.253808 -0.053252 +-0.278468 -0.245353 0.0237178 +-0.250374 -0.233381 -0.0762153 +-0.317786 -0.266287 -0.0397057 +-0.29694 -0.227134 0.00135872 +-0.28761 -0.282597 -0.0302299 +-0.0768305 -0.203891 0.202176 +-0.107975 -0.220055 0.202264 +-0.134773 -0.20066 0.190676 +-0.13214 -0.167949 0.192848 +-0.157713 -0.187173 0.17141 +-0.0792541 -0.17391 0.197354 +-0.103166 -0.157466 0.196315 +-0.0861693 -0.139966 0.183699 +-0.0642112 -0.126048 0.16286 +-0.0525585 -0.0978366 0.139755 +0.173523 -0.0454835 0.124705 +0.124762 -0.0100876 0.132612 +0.0801162 0.0231847 0.117816 +0.0903158 0.0691509 0.0824377 +0.111706 0.138719 0.113497 +0.109897 0.0476799 0.0291314 +0.0568194 0.0789592 0.018431 +0.166721 0.186565 0.0672199 +0.252858 0.160254 0.0700128 +0.103948 0.0891733 -0.0142249 +0.151331 0.103958 0.00831307 +0.156258 0.148984 0.0332697 +0.195526 0.176469 0.0301312 +0.246249 0.159404 0.0147221 +0.272985 0.107792 0.0403664 +0.220496 0.208803 0.0718273 +0.172006 0.242405 0.105809 +0.284857 0.213191 0.163319 +0.220004 0.262975 0.168971 +0.243752 0.187223 0.124992 +0.303317 0.156118 0.132187 +0.124557 0.160014 0.070217 +0.145476 0.178627 0.113721 +0.143822 0.145597 0.146983 +0.199699 0.112576 0.148784 +0.221259 0.0552492 0.134196 +0.124553 0.109697 0.139987 +0.100062 0.0751807 0.125633 +0.107686 0.0453443 0.15701 +0.152453 0.0251604 0.154394 +0.160741 0.1045 0.158385 +0.183054 0.0708926 0.1447 +0.188656 0.0314673 0.13741 +0.286002 0.0789154 0.0896861 +0.044874 0.0868553 -0.0397086 +0.0292084 0.0351428 -0.0773123 +-0.00652383 0.0868322 -0.0563984 +0.153395 -0.330946 0.00521793 +0.165687 0.227811 0.159326 +0.176713 -0.253714 -0.180764 +0.276141 0.126578 0.0974557 +-0.0329659 -0.0648403 -0.0508016 +-0.022748 -0.0460692 -0.0136176 +-0.0397109 -0.0394184 0.0195973 +0.00993129 -0.0278328 -0.0155697 +0.0270531 -0.00832198 0.0106523 +0.0103826 0.00500549 0.0538795 +0.0666135 0.0125544 0.0261568 +0.103369 0.00889595 0.155654 +0.11659 -0.0298082 0.170544 +0.153029 -0.0696813 0.168481 +0.113461 -0.0186162 0.216944 +0.10035 -0.0580327 0.251516 +0.150235 -0.084971 0.233939 +0.0675669 -0.0946043 0.253879 +0.0719166 -0.0391569 0.214813 +0.10687 -0.103697 0.22877 +0.136543 -0.144876 0.235107 +0.147147 -0.0351617 0.149371 +0.1197 -0.0491892 0.122959 +0.148505 -0.0696344 0.112799 +0.152678 -0.114026 0.101195 +0.181641 -0.136376 0.0700095 +0.177794 -0.0667748 0.102185 +0.219377 -0.0856118 0.124697 +0.231869 -0.0572983 0.0801841 +0.250938 -0.00881912 0.0578761 +0.198815 -0.0628459 0.124187 +0.177363 -0.0676828 0.147605 +0.177944 -0.101552 0.169756 +0.213844 -0.114113 0.199683 +0.250347 -0.109904 0.165803 +0.259893 -0.130195 0.122038 +0.180633 -0.0723966 0.203599 +0.114076 -0.0955963 0.272717 +0.201886 -0.0333539 0.161782 +0.240288 -0.0485439 0.141813 +0.261312 -0.0227503 0.104643 +0.273982 -0.0593402 0.119899 +0.280362 -0.074792 0.0701015 +0.238595 0.0177583 0.0951404 +0.14643 -0.0478943 0.212489 +-0.227331 -0.265687 0.0979085 +-0.244646 -0.230401 0.0887962 +-0.293688 -0.268968 -0.164669 +-0.297979 -0.308788 -0.162348 +-0.312868 -0.346598 -0.144794 +-0.344082 -0.367401 -0.192127 +-0.317302 -0.337357 -0.184462 +-0.280828 -0.350074 -0.123607 +0.105148 0.105807 0.112878 +0.112708 0.122082 0.0774818 +0.133565 0.128779 0.0503619 +-0.153371 -0.370618 0.0324641 +0.254239 -0.0926281 0.0998171 +-0.0128437 0.0136567 0.10826 +0.0175667 0.0217155 0.0871281 +0.0477136 0.0340255 0.104217 +0.0750182 0.0489044 0.100742 +0.0776037 0.0433948 0.0700673 +0.0973389 0.0603657 0.0539823 +0.0861821 0.0686274 0.0252903 +0.0735784 0.0589072 -0.0094551 +0.0829016 0.102631 0.0164944 +0.0811061 0.0911963 0.0569078 +0.0940457 0.0476479 0.121838 +0.105428 0.0231317 0.131003 +0.0916425 -0.00738665 0.126455 +0.0604145 5.34629e-005 0.128347 +0.10359 0.0595398 0.00049955 +0.144344 0.0457444 0.00327488 +0.122523 0.0419513 -0.0300499 +0.11811 0.0162342 -0.0830375 +0.170091 0.0155571 -0.145681 +0.138389 0.0626357 -0.0743287 +0.165069 0.0235027 -0.0532363 +0.177768 0.0409007 -0.100742 +0.136707 0.0380317 -0.122381 +0.124141 0.00775387 -0.157586 +0.154959 -0.000810753 -0.105169 +0.105591 0.0562623 -0.100272 +0.0594242 0.0548004 -0.106957 +0.201162 -0.0168583 -0.120783 +0.0976411 0.0972697 0.0801317 +0.0943337 0.0848541 0.102457 +0.0890479 0.0650811 0.109825 +0.0389773 0.0745551 -0.0779593 +0.0138551 0.0593589 -0.108474 +0.0773146 0.0765993 -0.0629692 +0.118409 0.00125651 -0.11931 +0.14578 -0.0101392 -0.137264 +0.178622 -0.0192175 -0.148664 +0.15461 0.0388676 -0.0266866 +0.193622 0.0322602 -0.0272748 +0.1942 0.050466 -0.0642106 +0.173634 0.0303747 -0.00069076 +0.179101 -0.0110744 -0.00523936 +0.230507 0.0422098 -0.0173425 +0.202418 0.070871 -0.0135348 +0.22302 0.0184239 -0.0441485 +0.215157 -0.0248187 0.00288885 +0.233855 -0.00344678 0.0259658 +0.238719 0.033163 0.0205233 +0.25481 0.0672767 0.0179763 +0.222129 -0.0581209 -0.00731524 +0.227145 -0.0819987 0.0145053 +0.219253 -0.118982 0.0109807 +0.211654 -0.158762 -0.0192499 +0.210611 -0.101269 0.0490966 +0.200451 -0.190104 0.0116714 +0.203938 -0.0712158 -0.0282028 +0.173774 -0.0735362 -0.0475631 +0.2027 -0.10102 -0.0400541 +0.212795 -0.129107 -0.0298945 +0.206091 -0.151217 -0.0455168 +0.202467 -0.150775 -0.0745887 +0.209378 -0.187531 -0.0743719 +0.181149 -0.126003 -0.0892617 +0.205972 -0.177843 -0.0383337 +0.188301 -0.142819 -0.114464 +0.208779 -0.164491 -0.140437 +0.171227 -0.151151 -0.147387 +0.136617 -0.138704 -0.143839 +0.131975 -0.166643 -0.169617 +0.128263 -0.113939 -0.11894 +0.116875 -0.0858965 -0.091059 +0.0786764 -0.0829677 -0.090746 +0.187859 -0.214057 -0.0686071 +0.175679 -0.237132 -0.0957975 +0.178163 -0.10588 -0.0665832 +0.269129 0.0763722 0.0451229 +0.27889 0.058723 0.0679827 +0.267652 0.0453551 0.105512 +0.2613 0.0363273 0.0775663 +0.250278 0.0199214 0.0566543 +0.250269 0.00638094 0.0769677 +0.262967 -0.0160504 0.0796628 +0.285344 -0.0433845 0.0872574 +0.24971 -0.0386027 0.0640826 +0.229012 -0.0528564 0.0533874 +0.210073 -0.0746435 0.0657137 +0.221889 -0.0775407 0.0410909 +0.302572 -0.0710887 0.0949218 +0.236871 -0.0290995 0.0413907 +0.21774 0.0486965 -0.0445342 +0.224846 0.0339602 -0.0740774 +0.244042 0.0044793 -0.10874 +0.254336 0.102378 0.0100739 +0.220262 0.108437 -0.00385435 +0.184431 0.103867 -0.0063665 +0.227766 0.138272 0.00117268 +0.21603 0.168687 0.00560537 +0.214962 0.252952 4.36931e-005 +0.24674 0.211475 0.00674743 +0.208103 0.206716 0.00898043 +0.198252 0.239152 0.0425261 +0.241235 0.183275 -0.00372162 +0.24846 0.187657 0.0253371 +0.236173 0.217937 0.0406376 +0.208251 0.202717 0.0430183 +0.190765 0.204953 0.0676283 +0.199822 0.228771 0.0907818 +0.212055 0.262964 0.121847 +0.167888 0.20936 0.0941323 +0.230768 0.216285 0.106419 +0.226441 0.220307 0.1523 +0.160904 0.217518 0.126833 +0.151535 0.251202 0.133586 +0.158786 0.306935 0.0984538 +0.193903 0.396086 0.195106 +0.119767 0.364922 0.154966 +0.158434 0.284691 0.125614 +0.188265 0.327264 0.175224 +0.139712 0.323472 0.144742 +0.247398 0.226772 0.208026 +0.162628 0.357991 0.158091 +0.132463 0.334186 0.215838 +0.184892 0.418747 0.128073 +0.148158 0.405567 0.1589 +0.116952 0.392105 0.208798 +0.128904 0.307582 0.18276 +0.173163 0.280669 0.197839 +0.237808 0.190239 0.0542196 +0.242415 0.187695 0.0885314 +0.257589 0.159811 0.105872 +0.25799 0.149475 0.1552 +0.249199 0.167605 0.0439231 +0.270589 0.141138 0.0478035 +0.291007 0.120776 0.0668204 +0.27986 0.0943457 0.0648346 +0.262028 0.128688 0.0220064 +0.283888 0.104244 0.08796 +0.278117 0.09277 0.114653 +0.296211 0.119268 0.134225 +0.25745 0.0686993 0.129638 +0.231499 0.0874258 0.144645 +0.23624 0.121986 0.150481 +0.21822 0.158716 0.152133 +0.276736 0.0681718 0.110294 +0.286087 0.0545245 0.0921962 +0.114064 0.342002 0.184102 +0.184346 0.361594 0.187357 +0.161147 0.378013 0.229421 +0.186402 0.32651 0.232026 +0.224199 0.278314 0.231623 +0.178684 0.387524 0.165454 +0.207571 0.416517 0.162223 +0.115261 0.360345 0.210089 +0.111327 0.375408 0.183082 +0.123148 0.405595 0.17979 +0.161317 0.441861 0.200022 +0.134075 0.42215 0.208124 +0.166581 0.413272 0.221996 +0.184888 0.467555 0.155941 +0.139501 0.435526 0.173911 +0.158717 0.435906 0.144337 +0.167498 0.45215 0.103084 +0.137763 0.359978 0.22921 +0.165611 0.348074 0.227085 +0.15984 0.318857 0.217125 +0.185554 0.304169 0.211919 +0.205103 0.278784 0.204981 +0.244841 0.279219 0.196675 +0.226891 0.25345 0.209087 +0.216714 0.31142 0.225032 +0.18164 0.33693 0.20427 +0.203702 0.303717 0.18726 +0.193627 0.296232 0.146589 +0.191637 0.257284 0.18429 +0.157803 0.257523 0.177293 +0.175634 0.311565 0.125155 +0.161107 0.457828 0.173386 +0.194169 0.447882 0.185268 +0.194408 0.477711 0.118315 +0.219599 0.449898 0.13857 +0.135294 0.387364 0.228733 +0.145147 0.282789 0.187345 +0.143956 0.303159 0.203618 +0.177446 0.366384 0.212315 +0.179329 0.391491 0.217312 +0.18672 0.412483 0.210145 +0.202606 0.421792 0.189409 +0.174085 0.42914 0.210627 +0.153641 0.426813 0.21312 +0.144424 0.408706 0.223131 +0.190464 0.428693 0.201747 +0.178837 0.441581 0.19921 +0.169704 0.452082 0.187978 +0.180705 0.459908 0.173619 +0.202088 0.458198 0.166952 +0.151672 0.449754 0.186725 +0.142475 0.436806 0.198199 +0.127991 0.425256 0.188222 +0.210178 0.437176 0.172385 +0.119636 0.410278 0.199562 +0.206557 0.46857 0.145869 +0.215386 0.468035 0.123827 +0.207969 0.436894 0.106764 +0.212477 0.477963 0.10116 +0.128023 0.4054 0.215288 +0.223073 0.454408 0.0921651 +0.184017 0.321535 0.149004 +0.164058 0.339436 0.133054 +0.141763 0.356765 0.138374 +0.138767 0.331395 0.111494 +0.18387 0.5 0.0894472 +0.178253 0.341112 0.15974 +0.158692 0.397227 0.229447 +0.261987 0.258572 0.22454 +0.209557 0.191204 0.156985 +0.19703 0.220129 0.168363 +0.114158 0.395299 0.191384 +0.237163 0.239354 0.0176536 +0.22873 0.228755 -0.0079498 +0.204237 0.229854 -0.000985107 +0.191898 0.248869 0.0164149 +0.195144 0.299533 0.0501168 +0.211408 0.277777 0.0261684 +0.181525 0.269092 0.042102 +0.232338 -0.0296485 0.018274 +0.220704 0.448894 0.117889 +0.211836 0.430361 0.128709 +0.200007 0.22745 0.0221073 +0.206622 0.221816 0.0395427 +0.223655 0.239447 0.0484776 +0.206846 0.263872 0.061817 +0.192412 0.289403 0.0880222 +0.200823 -0.0669613 0.089238 +0.1998 0.487191 0.0879627 +0.178418 0.478766 0.0726805 +0.171907 0.478 0.098484 +0.179607 0.4432 0.070784 +0.215421 0.44036 0.0572748 +0.206111 0.438517 0.081171 +0.184196 0.432818 0.0953164 +0.172787 0.433405 0.115219 +0.16681 0.454422 0.128591 +0.158037 0.463512 0.080819 +0.300027 -0.106441 0.0798503 +0.301565 -0.138608 0.110073 +0.223785 -0.0676095 0.104371 +0.244386 -0.0720528 0.0937201 +0.25624 -0.0594904 0.0758547 +0.271472 -0.0437947 0.0690266 +0.283677 -0.0568988 0.0744319 +0.294284 -0.0698767 0.0795338 +0.293906 -0.0887216 0.0736412 +0.275743 -0.101071 0.0877101 +0.309738 -0.0894098 0.0874741 +0.287014 -0.123527 0.0945964 +0.311125 -0.118131 0.0991123 +0.298899 -0.117613 0.118193 +0.276193 -0.109289 0.135451 +0.270493 -0.137621 0.153632 +0.286312 -0.136798 0.132025 +0.257826 -0.0797919 0.144654 +0.303792 -0.0864306 0.104131 +0.28817 -0.0747287 0.113826 +0.276632 -0.0878111 0.128274 +0.30695 -0.103289 0.107245 +0.287682 -0.0559229 0.10414 +0.272738 -0.0407993 0.108633 +0.253435 -0.0365139 0.124117 +0.295415 -0.0573592 0.0898843 +0.270105 -0.0629299 0.0693418 +0.263375 -0.0783235 0.0820667 +-0.216962 -0.20051 0.140681 +-0.236047 -0.180496 0.115013 +-0.230292 -0.136771 0.112494 +-0.247625 -0.159292 0.0914591 +-0.209896 -0.129892 0.141237 +0.222682 0.288177 0.190351 +0.233778 0.296853 0.212089 +0.209365 0.287061 0.167624 +0.208618 0.271128 0.146657 +0.223776 0.247151 0.14266 +0.250594 0.280585 0.221005 +0.215525 0.238928 0.164607 +0.248724 0.243405 0.176599 +0.282927 0.23674 0.194658 +0.253819 0.208937 0.178714 +0.265424 0.184312 0.155732 +0.308614 0.169998 0.183237 +0.273365 0.179729 0.192265 +0.265912 0.204786 0.204674 +0.300509 0.203464 0.194384 +0.281969 0.151677 0.177526 +0.279246 0.127373 0.158699 +0.31079 0.143896 0.162421 +0.30954 0.171009 0.155179 +0.288086 0.1804 0.137744 +0.264265 0.175268 0.132545 +0.241184 0.168571 0.143536 +0.282052 0.162312 0.123541 +0.290218 0.138764 0.11928 +0.232003 0.191432 0.146429 +0.237199 0.211128 0.131059 +0.175486 0.13591 0.157401 +0.244193 0.0453066 0.121153 +0.216838 0.0295154 0.115567 +0.0778181 0.0182774 -0.0959304 +0.132697 0.385267 0.165833 +0.155812 0.38306 0.160495 +-0.00373338 0.0386319 -0.0871428 +0.0052284 0.0508015 -0.0521262 +-0.0272532 0.0521944 -0.0650671 +-0.0417118 0.0760468 -0.0274796 +0.0432101 0.0478592 -0.0430105 +0.0360437 0.064037 -0.0095129 +0.0264403 0.0878588 0.0105855 +0.0200841 0.0963175 -0.0204482 +0.0508265 0.0939603 -0.0091335 +0.0753367 0.087282 -0.0290458 +-0.0114666 0.0989277 -0.0268583 +0.189464 0.426182 0.111762 +-0.04038 -0.0265907 0.0536548 +0.188037 0.19051 0.048384 +0.170897 0.170857 0.0404072 +0.180803 0.154042 0.0195245 +0.168583 0.128396 0.0100026 +0.150344 0.161847 0.0580756 +0.146195 0.173828 0.0846654 +0.123104 0.163389 0.100752 +0.131952 0.158423 0.126057 +0.154039 0.169296 0.137953 +0.163282 0.191526 0.127822 +0.170691 0.206066 0.147249 +0.123979 0.136658 0.135 +0.136161 0.125537 0.148878 +0.153818 0.131557 0.161379 +0.111897 0.12133 0.126074 +0.111889 0.144276 0.0890707 +0.11658 0.140768 0.0690434 +0.119959 0.124948 0.0613596 +0.107779 0.107117 0.0626571 +0.122618 0.115267 0.0466942 +0.127454 0.104238 0.0219653 +0.136258 0.119892 0.0320023 +0.129073 0.0915077 -0.00265103 +0.130797 0.0780035 -0.0369633 +0.10768 0.094992 0.00979378 +0.163926 0.154671 0.152149 +0.0894836 0.0909923 0.00058556 +0.0689505 0.0963924 0.00171312 +0.0612997 0.100634 0.0224348 +0.0675451 0.0846698 0.038694 +0.0795109 0.103357 0.0384133 +0.0848094 0.0754581 0.0444653 +0.110567 0.10366 0.130086 +0.12281 0.0864143 0.139975 +0.117855 0.062854 0.143513 +0.13666 0.0472165 0.155281 +0.128164 0.0235742 0.176647 +0.163067 0.0498951 0.143567 +0.143932 0.0949004 0.145284 +0.179917 0.317727 0.0742859 +0.183725 0.275085 0.0676723 +0.16838 0.29297 0.0787056 +0.0930951 0.102542 0.05002 +0.100339 0.0681106 0.0373411 +0.102886 0.0622715 0.0197467 +0.121511 0.0540863 0.0117598 +0.124719 0.0242285 0.0166428 +0.0967861 -0.00310471 -0.0020113 +0.12138 0.0519179 -0.0102922 +0.0990646 0.0492208 -0.022422 +0.0873807 -0.0275369 -0.03209 +0.200694 -0.191636 -0.0546067 +0.206298 -0.170055 -0.0598788 +0.209964 -0.168421 -0.0791806 +0.221182 -0.183261 -0.0963771 +0.222775 -0.172837 -0.120159 +0.235715 -0.195921 -0.115182 +0.253933 -0.218526 -0.134037 +0.311213 -0.253911 -0.191866 +0.279294 -0.244732 -0.16099 +0.266185 -0.201338 -0.169529 +0.285572 -0.216415 -0.213382 +0.273765 -0.285731 -0.187819 +0.259679 -0.265381 -0.248632 +0.24894 -0.227823 -0.231771 +0.232153 -0.25966 -0.225227 +0.254118 -0.290735 -0.220386 +0.336364 -0.328047 -0.241676 +0.281317 -0.319577 -0.26697 +0.295033 -0.317038 -0.218433 +0.327766 -0.263669 -0.27537 +0.320681 -0.238904 -0.235706 +0.333487 -0.28367 -0.222752 +0.25789 -0.299076 -0.25318 +0.280382 -0.278404 -0.287734 +0.262726 -0.334272 -0.234674 +0.315714 -0.303377 -0.28762 +0.358898 -0.298323 -0.270079 +0.292961 -0.250812 -0.263064 +0.260427 0.269097 0.206442 +0.273912 0.251948 0.207483 +0.274266 0.226866 0.218876 +0.254508 0.262332 0.186312 +0.268737 0.247011 0.182676 +0.278883 0.230014 0.174886 +0.292676 0.216891 0.181537 +0.301666 0.196568 0.170643 +0.235991 0.25839 0.179999 +0.216996 0.262302 0.191107 +0.233602 0.240223 0.192553 +0.26623 0.217767 0.166603 +0.291208 0.219735 0.206357 +0.285626 0.200003 0.208179 +0.295054 0.181857 0.198439 +-0.119559 -0.0454446 0.130205 +-0.148541 -0.0288065 0.124554 +-0.122421 -0.0280036 0.104512 +-0.169628 -0.0428483 0.136658 +-0.192691 -0.0700149 0.138018 +-0.165949 -0.0805689 0.151606 +-0.157867 -0.111652 0.162619 +-0.182289 -0.134815 0.160033 +-0.171616 -0.0265274 0.119564 +-0.182821 -0.0294707 0.089096 +-0.207158 -0.0941133 0.130893 +-0.0813687 -0.408143 0.0168626 +-0.0493082 -0.255289 0.183439 +-0.0417823 -0.281988 0.16825 +-0.0232624 -0.242141 -0.150317 +0.237084 0.148575 0.150278 +0.21825 0.135883 0.152701 +0.196547 0.147262 0.152063 +0.248839 0.134889 0.149793 +0.25417 0.116897 0.146677 +0.154738 -0.248351 -0.113516 +0.149894 -0.252291 -0.14374 +0.127807 -0.247316 -0.112579 +0.100037 -0.239188 -0.118127 +0.171952 -0.258325 -0.155783 +0.206243 -0.267544 -0.164319 +0.152779 -0.244265 -0.170212 +0.238869 -0.271194 -0.164355 +0.19948 -0.240785 -0.114164 +0.228533 -0.228656 -0.117975 +0.0806348 -0.448964 -0.0364622 +0.092817 -0.46403 -0.0236687 +0.131465 -0.464547 -0.0186627 +0.111576 -0.45856 -0.0162136 +0.12236 -0.437795 -0.0167687 +0.116113 -0.473014 -0.0333379 +0.141834 -0.466374 -0.0462667 +0.15629 -0.45187 -0.0265272 +0.162053 -0.430562 -0.0436087 +0.170805 -0.433786 -0.074571 +0.150694 -0.440322 -0.089161 +0.142403 -0.453672 -0.0687084 +0.20922 0.0225383 -0.118012 +0.245897 0.00269769 -0.0710137 +-0.0868896 -0.445579 -0.0827631 +-0.0899978 -0.418668 -0.0662628 +-0.0919895 -0.382051 -0.0731611 +-0.286076 -0.18977 0.00251657 +0.166397 -0.235956 -0.0665238 +0.18289 -0.231659 -0.0402536 +0.183601 -0.256036 -0.0114407 +0.19304 -0.222737 -0.0114233 +0.168396 -0.264129 0.0198747 +0.175145 -0.292863 -0.0261367 +0.159612 -0.311932 -0.0502102 +0.151795 -0.349231 -0.058414 +0.168467 0.120276 0.165442 +0.179322 0.109989 0.151163 +0.191745 0.091503 0.1476 +0.207409 0.0731218 0.143583 +0.170472 0.088013 0.148441 +0.198308 0.0526608 0.137187 +-0.288444 -0.322548 -0.196751 +-0.258254 -0.336596 -0.201797 +-0.260706 -0.370334 -0.191889 +-0.262012 -0.38355 -0.234182 +0.169409 0.331718 0.106522 +-0.0883279 -0.427369 -0.00320489 +-0.0757242 -0.410706 -0.00350047 +-0.0694098 -0.396348 -0.0215868 +-0.339105 -0.28249 -0.133907 +0.14338 -0.190029 -0.185968 +0.113197 -0.189729 -0.178573 +0.161752 -0.208101 -0.1989 +0.163143 -0.233988 -0.192556 +0.187542 -0.24244 -0.20457 +0.214342 -0.231174 -0.221761 +0.200695 -0.263551 -0.191549 +0.0888974 -0.174918 -0.165344 +0.0728578 -0.155488 -0.148655 +0.0857975 -0.13271 -0.133069 +0.0496654 -0.153477 -0.133288 +0.208417 -0.252602 -0.211864 +0.214499 -0.20684 -0.209109 +0.212326 -0.182246 -0.176825 +0.196622 -0.193456 -0.194925 +-0.0366034 0.0848157 -0.0747335 +-0.0106036 0.0767347 -0.0825468 +-0.248014 -0.143811 -0.0711582 +0.156176 -0.353723 -0.00967102 +0.161881 -0.35946 -0.0354879 +0.154192 -0.374021 -0.054565 +0.153835 -0.401954 -0.0551512 +0.147106 -0.376782 -0.0111704 +0.141013 -0.401853 -0.0175381 +0.127378 -0.38782 -0.00428773 +0.152558 -0.410563 -0.0345712 +0.144573 -0.387551 -0.0699167 +0.129797 -0.395951 -0.0860393 +0.110844 -0.383365 -0.0877166 +0.111358 -0.362136 -0.0828181 +0.10863 -0.332992 -0.0757964 +0.131091 -0.348484 -0.0736181 +0.114528 -0.372564 0.00601769 +0.116893 -0.350867 0.0177725 +0.143657 -0.369483 -0.0686154 +0.0433039 -0.239647 0.0998892 +-0.318832 -0.357055 -0.211401 +-0.299837 -0.377374 -0.238049 +-0.340344 -0.383626 -0.224893 +-0.356366 -0.419986 -0.188103 +-0.285529 -0.404192 -0.228972 +-0.356375 -0.393121 -0.201407 +-0.349321 -0.392013 -0.165399 +-0.328811 -0.42272 -0.163607 +-0.345548 -0.417553 -0.216974 +-0.322795 -0.427865 -0.195551 +-0.33518 -0.363207 -0.161311 +-0.0812327 -0.396788 0.0342935 +-0.065289 -0.38943 0.0224745 +-0.0508718 -0.371639 0.0298172 +-0.260668 -0.216401 0.0653687 +-0.2704 -0.185201 0.0538295 +0.187032 0.486356 0.0996338 +0.279593 -0.136382 0.110973 +0.26837 -0.117918 0.105466 +0.248285 -0.109463 0.116456 +0.232397 -0.125931 0.141691 +0.210603 -0.141776 0.171116 +0.137574 -0.108705 0.207737 +0.169921 0.29167 0.0522744 +0.00992085 -0.113945 -0.0964453 +0.258261 -0.257702 -0.154872 +0.275321 -0.267702 -0.17038 +0.295633 -0.272896 -0.184932 +0.295815 -0.294739 -0.20199 +0.314713 -0.27743 -0.201437 +0.327332 -0.256197 -0.214678 +0.340385 -0.261017 -0.241446 +0.313356 -0.232789 -0.209684 +0.296344 -0.226073 -0.182212 +0.31592 -0.301772 -0.216769 +0.318635 -0.326842 -0.222796 +0.307178 -0.325937 -0.251416 +0.274745 -0.303144 -0.21295 +0.263287 -0.308346 -0.232527 +0.255382 -0.319889 -0.248754 +0.332002 -0.310475 -0.229091 +0.353636 -0.307458 -0.245121 +0.335859 -0.313851 -0.265914 +0.340499 -0.300896 -0.286697 +0.344989 -0.280039 -0.276203 +0.327449 -0.28026 -0.295194 +0.304942 -0.268737 -0.28762 +0.34983 -0.283684 -0.251927 +0.343136 -0.265469 -0.261534 +0.326713 -0.248963 -0.256716 +0.307917 -0.24034 -0.252462 +0.279159 -0.231625 -0.241522 +0.300353 -0.229376 -0.234338 +0.311358 -0.251222 -0.26759 +0.299024 -0.289572 -0.301481 +0.279907 -0.305571 -0.290358 +0.263002 -0.29286 -0.276914 +0.260616 -0.313748 -0.268771 +0.275922 -0.322371 -0.224156 +0.284975 -0.33259 -0.244221 +0.303023 -0.336946 -0.233483 +0.289605 -0.333838 -0.221905 +0.166435 0.39886 0.154509 +0.189152 0.404825 0.153461 +0.197133 0.400723 0.1737 +0.17424 0.413608 0.143911 +0.169142 0.426834 0.132439 +0.188725 0.386035 0.180698 +0.186219 0.378081 0.198788 +-0.267025 -0.372115 -0.138391 +-0.248022 -0.367522 -0.158602 +0.174505 0.292586 0.0990952 +0.186251 0.309263 0.0928235 +0.181697 0.30513 0.109614 +0.189499 0.279776 0.119317 +0.172647 0.294457 0.120787 +0.158057 0.303956 0.130265 +0.143476 0.291331 0.139139 +0.131312 0.30031 0.159002 +0.186095 0.298863 0.131041 +0.198975 0.28677 0.132576 +0.172236 0.277192 0.117866 +0.184313 0.260452 0.109718 +0.15755 0.265746 0.122578 +0.145983 0.269471 0.137935 +0.151234 0.256355 0.155644 +0.124293 0.323596 0.164277 +0.126678 0.342635 0.150186 +0.129524 0.341544 0.128525 +0.146576 0.349856 0.118779 +0.192269 0.30374 0.0759625 +0.202728 0.285813 0.0690781 +0.210479 0.281567 0.0483558 +0.222196 0.26209 0.0407369 +0.224073 0.261141 0.0186008 +0.162756 0.306191 0.114529 +0.149682 0.318744 0.121136 +0.152677 0.341974 0.100993 +0.164071 0.331208 0.0841361 +0.146523 0.323278 0.093798 +0.15695 0.312461 0.0714443 +0.22266 -0.203518 -0.100877 +0.262076 -0.292278 -0.202356 +0.249754 -0.28212 -0.183581 +0.242451 -0.284733 -0.203885 +0.229725 -0.273053 -0.211906 +0.243386 -0.275428 -0.225419 +0.255999 -0.283472 -0.239546 +-0.261873 -0.405224 -0.222848 +-0.280772 -0.420055 -0.201182 +-0.274389 -0.414773 -0.173401 +-0.298626 -0.411672 -0.158377 +-0.28738 -0.389898 -0.148508 +-0.300008 -0.369107 -0.135836 +-0.257381 -0.39915 -0.185758 +-0.257531 -0.421709 -0.186727 +-0.319983 -0.369357 -0.146016 +-0.25404 -0.39271 -0.206532 +-0.269186 -0.375948 -0.213104 +0.171129 0.312683 0.0555484 +0.186538 0.309469 0.0612947 +0.17697 0.322584 0.0897939 +0.180094 0.317456 0.102692 +0.0389455 -0.294719 0.0707663 +0.19085 0.129482 0.148059 +0.26893 -0.330546 -0.250405 +0.261495 -0.324416 -0.260179 +0.163955 0.0845671 -0.00775852 +0.172992 0.467003 0.114773 +0.17962 0.47069 0.135115 +0.167392 0.460661 0.148013 +0.0927702 -0.0102964 0.178794 +0.0791092 -0.00358862 0.211868 +0.0484002 -0.0727004 0.143042 +0.0857054 -0.0664246 0.132462 +0.170606 0.462905 0.162683 +0.107346 -0.291576 0.0507084 +0.123054 -0.26548 0.0555752 +0.1033 -0.273351 0.0618915 +-0.217347 -0.0684085 0.0793768 +-0.232534 -0.1003 0.0785864 +0.160705 0.203815 0.112095 +0.157448 0.189802 0.0951937 +0.163855 0.222961 0.107992 +0.178039 0.226994 0.0939715 +0.157779 0.236558 0.121407 +0.156862 0.233096 0.141593 +0.254115 0.147478 0.0328869 +0.246739 0.139758 0.0163119 +-0.313249 -0.26088 -0.138114 +-0.319034 -0.272336 -0.0954566 +-0.312031 -0.286413 -0.151154 +-0.318615 -0.301412 -0.127758 +-0.31358 -0.30952 -0.0911544 +-0.342054 -0.297563 -0.104135 +-0.285707 -0.289103 -0.098473 +-0.332554 -0.290038 -0.0650158 +0.224391 0.444149 0.0748945 +0.224127 0.466497 0.0733316 +0.00933378 -0.0890982 -0.073455 +-0.196836 -0.0544369 -0.0547609 +-0.268852 -0.35939 -0.204575 +-0.134821 -0.144762 0.184037 +-0.134018 -0.119846 0.172991 +-0.108849 -0.110436 0.169417 +-0.142893 -0.258813 -0.176858 +0.163435 0.422628 0.144619 +0.149105 0.425301 0.157986 +0.151653 0.445126 0.160854 +0.205634 0.453218 0.0682861 +0.196116 0.437078 0.0613117 +0.305429 0.136514 0.131635 +0.304223 0.128705 0.150462 +0.294739 0.1352 0.16485 +0.29983 0.148475 0.176204 +0.293633 0.16134 0.186506 +0.312816 0.146868 0.144611 +0.290574 0.119539 0.149687 +0.280449 0.10933 0.137413 +0.285959 0.112117 0.117297 +0.154398 0.116961 0.162863 +0.147042 0.108372 0.152274 +0.179394 0.214392 0.162515 +0.185651 0.194518 0.157404 +0.180628 0.232354 0.173507 +0.198969 0.238329 0.174545 +0.207694 0.253512 0.177641 +0.203869 0.264161 0.186147 +0.189501 0.273156 0.193533 +0.17312 0.263127 0.188581 +-0.206119 -0.0619918 0.116346 +-0.201545 -0.0465532 0.095691 +0.256266 0.152102 0.0503785 +0.264034 0.143148 0.0672501 +0.26342 0.152022 0.0867622 +0.269601 0.144159 0.103885 +0.281713 0.137095 0.0629023 +0.296165 0.127981 0.0376256 +0.300117 0.13462 0.0559043 +0.287642 0.140563 0.0456708 +0.278661 0.132147 0.0309413 +0.271646 0.118273 0.028754 +0.262921 0.1025 0.0261376 +0.261118 0.0855637 0.0169037 +0.25422 0.0767023 0.000233527 +0.237362 0.0575218 0.00198963 +0.283388 0.119704 0.0383643 +0.282941 0.112062 0.0540402 +0.249937 0.0937398 -0.00575339 +0.231931 0.0954578 -0.0107377 +0.210437 0.0914748 -0.0140972 +0.239252 0.109782 0.000233887 +0.191402 0.0870306 -0.0134669 +0.184376 0.0704441 -0.0225342 +0.184719 0.0606504 -0.044543 +0.166145 0.0578967 -0.0668264 +0.200251 0.061117 -0.0313226 +0.217304 0.057967 -0.0199728 +0.227686 0.12158 0.00370932 +0.20937 0.123042 0.000300618 +0.244333 0.124524 0.00810813 +0.295429 0.120597 0.0522453 +0.178132 0.0791963 -0.0112798 +0.177197 -0.279627 -0.000252101 +0.173639 -0.299787 -0.00606886 +0.172196 -0.313975 -0.0223573 +0.166117 -0.326159 -0.00858114 +0.168079 -0.321719 -0.0379096 +0.162521 -0.339731 -0.0445028 +0.151373 -0.32895 -0.0576036 +0.312369 -0.105021 0.0899766 +0.306 -0.11652 0.0866674 +0.301418 -0.129182 0.0942967 +0.290875 -0.135236 0.101483 +0.289966 -0.143698 0.1109 +0.295915 -0.13953 0.122573 +0.279108 -0.148197 0.122497 +0.27841 -0.152315 0.142258 +0.265867 -0.157983 0.158785 +0.256687 -0.14661 0.137703 +0.25422 -0.140442 0.172759 +0.232237 -0.161116 0.192798 +0.192807 -0.160413 0.202508 +0.178601 -0.140578 0.237092 +0.154384 -0.117167 0.24831 +0.13004 -0.134226 0.269277 +0.17845 -0.105479 0.223698 +0.247464 -0.158843 0.179106 +0.226891 -0.158442 0.171794 +0.209982 -0.159856 0.187271 +0.217821 -0.141328 0.207646 +0.23745 -0.141109 0.186416 +0.229503 -0.142546 0.156329 +0.214657 -0.125289 0.155947 +0.193847 -0.12199 0.171057 +0.217246 -0.105649 0.140104 +0.198069 -0.0856194 0.142621 +0.193693 -0.14343 0.18682 +0.198045 -0.145975 0.222277 +0.178989 -0.164931 0.225321 +0.158831 -0.146831 0.218292 +0.158889 -0.159611 0.244735 +0.138513 -0.154491 0.257842 +0.156487 -0.13924 0.256434 +-0.290841 -0.208347 -0.00770324 +-0.29533 -0.224009 -0.017137 +-0.30561 -0.24462 -0.0155011 +-0.278365 -0.220452 -0.0277869 +-0.267819 -0.241114 -0.0357093 +-0.286737 -0.259306 -0.0462551 +-0.310093 -0.264404 -0.0203987 +-0.307167 -0.250649 -0.0341839 +-0.307612 -0.281242 -0.0310235 +-0.321036 -0.286281 -0.0471544 +-0.310491 -0.270102 -0.0639157 +-0.311345 -0.301149 -0.0633156 +-0.297683 -0.291436 -0.0450671 +-0.294949 -0.304108 -0.0790095 +-0.285459 -0.27779 -0.0488974 +-0.296472 -0.275126 -0.0168658 +-0.276222 -0.270671 -0.00788631 +-0.246454 -0.248267 -0.0329014 +-0.244456 -0.252303 -0.00937036 +-0.304286 -0.259682 -0.0492577 +-0.294933 -0.27203 -0.0604957 +-0.300998 -0.278796 -0.0743602 +-0.316674 -0.274623 -0.0789273 +-0.337714 -0.280945 -0.0853892 +-0.325825 -0.275251 -0.0655092 +-0.332977 -0.302425 -0.0833069 +-0.293564 -0.290291 -0.0772666 +-0.298024 -0.281309 -0.0905074 +-0.293634 -0.272694 -0.109468 +-0.270428 -0.274072 -0.107657 +-0.256077 -0.253991 -0.120812 +-0.261078 -0.296954 -0.0999473 +-0.2381 -0.297373 -0.0849839 +-0.232752 -0.278906 -0.0645746 +-0.272041 -0.319246 -0.10842 +-0.21032 -0.284441 -0.0448701 +-0.256436 -0.341131 -0.11181 +-0.225098 -0.336223 -0.113241 +-0.200175 -0.288996 -0.0158483 +-0.223009 -0.317757 -0.0905879 +-0.301096 -0.262202 -0.123506 +-0.32405 -0.263071 -0.116908 +-0.292477 -0.257052 -0.14263 +-0.270149 -0.255918 -0.142108 +-0.275486 -0.258003 -0.162669 +-0.259523 -0.2674 -0.178244 +-0.251069 -0.250018 -0.0970302 +-0.24056 -0.260706 -0.172311 +-0.232499 -0.247239 -0.154361 +-0.34182 -0.274562 -0.107339 +-0.294559 -0.307923 -0.0994756 +-0.275844 -0.269552 -0.0355918 +-0.227344 -0.270897 -0.045083 +0.25093 0.170443 0.120028 +0.248384 0.184009 0.106523 +0.235777 0.198062 0.103222 +0.23641 0.211305 0.086191 +0.221152 0.226047 0.0898201 +0.223243 0.24123 0.111495 +0.203883 0.250541 0.105061 +0.226958 0.225862 0.123117 +0.219737 0.240254 0.12789 +0.214138 0.253162 0.132941 +0.232275 0.224561 0.138088 +0.109391 -0.247931 -0.0995264 +0.104952 -0.262437 -0.0820427 +0.080763 -0.274056 -0.0783487 +0.0604155 -0.262392 -0.0950373 +-0.227936 -0.329497 -0.190147 +-0.214125 -0.337031 -0.170051 +0.263325 -0.0528405 0.0685009 +0.251926 -0.0484757 0.0715634 +0.237277 -0.0480579 0.0658708 +0.244491 -0.055646 0.0790843 +0.239659 -0.0616442 0.0888399 +0.226162 -0.0616059 0.0920824 +0.21522 -0.0631162 0.0781895 +0.212545 -0.0629682 0.0966232 +0.196781 -0.0599901 0.105959 +0.210127 -0.0657511 0.11188 +0.250495 -0.0660959 0.0846797 +0.234672 -0.0671026 0.0978575 +0.237261 -0.0846396 0.108485 +0.25989 -0.0423809 0.0666642 +0.259987 -0.0257531 0.0664908 +0.247883 -0.0247631 0.0554477 +0.242689 -0.0135836 0.0440572 +0.246291 0.00496067 0.0457059 +0.245187 0.0234669 0.0372413 +0.250061 0.17416 0.133813 +0.259114 0.167602 0.148828 +0.26511 0.166925 0.171546 +0.238618 0.181672 0.138204 +0.229669 0.176644 0.149535 +0.262049 0.187134 0.176237 +0.261795 0.200868 0.165371 +0.276513 0.199318 0.153854 +0.292677 0.199982 0.157209 +0.302715 0.186361 0.157188 +0.308755 0.181779 0.171774 +0.305926 0.190608 0.185482 +0.312423 0.167782 0.169221 +0.31381 0.157653 0.158921 +0.310783 0.154703 0.171639 +0.301108 0.177938 0.144841 +0.293264 0.189309 0.147256 +0.279322 0.188458 0.145304 +0.262483 0.193127 0.192418 +0.274289 0.192768 0.20161 +0.254841 0.206509 0.193978 +0.245154 0.222549 0.189318 +0.253012 0.22552 0.174345 +0.265429 0.23121 0.17081 +-0.253206 -0.236908 -0.0443888 +0.149428 0.386275 0.232451 +0.147867 0.371017 0.232576 +0.152926 0.356705 0.229375 +0.149032 0.338169 0.225131 +0.166114 0.363727 0.223417 +0.172256 0.353426 0.215568 +0.179541 0.338962 0.221969 +0.181625 0.354174 0.201921 +0.186426 0.343494 0.187951 +0.192075 0.328517 0.215563 +0.192453 0.320313 0.195502 +0.17815 0.351274 0.174302 +0.17655 0.370022 0.172318 +0.165276 0.33179 0.225541 +0.00939661 -0.323412 0.0804555 +0.117561 -0.144032 0.250595 +0.120353 -0.125008 0.233582 +0.111251 -0.145731 0.271784 +0.11093 -0.120815 0.285658 +0.0754192 -0.0921393 0.301481 +0.0769558 -0.124739 0.290267 +0.0748528 -0.117401 0.265004 +0.0426218 -0.103655 0.282975 +0.0504123 -0.0659143 0.287583 +0.0836935 -0.0669285 0.279976 +0.0588543 -0.11803 0.279938 +0.0586609 -0.105277 0.297458 +0.0557269 -0.0839063 0.29826 +0.0381914 -0.083198 0.286361 +0.0371995 -0.0680895 0.266535 +0.047335 -0.0888232 0.265922 +0.05563 -0.0732275 0.247968 +0.0616189 -0.0543441 0.232231 +0.0811821 -0.0784737 0.231059 +0.0764784 -0.0353683 0.254905 +0.0689625 -0.0703705 0.29266 +0.0661415 -0.0548095 0.278244 +0.0608765 -0.028919 0.235586 +0.087271 -0.018263 0.234864 +0.0756435 -0.10953 0.298971 +0.0951645 -0.0988538 0.288259 +0.0930654 -0.116235 0.295574 +0.0947803 -0.133863 0.284699 +0.0966033 -0.0830131 0.273711 +0.113798 -0.076403 0.258582 +0.127442 -0.0600385 0.234949 +0.132794 -0.0953943 0.252522 +0.0489111 -0.0556973 0.272686 +0.0606107 -0.0431898 0.263976 +0.0971312 -0.036293 0.245012 +0.110687 -0.0488392 0.23675 +0.126176 -0.0414728 0.221378 +0.136057 -0.0243951 0.201716 +0.122078 0.00127519 0.196707 +0.142291 0.00027007 0.178375 +0.0664164 -0.0191578 0.217877 +0.0802696 -0.0234954 0.199319 +0.0910082 -0.0454502 0.20083 +0.0798776 -0.132726 0.273919 +0.102454 0.00166634 0.210465 +0.0802091 -0.00534582 0.192641 +0.0863635 0.00814252 0.179895 +0.0946306 0.0282399 0.168655 +0.0981336 0.029523 0.148764 +0.101777 0.0395859 0.135111 +0.102082 0.0581642 0.134881 +0.0956437 0.0321468 0.122829 +0.0938658 0.0161985 0.122282 +0.107901 0.00369122 0.128399 +0.078491 0.00576055 0.124425 +0.0841199 0.0382034 0.11313 +0.0659972 0.0331947 0.109714 +0.0520056 0.0196069 0.12098 +0.108345 -0.0142416 0.126349 +0.0915975 -0.0313276 0.129913 +0.122833 -0.0287943 0.124051 +0.146418 -0.0426624 0.119895 +0.142658 -0.0228961 0.131632 +0.132595 -0.0194368 0.150249 +0.160419 -0.0327892 0.133975 +0.163125 -0.050543 0.147173 +0.060233 0.0422739 0.0970401 +0.0469107 0.0353785 0.0851224 +0.0330985 0.0252247 0.0760721 +0.0344131 0.0145341 0.0525338 +0.0185411 0.0141735 0.0691085 +-0.00651953 0.00766464 0.081092 +0.0314926 0.0314677 0.0951056 +0.0155266 0.0258059 0.107793 +0.11957 0.0050674 0.144577 +0.11348 -0.010764 0.15919 +0.0864989 0.00930931 0.196192 +0.112679 0.0343949 0.172228 +0.110056 0.0172326 0.144505 +-0.231861 -0.256194 -0.0373807 +-0.233847 -0.249852 -0.0220477 +-0.230235 -0.258784 -0.00973726 +-0.217151 -0.280061 0.00814621 +-0.228026 -0.273051 0.0389012 +-0.222798 -0.271648 -0.00409819 +-0.229682 -0.268052 0.0118625 +-0.212876 -0.279385 -0.0140325 +-0.214439 -0.277583 -0.0303969 +-0.199886 -0.285356 -0.0320197 +-0.187179 -0.295224 -0.0255156 +-0.167219 -0.315028 -0.0304058 +-0.156845 -0.302235 -0.0544314 +-0.236758 -0.254924 0.00227314 +0.0884351 -0.404348 -0.0195924 +0.0722252 -0.268984 0.0670772 +0.070147 -0.245252 0.0862941 +0.0966471 -0.229612 0.0882203 +0.0926053 -0.203806 0.103764 +0.0777673 -0.186021 0.118999 +0.0417862 -0.182948 0.126604 +0.0709209 -0.158179 0.128709 +0.095465 -0.128791 0.124296 +0.0102764 -0.16375 0.133447 +-0.0233099 -0.171526 0.153541 +-0.0499934 -0.0465621 -0.00582837 +-0.0749973 -0.0355191 0.0101971 +-0.0645299 -0.324704 -0.077104 +0.221779 0.470802 0.0892895 +0.219761 0.464582 0.1032 +0.246597 0.0246927 0.0795416 +0.253586 0.0320272 0.0977802 +0.252394 0.0305168 0.0670227 +0.261064 0.0424817 0.0637394 +0.267205 0.0556508 0.058182 +0.262106 0.0615289 0.0436471 +0.250683 0.0500973 0.0298185 +0.272972 0.0454164 0.0731281 +0.274554 0.0385023 0.090004 +0.285852 0.0505507 0.0780368 +0.287544 0.066644 0.0791877 +0.280213 0.0764884 0.0661465 +0.226162 0.0537579 -0.00800313 +0.231726 0.0372941 0.00212281 +0.226833 0.070796 -0.0125112 +-0.0228881 0.0822405 -0.0141151 +-0.0164496 0.062439 -0.0353807 +-0.0311204 0.09353 -0.0291259 +-0.0468617 0.0890411 -0.0503417 +-0.0192694 0.0958145 -0.0445491 +-0.0451838 0.0631149 -0.0497516 +-0.0349277 0.0970377 -0.0439657 +-0.0281121 0.0908295 -0.0597278 +-0.0422149 0.0875756 -0.0360098 +-0.0493018 0.0748281 -0.0407497 +-0.0508974 0.0756362 -0.0555946 +-0.045787 0.0616401 -0.0714534 +-0.0463878 0.0860458 -0.0643425 +-0.0469 0.0754389 -0.0734442 +-0.0361876 0.0721397 -0.0877453 +-0.0344753 0.0506229 -0.0835042 +-0.0209274 0.0429352 -0.0951495 +-0.00835098 0.0548898 -0.109767 +-0.0439408 0.0675081 -0.0809412 +-0.0384794 0.0604865 -0.0888934 +-0.0325578 0.0529818 -0.0938199 +-0.0250287 0.0507859 -0.100857 +-0.0171358 0.0586173 -0.103485 +-0.00108771 0.0669554 -0.09638 +0.0141047 0.0764389 -0.0789872 +-0.0166767 0.0687863 -0.0931008 +-0.0154196 0.0443974 -0.106822 +0.00804033 0.0334573 -0.118139 +-0.00353356 0.0420783 -0.115203 +0.00267945 0.0333406 -0.10199 +0.0284162 0.0260832 -0.102463 +0.0140719 0.0342408 -0.0876383 +0.01206 0.042083 -0.0690778 +0.0262722 0.0834922 -0.057317 +0.052314 0.0257381 -0.0888721 +0.0550064 0.0153199 -0.121681 +0.0742668 0.0307726 -0.0684202 +0.0254542 0.0462258 -0.0537161 +0.0192751 0.0579365 -0.0299961 +0.043388 0.0389601 -0.0621497 +0.0632571 0.0407552 -0.0511604 +0.0628168 0.0511918 -0.0295138 +-0.00769957 0.0468719 -0.0674097 +0.0356439 0.036944 -0.129564 +0.00985644 0.0486694 -0.11871 +0.0293481 0.0500299 -0.116265 +0.034304 0.0639803 -0.0982281 +0.0203799 0.0394103 -0.126099 +0.0274107 0.0238815 -0.120304 +-0.00989932 0.038173 -0.0977698 +0.0409915 0.0204434 -0.130582 +0.0603476 0.0361414 -0.135064 +0.0745924 0.0111822 -0.144256 +0.0995383 0.0164619 -0.152082 +0.079494 0.0098491 -0.119596 +0.109969 -0.00178903 -0.14121 +0.128369 -0.00667529 -0.145234 +0.147176 -0.000628591 -0.159936 +0.143478 0.0207956 -0.143584 +0.15945 -0.0140125 -0.151421 +0.167046 -0.013357 -0.130058 +0.175024 -0.000463673 -0.161193 +0.200548 0.00730904 -0.144289 +0.228188 0.00606999 -0.13371 +0.232374 -0.0225206 -0.12062 +0.217352 -0.0205681 -0.149989 +0.196446 -0.0094088 -0.159916 +0.0468892 0.0318746 -0.136603 +0.0588847 0.0194871 -0.141629 +0.0497176 0.0425705 -0.12546 +0.067316 0.0466181 -0.121528 +0.0829023 0.0554408 -0.10632 +0.0702884 0.0671402 -0.0864572 +0.0736048 0.0280122 -0.141966 +-0.0393368 0.0927115 -0.058201 +-0.074253 -0.462729 -0.0674302 +-0.0882268 -0.46748 -0.0836924 +-0.10265 -0.454789 -0.102517 +-0.100302 -0.434985 -0.0953132 +-0.123508 -0.439573 -0.0964816 +0.30376 -0.329009 -0.220778 +-0.34576 -0.287787 -0.1184 +-0.333412 -0.299886 -0.118936 +-0.318278 -0.306436 -0.109371 +-0.342798 -0.273541 -0.122349 +-0.330946 -0.265681 -0.13448 +-0.32759 -0.278136 -0.147142 +-0.313986 -0.269795 -0.152301 +-0.304937 -0.277784 -0.160852 +-0.289134 -0.290053 -0.171285 +-0.300398 -0.29313 -0.159904 +-0.305136 -0.304081 -0.143109 +-0.303823 -0.326091 -0.148763 +-0.297334 -0.338307 -0.131821 +-0.0297344 -0.320795 0.126249 +-0.0440833 -0.337561 0.102751 +-0.0635963 -0.3222 0.124646 +-0.0820192 -0.303394 0.145977 +-0.0280108 -0.346215 0.0792887 +0.190023 -0.166658 -0.160984 +0.187606 0.489479 0.0788413 +0.169798 0.492699 0.0805537 +0.160239 0.479513 0.0724411 +0.160997 0.477019 0.0876359 +0.167909 0.48647 0.0907839 +0.168839 0.465921 0.0685027 +0.185848 0.461592 0.0756332 +0.163713 0.449815 0.0719867 +0.171034 0.442192 0.0868531 +0.172622 0.439121 0.100638 +0.176648 -0.0540189 0.138439 +0.191763 0.435033 0.0761478 +0.150024 0.450095 0.173316 +0.142684 0.444609 0.180888 +0.134925 0.435737 0.185852 +0.0901553 -0.0455623 0.257862 +0.0764097 -0.0467149 0.266788 +0.218445 0.190081 -0.00453558 +0.212983 0.187132 0.0158667 +0.234912 0.203072 -0.0090602 +0.217724 0.208098 -0.00630956 +0.209095 0.231498 0.0538229 +0.223398 0.222537 0.0510417 +0.229495 0.205818 0.051858 +0.241614 0.200114 0.0387668 +0.245196 0.212463 0.0252865 +0.232616 0.199508 0.066443 +0.245867 0.187445 0.0704899 +0.218046 0.211438 0.0580939 +0.206013 0.207163 0.0667587 +0.208167 0.217137 0.0808695 +0.189985 0.216171 0.0819923 +-0.328288 -0.282754 -0.0562593 +-0.321215 -0.270892 -0.0527491 +-0.321885 -0.294532 -0.0580289 +-0.324301 -0.301836 -0.070993 +-0.309665 -0.294095 -0.0515043 +-0.298437 -0.298535 -0.0585809 +-0.293755 -0.297175 -0.0685565 +-0.301865 -0.303693 -0.0670723 +-0.312242 -0.307406 -0.0760424 +0.113855 0.0103494 0.135894 +0.117356 -0.000872108 0.134011 +0.24192 0.231796 0.179613 +0.236568 0.24336 0.180529 +0.226028 0.250706 0.186633 +0.280884 -0.220307 -0.163899 +0.26654 -0.211351 -0.150233 +0.265056 -0.233891 -0.14678 +0.318482 -0.331697 -0.239506 +0.324395 -0.322699 -0.253479 +0.31194 -0.314679 -0.269415 +0.329739 -0.334727 -0.229668 +0.336703 -0.323152 -0.229076 +0.344428 -0.313085 -0.23571 +0.342498 -0.293727 -0.236916 +0.350543 -0.322922 -0.2465 +0.353252 -0.314 -0.261759 +0.347047 -0.326986 -0.235121 +0.0827363 -0.465408 -0.0592863 +0.0757733 -0.45735 -0.0483001 +0.0758332 -0.442944 -0.0486429 +0.0763754 -0.427162 -0.064874 +0.0810297 -0.429275 -0.0354104 +0.0760881 -0.402196 -0.0628009 +0.0803331 -0.462498 -0.0366385 +0.075746 -0.427719 -0.0496393 +0.213629 0.454927 0.154222 +0.216172 0.433851 0.152191 +0.213875 -0.163106 0.208849 +0.228479 0.0837143 -0.0171959 +0.214862 0.0777937 -0.0178642 +0.203914 0.0820668 -0.0169156 +0.213551 0.066976 -0.0133462 +-0.291696 -0.291685 -0.053913 +-0.288445 -0.286967 -0.0453936 +-0.283457 -0.280518 -0.0392925 +0.198493 0.267303 0.113918 +-0.00816198 -0.315253 0.11742 +0.312224 -0.337685 -0.224702 +0.0776115 -0.0114015 0.225043 +0.094616 -0.00802053 0.222738 +0.212523 -0.00317223 -0.153514 +0.228944 -0.0069181 -0.146501 +0.230166 -0.0223035 -0.138067 +0.212902 -0.0238532 -0.132712 +0.194522 -0.0219296 -0.138137 +0.240306 -0.00819778 -0.130311 +0.24497 -0.0122967 -0.113875 +0.221562 -0.0094445 -0.0973672 +0.242491 -0.00970392 -0.0927411 +-0.195428 -0.293105 -0.0588105 +-0.174639 -0.293714 -0.0615636 +-0.159198 -0.295096 -0.0708856 +-0.150745 -0.297027 -0.0916319 +-0.165094 -0.309633 -0.116063 +-0.129532 -0.293794 -0.0901166 +-0.12154 -0.29002 -0.105668 +-0.103655 -0.284754 -0.110478 +-0.083304 -0.273535 -0.126518 +-0.126229 -0.291149 -0.124142 +-0.0551206 -0.282297 -0.123125 +-0.0279253 -0.280704 -0.123568 +-0.0254074 -0.296918 -0.100527 +-0.143636 -0.296672 -0.0765836 +0.228772 0.249576 0.00807469 +0.246793 0.197559 -0.000456927 +0.249351 0.185655 0.00965958 +0.077471 -0.38535 -0.0716786 +0.0780138 -0.366405 -0.0698751 +0.0796117 -0.349597 -0.0694382 +0.0817673 -0.324046 -0.067713 +0.0920794 -0.339278 -0.0766687 +0.0745961 -0.308674 -0.0513846 +0.0686559 -0.285979 -0.0584538 +0.0701691 -0.296007 -0.0346939 +0.0958416 -0.324563 -0.0739969 +0.111686 -0.315208 -0.0712996 +0.118212 -0.295045 -0.0671537 +0.145789 -0.285221 -0.0572786 +0.142444 -0.258951 -0.0651148 +0.125807 -0.256448 -0.0777825 +0.0725557 -0.302564 -0.0188272 +0.0757738 -0.318738 -0.0113816 +0.0755625 -0.334153 -0.022547 +0.0716925 -0.292684 -0.00740334 +0.0574002 -0.292216 -0.00131701 +0.0442788 -0.29974 -0.0118635 +0.0322898 -0.309073 -0.00126775 +0.0158934 -0.319374 -0.00927168 +0.00270388 -0.318254 -0.036966 +0.00321031 -0.33353 0.006095 +0.0101246 -0.330737 0.0331595 +0.0571801 -0.291727 0.0142738 +0.0411549 -0.302632 0.0323113 +0.0568056 -0.290026 0.0325413 +0.0726196 -0.279494 0.0399911 +0.0843075 -0.293947 0.0355701 +0.0802412 -0.296732 0.0208207 +0.0757523 -0.290551 0.00911073 +0.0904109 -0.307387 0.0401159 +0.0937218 -0.321431 0.0333001 +0.0876185 -0.332554 0.0196986 +-0.261918 -0.356193 -0.123562 +-0.274572 -0.363058 -0.128675 +-0.283885 -0.374671 -0.137095 +0.0993425 -0.475253 -0.0345906 +0.105878 -0.470302 -0.022596 +0.161209 0.00758193 -0.157082 +0.162861 -0.00496129 -0.160125 +0.14622 0.0234899 0.00861402 +0.16407 0.00688456 0.00334424 +0.187476 0.0108016 -0.000104135 +0.198618 0.0267239 -0.00776275 +0.213159 0.032032 -0.0211609 +0.229764 0.0271876 -0.0288068 +0.229938 0.0432028 -0.0342052 +0.231973 0.0361819 -0.05417 +0.241585 0.0230077 -0.0674939 +0.235826 0.0200922 -0.0913851 +0.229532 0.00831192 -0.0604593 +0.228417 0.0182383 -0.11087 +0.214387 0.0313739 -0.095916 +0.23826 0.0319925 -0.0407356 +0.240603 0.0153722 -0.0478262 +0.185434 0.0390225 -0.0120783 +0.174046 0.035224 -0.0278333 +0.183039 0.0254835 -0.0435084 +0.185088 0.013208 -0.0664572 +0.184517 -0.00115634 -0.0944301 +0.15883 0.0112792 -0.0789407 +0.166768 0.0454452 -0.0125857 +0.149871 0.0473393 -0.0127261 +0.24097 0.0273212 -0.0523021 +0.244689 0.0183228 -0.0578172 +0.239121 0.00955592 -0.0564169 +0.23067 0.0133196 -0.0511149 +0.217815 0.013095 -0.0555127 +0.202953 0.0215885 -0.0445658 +0.223255 0.0309758 -0.00933388 +0.246338 0.00680161 -0.0920968 +-0.29666 -0.251794 -0.0420083 +-0.282377 -0.246563 -0.0382484 +-0.274248 -0.257163 -0.0411355 +0.121069 0.3764 0.220244 +0.124178 0.361607 0.222425 +0.12316 0.347289 0.21517 +0.120818 0.335014 0.200629 +0.131773 0.318764 0.203442 +0.240354 -0.189104 -0.174254 +0.226426 -0.17846 -0.157236 +0.25469 -0.197929 -0.186668 +0.262527 -0.207499 -0.20859 +0.275709 -0.206748 -0.189755 +0.268196 -0.218714 -0.226562 +0.252109 -0.214264 -0.221034 +0.231966 -0.219863 -0.222417 +0.16439 -0.290409 -0.045741 +0.174232 0.353361 0.161991 +0.167416 0.346038 0.151615 +0.153417 0.351454 0.147309 +0.141711 0.365653 0.160008 +0.174784 0.33351 0.146976 +0.172695 0.32064 0.137876 +0.171538 0.327653 0.122668 +-0.153467 -0.465689 -0.0917447 +-0.142244 -0.458217 -0.0978282 +-0.137315 -0.444624 -0.0945322 +-0.142546 -0.468457 -0.0929801 +-0.130113 -0.470071 -0.0887414 +-0.111868 -0.466578 -0.0912306 +-0.129822 -0.476932 -0.0773011 +-0.116192 -0.47396 -0.0799073 +-0.102072 -0.471199 -0.0816089 +0.0648327 -0.288276 0.006469 +0.290523 -0.14969 0.120852 +0.286341 -0.149084 0.132395 +0.276561 -0.154417 0.131433 +0.266874 -0.144863 0.128327 +0.266123 -0.155511 0.139202 +0.254682 -0.156501 0.14847 +0.243072 -0.144724 0.147014 +0.246658 -0.132891 0.13506 +0.271484 -0.158645 0.148826 +0.262513 -0.161728 0.150556 +0.255383 -0.163883 0.160093 +0.258182 -0.154155 0.170424 +0.247063 -0.165211 0.168804 +0.236375 -0.166699 0.177267 +0.223809 -0.16596 0.182974 +0.219971 -0.167303 0.19665 +0.224247 -0.15536 0.203023 +0.206877 -0.166582 0.198203 +0.201256 -0.167208 0.210293 +0.187949 -0.165778 0.214542 +0.175727 -0.151043 0.207983 +0.205839 -0.156778 0.218275 +0.191606 -0.158183 0.226132 +0.180969 -0.154585 0.235065 +0.170507 -0.150398 0.244702 +0.167678 -0.135398 0.246604 +0.174695 -0.121433 0.234619 +0.192199 -0.123695 0.219574 +0.161002 -0.150315 0.252813 +0.149901 -0.156196 0.25282 +0.145756 -0.15618 0.238445 +0.158231 -0.157867 0.22927 +0.148019 -0.147104 0.261177 +0.14318 -0.132144 0.260892 +0.131504 -0.114456 0.261736 +0.136414 -0.145181 0.266602 +0.124033 -0.152215 0.261533 +0.128756 -0.151616 0.248741 +0.169715 -0.162656 0.235355 +0.125332 -0.145025 0.270918 +0.118124 -0.13431 0.277651 +0.122928 -0.121301 0.271952 +0.113017 -0.148351 0.260498 +0.105868 -0.137752 0.254904 +0.0970603 -0.116879 0.246491 +0.113377 -0.13188 0.244126 +0.102989 -0.14407 0.26402 +0.09993 -0.141861 0.276203 +-0.208269 -0.22401 0.141633 +-0.20692 -0.250284 0.132437 +0.0965268 -0.427234 -0.105996 +0.0991486 -0.439673 -0.0998914 +0.19126 -0.17619 0.0390751 +0.184715 -0.204433 0.0324441 +0.164304 -0.221583 0.0465757 +0.1444 -0.208807 0.0686986 +0.0226172 -0.0147867 0.137076 +-0.142255 -0.49298 -0.0216335 +0.233691 0.0208001 -0.0385404 +-0.192672 -0.315988 0.0839294 +-0.202286 -0.295403 0.104035 +-0.212462 -0.276423 0.111373 +-0.218066 -0.285356 0.0914372 +-0.230517 -0.270625 0.068595 +0.136055 0.0355608 0.0131192 +0.121886 0.0399552 0.0198872 +0.106186 0.0275039 0.0255554 +0.0928691 0.0373146 0.0446539 +0.107832 0.0113031 0.0106037 +0.0853288 0.00897116 0.0135994 +0.0648776 -0.00152148 0.00684991 +0.301901 0.1917 0.196837 +0.304498 0.181718 0.192274 +0.29757 0.171529 0.192207 +0.283611 0.170157 0.190984 +0.17589 0.332048 0.230978 +0.176274 0.318104 0.221305 +0.189786 0.308195 0.22975 +0.199452 0.291101 0.221444 +0.210647 0.278153 0.221165 +0.212403 0.290739 0.232707 +0.229872 0.295702 0.229994 +0.238851 0.283146 0.23072 +0.237981 0.260514 0.227763 +0.248013 0.243086 0.221386 +0.245976 0.271423 0.230129 +0.237201 0.240055 0.208931 +0.239318 0.292509 0.222434 +0.244312 0.28734 0.210021 +0.234086 0.289095 0.199595 +0.221914 0.298769 0.201947 +0.1778 0.322602 0.229777 +0.232474 0.299285 0.221376 +0.223334 0.304746 0.213608 +0.207337 0.311267 0.204764 +0.224642 0.304397 0.226583 +0.214619 0.302742 0.233384 +0.203769 0.313465 0.232857 +0.204968 0.319702 0.218324 +0.201735 0.298965 0.232154 +-0.0492057 -0.0812756 -0.10551 +-0.0710597 -0.075701 -0.12067 +-0.0879497 -0.0905516 -0.13677 +-0.0843511 -0.119489 -0.147588 +-0.0762899 -0.059326 -0.102542 +-0.0985707 -0.0477827 -0.098696 +-0.118275 -0.0536394 -0.113913 +-0.11441 -0.0717159 -0.128365 +0.179503 0.303256 0.0436704 +0.192013 0.290229 0.0290644 +0.17689 0.287515 0.0370015 +0.192038 0.271729 0.0156116 +0.209167 0.267708 0.00969983 +0.200133 0.255704 0.00478026 +-0.247504 -0.392344 -0.224787 +-0.247477 -0.405986 -0.218212 +-0.243099 -0.400741 -0.206484 +-0.246703 -0.405341 -0.193269 +-0.249065 -0.417066 -0.193806 +-0.263856 -0.417281 -0.202583 +-0.253854 -0.410374 -0.185389 +-0.264275 -0.407223 -0.177693 +-0.272044 -0.40206 -0.166216 +-0.284666 -0.409799 -0.163624 +-0.28689 -0.423019 -0.170791 +-0.283285 -0.428723 -0.186577 +-0.301536 -0.424549 -0.197331 +-0.276684 -0.426319 -0.176604 +-0.270204 -0.426002 -0.18843 +-0.267033 -0.421163 -0.178871 +-0.28572 -0.431162 -0.176917 +0.0984334 0.0428629 0.147655 +0.0984512 0.0370662 0.158757 +-0.324734 -0.278381 -0.0492733 +-0.319049 -0.278035 -0.0388895 +-0.314693 -0.271902 -0.0298211 +-0.0814975 -0.486596 -0.0514846 +-0.0716057 -0.47534 -0.0576231 +-0.0807984 -0.475501 -0.0687174 +-0.0782273 -0.46782 -0.0773567 +-0.0794515 -0.454639 -0.076562 +-0.0865219 -0.442019 -0.0638219 +-0.0826697 -0.456554 -0.0896798 +-0.0913604 -0.446861 -0.0969099 +-0.0924184 -0.432044 -0.0753911 +-0.098273 -0.416607 -0.0817744 +-0.111942 -0.395187 -0.0818225 +-0.0923505 -0.401008 -0.0727607 +-0.110463 -0.376831 -0.0757945 +-0.0955645 -0.358515 -0.0727168 +-0.0748788 -0.367775 -0.053732 +-0.099584 -0.336657 -0.0718408 +-0.0617229 -0.346951 -0.0508932 +-0.0372908 -0.340191 -0.0358611 +-0.187209 -0.0514446 0.134371 +-0.172275 -0.062062 0.144345 +-0.181772 -0.0387772 0.12984 +0.27325 0.225257 0.167666 +0.283037 0.221467 0.169903 +0.141164 -0.00931766 -0.150578 +0.223335 -0.262546 -0.149684 +0.199958 -0.258684 -0.141852 +0.218212 -0.249649 -0.131577 +-0.0730224 -0.485274 -0.0383372 +-0.0765985 -0.473674 -0.025717 +-0.0833487 -0.485599 -0.0202509 +-0.0969784 -0.487241 -0.0157338 +-0.106328 -0.475595 -0.0156679 +-0.107519 -0.486132 -0.0147883 +-0.117398 -0.491224 -0.0155421 +-0.11866 -0.497871 -0.0255495 +0.192205 -0.0198585 -0.151725 +0.281772 0.238327 0.210562 +0.269826 0.243309 0.222088 +0.243244 0.207816 -0.00325363 +0.239729 0.221932 -0.000908316 +0.243256 0.225044 0.0142927 +0.235434 0.23543 0.00346349 +0.158954 -0.447934 -0.074517 +0.164 -0.440163 -0.0849532 +0.160645 -0.422992 -0.0839209 +0.160099 -0.41995 -0.0633914 +0.170063 -0.432118 -0.0580684 +0.170775 -0.442201 -0.0470561 +0.167356 -0.452883 -0.036848 +0.157537 -0.464023 -0.0432353 +0.154265 -0.458207 -0.0582632 +0.146921 -0.466798 -0.0291891 +0.17099 -0.445942 -0.0649823 +0.152813 -0.426396 -0.0985179 +0.142833 -0.435406 -0.0989063 +0.126573 -0.436557 -0.100225 +0.120949 -0.42189 -0.103936 +0.130685 -0.411647 -0.0938972 +0.160351 -0.460975 -0.0324222 +0.164884 -0.460693 -0.0398836 +0.167083 -0.430709 -0.0834012 +0.161089 -0.432508 -0.0931652 +0.165433 -0.424956 -0.0749657 +0.155909 -0.417913 -0.0743018 +0.149825 -0.407366 -0.067413 +0.142015 -0.399818 -0.0764637 +0.153043 -0.435416 -0.0966096 +0.148842 -0.431897 -0.101759 +0.145045 -0.424265 -0.10134 +0.147732 -0.418014 -0.0911084 +0.138977 -0.417451 -0.0965307 +0.139635 -0.411036 -0.0878314 +0.14174 -0.430413 -0.104765 +0.134784 -0.434536 -0.101822 +0.135086 -0.440748 -0.0918112 +0.13766 -0.447456 -0.0800542 +0.122938 -0.455334 -0.0698495 +0.127914 -0.428797 -0.106691 +0.135671 -0.430083 -0.106069 +-0.0268041 -0.304928 0.142542 +-0.0182344 -0.281255 0.151927 +0.000262015 -0.258244 0.142866 +0.0151742 -0.229959 0.128466 +-0.00970849 -0.227931 0.154073 +0.0337917 -0.209923 0.115845 +0.0199495 -0.192987 0.125832 +-0.154293 -0.0335699 -0.082135 +-0.129631 -0.0324487 -0.0813475 +-0.120097 -0.027431 -0.0586998 +-0.0956922 -0.0340394 -0.0533561 +-0.0814148 -0.0448428 -0.0722969 +-0.0594432 -0.0515596 -0.0534184 +-0.160793 -0.0482086 -0.0989707 +-0.166155 -0.0307425 -0.0663998 +-0.169924 -0.0270352 -0.0414151 +-0.183311 -0.0375758 -0.0551581 +-0.174206 -0.0274939 -0.0203147 +-0.192353 -0.0397338 -0.00141151 +-0.170447 -0.0249801 0.0063437 +-0.211587 -0.0636911 -0.00501259 +-0.0018753 -0.187141 -0.149775 +0.0183103 -0.182965 -0.142326 +0.0322217 -0.167313 -0.134641 +0.0236675 -0.146992 -0.123167 +-0.00232452 -0.142332 -0.126149 +0.0375806 -0.18533 -0.140019 +0.0530379 -0.201545 -0.137283 +0.0772348 -0.20845 -0.140694 +0.0988175 -0.224384 -0.140468 +0.119251 -0.222512 -0.162731 +0.03788 -0.218276 -0.135529 +0.0772845 -0.19139 -0.155355 +0.080882 -0.225907 -0.127445 +0.0653619 -0.242778 -0.113036 +0.0731805 -0.173068 -0.155239 +0.0897045 -0.191329 -0.166141 +0.102707 -0.199007 -0.171074 +0.119058 -0.208637 -0.176942 +0.127514 -0.196293 -0.185172 +0.13998 -0.205302 -0.190755 +0.149824 -0.215626 -0.194546 +0.161245 -0.221969 -0.199237 +0.175364 -0.230409 -0.20401 +0.173584 -0.215336 -0.204853 +0.178202 -0.198362 -0.197173 +0.188397 -0.22907 -0.211289 +0.202734 -0.22056 -0.215065 +0.199745 -0.239634 -0.214151 +0.0815106 -0.18364 -0.162988 +-0.172104 -0.359269 -0.00938238 +-0.172319 -0.335226 -0.0164663 +-0.16873 -0.368903 -0.0231312 +-0.292266 -0.291505 -0.0889456 +-0.288266 -0.299574 -0.0955502 +-0.280983 -0.308012 -0.105167 +-0.278654 -0.297571 -0.101297 +-0.274336 -0.285615 -0.103446 +-0.260134 -0.28158 -0.0989442 +-0.257005 -0.265144 -0.10215 +-0.26942 -0.305285 -0.10276 +-0.257003 -0.309674 -0.100476 +-0.244993 -0.306014 -0.0938734 +-0.249351 -0.292113 -0.0926885 +-0.25954 -0.322424 -0.104282 +-0.267093 -0.332079 -0.111051 +-0.283312 -0.328944 -0.119574 +-0.249017 -0.331591 -0.10481 +-0.232981 -0.32784 -0.100164 +-0.240291 -0.342062 -0.113719 +-0.229688 -0.345883 -0.126712 +-0.23058 -0.352629 -0.145077 +-0.21352 -0.337371 -0.127344 +-0.269191 -0.344874 -0.117105 +-0.208623 -0.327937 -0.112241 +-0.191793 -0.321843 -0.117022 +-0.180909 -0.311277 -0.104708 +0.11012 0.10505 0.0238496 +0.213679 0.221732 0.163906 +-0.0357839 -0.0025294 0.108473 +-0.0312254 -0.0135193 0.128152 +-0.0238807 -0.033229 0.139313 +-0.00300831 -0.046529 0.144036 +-0.00364169 -0.0760125 0.145155 +-0.0103288 -0.10643 0.141831 +0.015326 -0.129347 0.142131 +-0.041062 -0.0443202 0.130625 +-0.0555252 -0.0465254 0.114753 +-0.0556686 -0.0325657 0.0996413 +-0.0768736 -0.0422105 0.0949058 +-0.0167984 0.000564353 0.123722 +0.00524698 0.0020139 0.129964 +-0.0281137 -0.0861213 0.139333 +-0.0785841 -0.0379469 0.0747431 +-0.0762529 -0.0505618 0.114297 +-0.032521 -0.108383 0.136839 +-0.0633754 -0.0458183 0.101476 +-0.0250298 0.00663901 0.112981 +-0.0219675 0.00393164 0.0935556 +-0.147404 -0.304789 -0.127071 +0.192111 0.473304 0.143665 +0.202701 0.475169 0.131787 +0.206558 0.475874 0.120017 +0.202492 0.480449 0.108775 +0.157654 -0.366957 -0.0205798 +0.26661 -0.307414 -0.281977 +0.270077 -0.295571 -0.288815 +0.283263 -0.291236 -0.297392 +0.290598 -0.279448 -0.297082 +0.304158 -0.276932 -0.29882 +0.315035 -0.2885 -0.301158 +0.307588 -0.298676 -0.297006 +0.297613 -0.307939 -0.283621 +0.293787 -0.301201 -0.295424 +0.318389 -0.297707 -0.296483 +0.328066 -0.301032 -0.289042 +0.324582 -0.309109 -0.276338 +0.33579 -0.291676 -0.2964 +0.346867 -0.288071 -0.287976 +0.353956 -0.299169 -0.28317 +0.345495 -0.307423 -0.274703 +0.352866 -0.288693 -0.277818 +0.351312 -0.284395 -0.265224 +0.355354 -0.294774 -0.257468 +0.360217 -0.304818 -0.260578 +0.35682 -0.308388 -0.269609 +0.359106 -0.312264 -0.252967 +0.356474 -0.316127 -0.245135 +0.351445 -0.319298 -0.237976 +-0.26647 -0.314705 -0.199507 +-0.27426 -0.329739 -0.204261 +-0.290128 -0.337563 -0.206145 +-0.303723 -0.332243 -0.195363 +-0.303858 -0.323407 -0.176279 +-0.302757 -0.349394 -0.210447 +-0.304665 -0.364526 -0.223447 +-0.321319 -0.375627 -0.232938 +-0.285437 -0.371465 -0.224735 +-0.28011 -0.37957 -0.242654 +-0.314609 -0.397575 -0.24523 +-0.31498 -0.344154 -0.199865 +-0.330892 -0.351901 -0.189469 +-0.332902 -0.388937 -0.243068 +-0.348245 -0.402805 -0.233911 +-0.328232 -0.404959 -0.235266 +-0.273541 -0.396265 -0.240028 +-0.293049 -0.39498 -0.245656 +-0.355214 -0.402159 -0.217135 +-0.360108 -0.415844 -0.205721 +-0.346381 -0.42668 -0.201491 +-0.340374 -0.436455 -0.180032 +-0.360217 -0.406031 -0.193698 +-0.356506 -0.391255 -0.182727 +-0.356512 -0.407116 -0.177427 +-0.347384 -0.421732 -0.172779 +-0.348669 -0.37532 -0.17511 +-0.341266 -0.408591 -0.160307 +-0.332592 -0.391247 -0.153464 +-0.323849 -0.407723 -0.153687 +-0.349384 -0.43169 -0.189135 +-0.335815 -0.43119 -0.192046 +-0.324454 -0.435806 -0.181733 +-0.331465 -0.433295 -0.170921 +-0.314528 -0.431132 -0.168412 +-0.260177 -0.397767 -0.235 +-0.252953 -0.401301 -0.227678 +-0.247407 -0.394723 -0.238053 +-0.24372 -0.401046 -0.225417 +-0.243948 -0.396615 -0.216223 +-0.258003 -0.38952 -0.247437 +-0.272162 -0.387844 -0.252537 +-0.287147 -0.384539 -0.255755 +-0.302942 -0.384129 -0.252391 +-0.315505 -0.382766 -0.24459 +-0.323099 -0.390444 -0.249836 +-0.312399 -0.390336 -0.253745 +-0.328503 -0.399215 -0.245058 +-0.340635 -0.398589 -0.24271 +-0.266346 -0.382624 -0.244488 +-0.267321 -0.391914 -0.245578 +-0.0266812 0.0695328 -0.0242573 +-0.00773299 0.0681739 -0.0184911 +0.0122858 0.0669077 -0.0123781 +0.0150035 0.0767227 0.00239352 +0.0141467 0.0954062 -0.00215996 +0.0325338 0.098411 -0.00617133 +0.0450676 0.0983028 0.010086 +0.0314473 0.0730983 0.00401189 +0.0505593 0.0686309 0.00292132 +0.0698817 0.067505 0.00832925 +0.145383 0.180744 0.0984363 +0.132189 0.17376 0.0925198 +0.121241 0.164951 0.0850023 +0.133425 0.169934 0.0774819 +0.11505 0.153676 0.07879 +-0.083942 -0.368893 -0.0674225 +-0.0809876 -0.385027 -0.0581697 +-0.0723248 -0.382058 -0.0416794 +-0.00904893 0.0914446 -0.0120745 +0.00504523 0.0987359 -0.0150796 +0.0060609 0.0932522 -0.034057 +0.0248461 0.0873188 -0.0377031 +0.0363994 0.089055 -0.023789 +0.00213821 0.0914225 -0.00482177 +0.0092558 0.0863088 0.00212053 +0.106375 0.0274106 0.14138 +-0.263884 -0.385451 -0.252252 +0.258755 0.24689 0.225661 +0.259085 0.23306 0.219814 +0.249971 0.25591 0.228242 +-0.322841 -0.345115 -0.164492 +-0.323706 -0.355326 -0.152393 +-0.279169 -0.265328 -0.0439542 +-0.285416 -0.267917 -0.0516616 +-0.294745 -0.263175 -0.0517725 +0.23393 -0.0149701 -0.10397 +0.219738 -0.0165453 -0.112039 +0.204608 -0.00981825 -0.104246 +0.187184 -0.00954937 -0.110855 +0.228145 0.230452 0.102316 +0.214447 0.238029 0.0983297 +0.23229 0.220992 0.0943503 +0.215398 0.247623 0.105271 +0.217938 0.25177 0.117669 +0.210276 0.258003 0.111405 +0.220949 0.241286 0.103103 +0.290344 -0.337843 -0.233955 +0.276226 -0.337233 -0.22831 +0.296573 -0.339782 -0.226215 +0.227663 0.461812 0.0838481 +0.234265 0.455281 0.0718225 +0.229698 0.445794 0.0603386 +0.225781 0.470182 0.0813133 +0.214396 0.4698 0.0788369 +0.208406 0.478123 0.0862021 +0.214031 0.460896 0.0711899 +0.217085 0.451741 0.0628259 +0.219354 0.474333 0.0827819 +0.21619 0.47758 0.0903862 +0.217994 0.472178 0.097233 +0.209525 0.481852 0.0939712 +0.227208 0.456115 0.0633709 +0.234329 0.451682 0.0642008 +0.23166 0.462658 0.0759848 +0.273713 -0.249314 -0.252993 +0.274317 -0.268417 -0.267071 +0.263304 -0.282613 -0.260934 +-0.240326 -0.404033 -0.2139 +-0.241182 -0.408607 -0.207233 +0.243855 0.194683 0.113624 +0.235959 0.206195 0.114609 +-0.329827 -0.30598 -0.098469 +-0.057071 -0.0425853 0.0117122 +-0.0551192 -0.0420888 0.0309046 +-0.0534835 -0.0402863 0.0500454 +-0.0435993 -0.0469165 0.00748095 +-0.0255629 -0.0374196 0.00481763 +-0.00817324 -0.0328811 -0.0061182 +-0.00350439 -0.0437548 -0.0255784 +-0.0349503 -0.0490115 -0.00492533 +-0.0419875 -0.0536475 -0.0293419 +-0.0139014 -0.0607747 -0.0378374 +-0.0105205 -0.0780801 -0.0585195 +-0.0335249 -0.0540562 -0.0180409 +-0.0278411 -0.0595083 -0.0313207 +0.193253 0.49569 0.0858481 +0.189805 0.494474 0.0949255 +0.179559 0.491992 0.0947812 +0.19709 0.487808 0.0978913 +0.174576 0.497081 0.0879734 +0.179584 0.496616 0.0784813 +0.175502 0.48892 0.0725035 +0.169475 0.481635 0.069206 +0.164994 0.474033 0.0669237 +0.155945 0.469227 0.0714265 +0.159639 0.459314 0.0671634 +0.160451 -0.0544036 0.113535 +0.0454737 -0.0938547 0.293886 +0.0481458 -0.104952 0.292926 +0.0550885 -0.114349 0.29062 +0.0654216 -0.120788 0.289843 +0.0691263 -0.126298 0.278339 +0.0372417 -0.0943784 0.286279 +0.0377118 -0.088702 0.274623 +0.179652 -0.262284 0.0054219 +0.186087 -0.244472 0.00347757 +0.246807 -0.00615903 -0.103541 +0.242297 -0.0135206 -0.100916 +0.240802 -0.0172339 -0.108388 +0.232593 -0.0188607 -0.112191 +0.240348 -0.0194541 -0.117278 +0.238974 -0.018297 -0.127651 +-0.164632 -0.397326 -0.024693 +0.0813645 -0.458079 -0.0716845 +0.302397 0.127887 0.0470846 +0.298473 0.138148 0.0455108 +0.292313 0.136477 0.0386335 +0.288054 0.130079 0.0326142 +0.28271 0.137427 0.0379629 +0.271939 0.136706 0.038053 +0.261008 0.14116 0.0404912 +0.28194 0.12422 0.0312108 +0.300876 0.126279 0.0551937 +0.295306 0.129324 0.0632115 +0.286846 0.130603 0.0706512 +0.282604 0.11846 0.0804122 +0.273418 0.134767 0.0747422 +0.296205 0.121995 0.0600976 +0.289869 0.116278 0.0576534 +0.283444 0.108666 0.0679441 +0.208186 0.435058 0.0678801 +0.218992 0.437774 0.0675136 +0.20517 0.444041 0.0615 +0.195457 0.447135 0.0675955 +0.224157 0.438328 0.0597838 +0.221367 0.446069 0.0584788 +0.168291 -0.443724 -0.076199 +-0.239169 -0.248023 -0.0426243 +-0.246509 -0.244281 -0.0523825 +-0.245933 -0.250709 -0.0701381 +-0.252213 -0.23035 -0.0598084 +-0.256922 -0.212794 -0.063622 +-0.26443 -0.20039 -0.048456 +-0.236601 -0.248665 -0.0331221 +-0.248238 -0.244973 -0.04299 +-0.257005 -0.243536 -0.0363368 +-0.264619 -0.253098 -0.0324677 +-0.260909 -0.234911 -0.0387305 +-0.270856 -0.228969 -0.0335016 +-0.268106 -0.214873 -0.0367573 +-0.255525 -0.250409 -0.0291707 +-0.246354 -0.252152 -0.0213798 +-0.25421 -0.258055 -0.0140562 +-0.253371 -0.258976 0.00135493 +-0.263391 -0.256528 0.0180325 +-0.264412 -0.265611 -0.0106557 +-0.268835 -0.263918 0.00476582 +-0.24972 -0.252323 0.0327963 +-0.239732 -0.259608 0.0493553 +-0.242639 -0.251027 0.0706418 +-0.27192 -0.270836 -0.02103 +-0.264888 -0.241199 0.0366373 +-0.279792 -0.22631 0.033251 +-0.274206 -0.207933 0.0474852 +-0.283361 -0.276288 -0.0174295 +-0.267659 -0.226048 0.0482271 +0.202151 0.274483 0.19338 +0.194908 0.283204 0.198963 +-0.157532 -0.273615 -0.179435 +-0.176899 -0.279729 -0.184503 +-0.188947 -0.290942 -0.187096 +-0.192598 -0.3074 -0.18306 +-0.203551 -0.297799 -0.190929 +-0.222085 -0.288246 -0.191352 +-0.217908 -0.303036 -0.194268 +-0.355074 -0.426501 -0.195973 +-0.354866 -0.423993 -0.205337 +-0.355569 -0.419108 -0.214528 +-0.353763 -0.412061 -0.224887 +-0.346029 -0.286085 -0.1062 +-0.341227 -0.288967 -0.0947058 +-0.336277 -0.278132 -0.0971269 +-0.328988 -0.269127 -0.105169 +-0.340297 -0.292656 -0.0831052 +-0.335578 -0.266756 -0.115188 +-0.339311 -0.299368 -0.0917431 +0.212569 0.261061 0.18216 +0.216886 0.255854 0.175009 +0.219484 0.251322 0.162982 +0.212289 0.247584 0.170006 +0.218513 0.26322 0.154269 +0.225667 0.261532 0.178216 +0.218436 0.276817 0.178562 +0.234042 0.273996 0.185236 +0.223426 0.242038 0.154678 +0.21181 0.288948 0.181391 +0.220498 0.257755 0.18435 +0.211254 0.266563 0.187703 +0.211739 0.26954 0.199826 +0.278409 -0.209413 -0.174692 +0.233056 0.457965 0.0658843 +0.227063 0.46182 0.0682472 +0.220168 0.458063 0.0666597 +-0.0481392 -0.0447802 0.0166181 +0.131516 0.0530135 0.000672445 +0.12038 0.0567042 0.000376152 +0.134766 0.046581 0.0097546 +0.0956782 -0.141364 0.26837 +0.0877085 -0.13595 0.269242 +0.0854698 -0.124959 0.261926 +0.0839071 -0.111836 0.253439 +0.0904091 -0.099649 0.239147 +0.0872053 -0.136949 0.279095 +0.085161 -0.130401 0.287023 +0.0763801 -0.13103 0.282851 +-0.00884361 -0.0890856 -0.0728998 +-0.00654069 -0.102279 -0.0895079 +-0.0290648 -0.104665 -0.111248 +-0.0100257 -0.116287 -0.107029 +0.0875054 -0.104584 0.297054 +0.191386 -0.264049 -0.175252 +0.190045 -0.262732 -0.156889 +0.204589 -0.269071 -0.178679 +0.222111 -0.273266 -0.172895 +0.189235 0.0753918 -0.0129238 +0.0782752 -0.467624 -0.0498343 +0.0759673 -0.46177 -0.0555898 +0.0772195 -0.460605 -0.0642783 +0.151932 0.323656 0.079912 +0.153175 0.313215 0.0881136 +0.161272 0.302381 0.0857396 +0.163146 0.324848 0.0718597 +0.151557 0.334415 0.0880604 +0.142886 0.334889 0.0972586 +0.140662 0.34411 0.107021 +0.133598 0.347717 0.117582 +0.131314 0.355467 0.129074 +0.127988 0.361743 0.142546 +0.123763 0.348981 0.138438 +0.119822 0.353337 0.149718 +0.116288 0.351928 0.168204 +0.226419 0.174912 -0.00671405 +0.232006 0.15884 0.00199041 +0.243933 0.169091 0.00253819 +0.237571 0.172786 -0.00612936 +0.183717 0.142245 0.147062 +0.183533 0.157982 0.153224 +0.200684 0.169917 0.154336 +0.175927 0.14817 0.154877 +0.164064 0.143191 0.159694 +0.181391 0.132744 0.149775 +0.177453 0.123521 0.157312 +0.108424 0.0602759 0.0311611 +0.101691 0.0511896 0.042029 +0.297187 0.12858 0.124591 +0.286869 0.125817 0.115842 +0.279264 0.13651 0.11071 +0.277464 0.150893 0.114839 +0.267972 0.163015 0.116989 +0.29066 -0.215317 -0.195858 +-0.0439761 -0.143405 -0.149346 +0.0959309 0.0199379 0.158053 +0.0941358 0.00844127 0.16726 +0.273991 -0.158318 0.138404 +0.280108 -0.155995 0.136908 +0.28311 -0.154668 0.131232 +0.287165 -0.152142 0.126309 +0.291082 -0.145525 0.127381 +0.258354 -0.329753 -0.2515 +0.256649 -0.327468 -0.240856 +0.265642 -0.321399 -0.233195 +0.269005 -0.32965 -0.227653 +0.204877 0.287044 0.0357487 +0.289139 -0.339472 -0.226774 +0.282728 -0.335989 -0.224475 +0.283065 -0.327384 -0.221193 +0.28398 -0.316486 -0.219293 +0.289461 -0.305296 -0.210924 +0.2738 -0.310998 -0.221733 +0.2646 -0.301502 -0.221281 +0.282981 -0.339471 -0.231684 +0.275544 -0.336339 -0.239462 +0.259131 -0.2954 -0.232139 +0.281853 -0.296955 -0.202405 +0.287258 -0.287693 -0.192682 +0.301236 -0.282638 -0.194913 +0.23745 0.0270265 -0.0333549 +0.234865 0.0358956 -0.0292661 +0.240774 0.0243245 -0.0402136 +0.034599 -0.0884904 0.28182 +0.0345637 -0.0787252 0.277243 +0.0422003 -0.0728232 0.283477 +0.048607 -0.0763619 0.292696 +0.0395236 -0.0802562 0.266836 +0.0486856 -0.0788086 0.257578 +0.044992 -0.0647291 0.254151 +0.0587204 -0.0731238 0.296598 +0.068389 -0.0812067 0.300077 +0.0829644 -0.0808872 0.290453 +0.0435251 -0.0559756 0.262078 +0.20354 0.276522 0.016541 +-0.0980428 -0.240155 0.197738 +-0.0924965 -0.26196 0.186819 +-0.109853 -0.270124 0.168775 +-0.253582 -0.386742 -0.238773 +-0.0267016 0.0982672 -0.0374627 +0.214024 0.433945 0.0622105 +0.204736 0.432758 0.058829 +0.201109 0.433103 0.0655996 +0.201809 0.436011 0.073894 +0.193477 0.433855 0.0682907 +0.185218 0.436354 0.0703184 +0.180836 0.436291 0.0819631 +0.191166 0.440882 0.0659291 +0.187348 0.447071 0.070626 +0.179215 0.453739 0.0726364 +0.193028 0.454826 0.0736221 +0.173421 0.440644 0.0776765 +-0.147031 -0.496444 -0.028386 +-0.151597 -0.495421 -0.0374969 +-0.157627 -0.484775 -0.0397619 +-0.140246 -0.499465 -0.0256815 +-0.132401 -0.5 -0.0296698 +-0.132703 -0.497498 -0.0384881 +-0.126331 -0.494492 -0.0452588 +-0.11646 -0.490117 -0.0524448 +-0.101295 -0.487303 -0.0547567 +-0.136101 -0.494007 -0.0471871 +-0.13938 -0.490039 -0.0561432 +-0.133381 -0.483866 -0.0661423 +-0.15577 -0.492035 -0.0446482 +-0.153261 -0.490282 -0.0555144 +0.197755 0.272342 0.0690149 +0.190382 0.263313 0.0560052 +0.0686632 -0.292912 -0.0237205 +0.056243 -0.29127 -0.0303266 +0.0398126 -0.298058 -0.030698 +0.0315681 -0.295788 -0.0489563 +0.043708 -0.285681 -0.061727 +0.0621136 -0.289132 -0.040881 +0.0722108 -0.295077 -0.0484755 +0.0577034 -0.286988 -0.0524253 +0.0569935 -0.281989 -0.0659264 +0.064236 -0.290328 -0.0328163 +-0.0127838 0.0757233 -0.00921143 +0.0935192 0.0772038 0.0642915 +0.169714 0.302879 0.0497006 +0.163659 0.300165 0.0640716 +0.172929 0.295611 0.0434924 +0.049865 0.0913802 0.0221499 +0.0418831 0.0808731 0.013212 +0.0368549 0.0913191 0.0145569 +0.0319565 0.0968433 0.00544037 +0.310435 0.13526 0.142507 +0.026474 0.0305763 -0.129196 +0.017822 0.0292426 -0.122273 +0.0163904 0.0280919 -0.108702 +0.0350495 0.0278097 -0.132911 +0.178361 0.286185 0.0866978 +0.184473 0.288229 0.0959947 +0.0746028 -0.0119842 0.202652 +0.0770488 -0.00198153 0.201878 +0.0861829 0.00359659 0.206228 +0.0964676 0.00912576 0.20305 +0.110414 0.00821695 0.200752 +0.119478 0.0159283 0.18886 +-0.0749585 -0.470198 -0.0703816 +-0.0722579 -0.469101 -0.0627931 +-0.0775597 -0.45771 -0.0519849 +-0.0725204 -0.466379 -0.0530837 +-0.0822617 -0.458336 -0.0360309 +0.11796 -0.00196684 -0.151498 +0.110489 0.008862 -0.155734 +0.119387 0.0273131 -0.141295 +0.100036 0.00317869 -0.149099 +0.0946498 0.00360487 -0.130289 +0.0996271 0.00897841 -0.108462 +0.0876406 0.00969553 -0.149119 +0.0889673 0.0239205 -0.144401 +0.103773 0.0275171 -0.140968 +0.112143 0.0407687 -0.122665 +0.128275 -0.00210722 -0.155193 +0.136944 0.00690927 -0.158099 +0.1315 0.01712 -0.150046 +0.148823 0.0111196 -0.154092 +0.137878 -0.00286061 -0.157253 +0.0812501 0.0180999 -0.148671 +0.0723702 0.0199576 -0.146504 +0.0894465 0.0177562 -0.14994 +-0.244247 -0.411744 -0.197734 +0.0532101 -0.0425986 0.239458 +0.0614299 -0.034607 0.250277 +0.0718515 -0.0264935 0.244569 +0.0612036 -0.0408317 0.227838 +0.211416 0.21985 0.0506815 +0.209629 0.209187 0.0516229 +0.197715 0.200596 0.0531448 +0.210711 0.212673 0.041983 +0.209533 0.205981 0.0261421 +0.207685 0.214484 0.0320655 +0.204793 0.215907 0.019768 +0.207322 0.190012 0.0316877 +0.210424 0.206724 0.0353988 +0.209086 0.197885 0.0355421 +0.19948 0.191764 0.0420701 +0.206287 0.1798 0.0239909 +0.199532 0.162119 0.0159658 +0.0889829 0.0153312 0.187549 +0.0895058 0.0194699 0.175832 +0.0997882 0.0258376 0.180178 +0.0912633 -0.43583 -0.104962 +0.0893849 -0.44209 -0.0966632 +0.0818551 -0.438899 -0.0891003 +0.0775492 -0.435915 -0.0759439 +0.0805228 -0.426773 -0.087989 +0.0848008 -0.421093 -0.0971385 +0.0844397 -0.410175 -0.0930928 +0.0796444 -0.399052 -0.082153 +0.096306 -0.399151 -0.0928503 +0.0992866 -0.434977 -0.10667 +-0.038871 -0.095203 0.134909 +-0.0453136 -0.074362 0.132403 +-0.0642973 -0.0816285 0.135216 +0.128958 0.371237 0.164377 +0.114324 0.368213 0.169385 +0.110394 0.358489 0.182698 +0.119359 0.382173 0.172221 +0.244566 0.0274799 0.091132 +0.236517 0.0321023 0.108593 +0.228129 0.0154777 0.110489 +0.243652 -0.0044318 0.106704 +0.215089 0.0116198 0.126655 +0.193164 -0.00203925 0.149761 +0.295901 -0.145148 0.11649 +0.181002 0.326878 0.162405 +0.192626 0.308402 0.164847 +0.180295 0.335983 0.171005 +0.215019 0.222685 -0.0085752 +0.216226 0.238327 -0.00679645 +0.204842 0.243639 -0.00108745 +0.197086 0.237151 0.00943393 +0.207737 0.21475 -0.00125832 +0.200663 0.225332 0.00994825 +0.227239 0.239308 -0.00361834 +0.210369 0.205349 -0.000451507 +0.212421 0.195338 0.00658041 +0.0965367 0.0723068 0.0490018 +-0.263237 -0.382248 -0.20077 +-0.334935 -0.395374 -0.246716 +0.0666968 0.0983382 0.0352739 +0.0735768 0.104043 0.0256427 +0.0854137 0.105714 0.0280147 +0.0966684 0.103408 0.0197312 +-0.293219 -0.246559 0.00868918 +-0.284829 -0.260543 0.00656712 +0.231694 -0.239358 -0.229883 +0.249173 -0.248287 -0.23972 +-0.313753 -0.278534 -0.156686 +-0.167921 -0.0222432 0.100354 +-0.166557 -0.0217484 0.0804222 +-0.137191 -0.0189498 0.0544508 +-0.183157 -0.0297007 0.0652393 +-0.193717 -0.0386652 0.0428719 +-0.162262 -0.0205653 0.0563587 +-0.148465 -0.0201145 0.071316 +-0.122512 -0.0229086 0.0762312 +-0.112808 -0.0225311 0.0535636 +-0.15755 -0.0225071 0.112728 +-0.13968 -0.0242143 0.109228 +-0.128528 -0.0323847 0.121144 +-0.137944 -0.0426964 0.133983 +0.338353 -0.331842 -0.233 +0.197716 0.0369013 -0.0158252 +0.225598 0.0269623 0.107608 +0.227611 0.0352699 0.116368 +0.216481 0.0416846 0.126455 +0.20366 0.0291575 0.127785 +0.197706 0.0139181 0.138946 +0.177004 0.0154396 0.15063 +0.196436 0.0406475 0.130552 +0.183582 0.0465791 0.137895 +0.171962 0.0340634 0.144092 +0.209838 0.0350513 0.1214 +0.122018 -0.0147207 0.202688 +0.134625 -0.010294 0.190699 +0.150345 -0.0204184 0.190322 +0.171467 -0.0443352 0.191435 +0.124137 -0.0275222 0.21069 +0.115004 -0.0324307 0.220668 +0.103488 -0.0235525 0.230568 +-0.234966 -0.250492 -0.00657503 +0.230136 -0.0629922 0.010065 +0.22781 -0.0439028 0.0052695 +0.226758 -0.0758146 -0.00318988 +0.218119 -0.0755566 -0.0185995 +0.210925 -0.0881128 -0.0299059 +0.195391 -0.0835698 -0.0397083 +0.187049 -0.0970928 -0.0513544 +0.215909 -0.10623 -0.0275177 +0.221663 -0.111792 -0.00835326 +0.21689 -0.135734 -0.006698 +0.187289 -0.0668273 -0.0361071 +0.170089 -0.0549841 -0.0384156 +0.158135 -0.0292105 -0.0224101 +0.144698 -0.0631652 -0.0561794 +0.210349 -0.156804 0.00619425 +0.122465 -0.0210506 -0.020971 +0.25102 0.0827579 -0.00901225 +0.246076 0.0717907 -0.00732438 +0.248146 0.0653429 0.00439784 +0.245544 0.0538898 0.0151974 +0.255748 0.0868229 -0.000826293 +-0.125725 -0.258433 -0.170214 +0.151089 -0.0268375 0.140451 +0.244155 0.0131187 -0.0533056 +0.246127 0.0105937 -0.0612737 +0.239403 0.00492409 -0.0645919 +0.228547 -0.00190445 -0.0800819 +0.236042 0.000460551 -0.073323 +0.244455 -0.00400961 -0.0816292 +0.225173 0.00380285 -0.0703884 +0.247885 -0.00234363 -0.0902777 +0.247838 0.00379159 -0.0839495 +0.243353 0.0148187 -0.0838177 +0.236031 0.0244971 -0.0791546 +0.225616 0.0291453 -0.0875646 +-0.29518 -0.390079 -0.254006 +-0.303646 -0.394416 -0.248506 +-0.302477 -0.403327 -0.233435 +-0.298023 -0.412267 -0.217588 +-0.29425 -0.38151 -0.250683 +-0.302074 -0.390767 -0.254186 +0.191342 0.435898 0.0636941 +-0.0964353 -0.460913 -0.0144457 +0.137532 -0.0116873 0.139128 +0.343547 -0.294973 -0.292923 +0.137424 0.0947211 0.0118894 +0.147115 0.0902563 -0.00271409 +0.147874 0.0802052 -0.0226835 +0.255027 -0.310713 -0.257667 +0.257498 -0.300887 -0.266482 +0.220835 -0.0105204 -0.15317 +0.210403 -0.014095 -0.156518 +0.204562 -0.0228168 -0.148776 +-0.117774 -0.20207 0.202016 +3 575 1215 1225 +3 902 137 1166 +3 2122 17 2125 +3 1333 1332 328 +3 1031 1037 1032 +3 1235 1234 736 +3 986 1231 182 +3 532 534 185 +3 534 448 185 +3 1588 1570 1587 +3 674 675 639 +3 1130 1225 242 +3 279 6 280 +3 6 283 280 +3 621 954 955 +3 235 273 275 +3 2565 1747 2566 +3 2225 2224 2223 +3 11 206 278 +3 922 93 2080 +3 530 2723 2724 +3 2144 2146 2139 +3 1374 1376 766 +3 1361 1374 766 +3 1775 525 1893 +3 2626 1649 2625 +3 2338 2265 2339 +3 992 96 990 +3 103 21 104 +3 1681 1682 31 +3 1686 1682 1681 +3 2064 2065 295 +3 747 748 464 +3 597 1084 1086 +3 1003 2191 2190 +3 2184 1003 2190 +3 214 38 215 +3 2202 2205 473 +3 2725 257 2728 +3 216 554 944 +3 554 553 944 +3 1457 1456 445 +3 986 2154 96 +3 458 1022 1021 +3 961 1949 2534 +3 625 1514 1515 +3 1786 1791 518 +3 1586 2773 2006 +3 52 1485 1486 +3 2101 52 1486 +3 2368 2374 1380 +3 2054 1499 74 +3 329 326 1762 +3 933 934 176 +3 527 569 705 +3 2004 247 2003 +3 414 1966 1967 +3 853 544 184 +3 1136 354 352 +3 1896 1895 134 +3 5 978 1108 +3 1344 1342 726 +3 80 27 1599 +3 1489 1683 175 +3 1952 1953 2619 +3 21 105 104 +3 21 103 29 +3 2180 959 1164 +3 288 2180 1164 +3 294 1940 1941 +3 1263 1865 443 +3 1755 1756 337 +3 696 1187 1185 +3 1186 696 1185 +3 1489 66 1683 +3 68 907 122 +3 260 1748 341 +3 1340 1341 451 +3 806 397 478 +3 1337 750 728 +3 1516 419 1515 +3 279 11 278 +3 277 279 278 +3 226 2120 2119 +3 258 259 76 +3 686 683 719 +3 1232 950 1230 +3 1597 1598 1978 +3 91 2073 977 +3 724 734 1233 +3 724 732 734 +3 47 281 280 +3 85 1982 2246 +3 207 154 64 +3 2000 1998 1999 +3 553 853 184 +3 76 261 1618 +3 259 261 76 +3 682 706 1504 +3 660 706 682 +3 296 17 297 +3 17 2122 297 +3 554 216 916 +3 381 383 382 +3 271 269 296 +3 269 17 296 +3 1082 656 1823 +3 115 199 196 +3 1056 1049 880 +3 1520 2574 2248 +3 212 550 238 +3 1980 1598 27 +3 364 72 365 +3 674 657 673 +3 82 168 158 +3 1133 641 1171 +3 440 1406 1411 +3 804 803 398 +3 178 2662 461 +3 159 2100 157 +3 1657 1659 1658 +3 1659 1280 1658 +3 1499 141 1498 +3 2144 2137 2146 +3 358 2137 2144 +3 567 534 531 +3 64 264 274 +3 137 365 380 +3 379 137 380 +3 117 903 902 +3 377 376 136 +3 88 2566 2567 +3 83 1299 1306 +3 1819 692 1822 +3 1642 584 710 +3 645 602 1808 +3 503 500 502 +3 1855 1263 54 +3 1706 1580 517 +3 1169 1069 1068 +3 42 1825 1828 +3 21 67 106 +3 81 80 84 +3 20 105 118 +3 20 156 105 +3 67 21 256 +3 1015 258 1016 +3 259 258 65 +3 649 890 1665 +3 2021 116 2020 +3 1146 402 1147 +3 126 1615 1618 +3 164 1894 163 +3 120 164 163 +3 2774 378 377 +3 1796 1893 525 +3 510 511 413 +3 1143 754 305 +3 1257 1024 1260 +3 866 1816 1815 +3 2685 1816 866 +3 574 1222 1221 +3 1673 1038 1672 +3 158 168 51 +3 793 1560 1561 +3 750 730 465 +3 729 730 750 +3 996 998 61 +3 280 281 11 +3 919 93 918 +3 590 2300 1322 +3 1305 1478 1482 +3 68 122 118 +3 238 537 555 +3 138 365 903 +3 1536 1562 1535 +3 264 1720 268 +3 2079 2080 93 +3 6 273 283 +3 2554 63 246 +3 236 317 319 +3 40 84 80 +3 84 40 104 +3 778 1357 1356 +3 1359 778 1356 +3 170 263 265 +3 1986 170 265 +3 21 106 105 +3 944 183 1740 +3 944 945 183 +3 1894 164 165 +3 67 249 106 +3 283 235 47 +3 63 2005 246 +3 314 235 275 +3 435 436 188 +3 1746 1747 345 +3 1161 2431 2432 +3 2459 594 1102 +3 1484 1305 1482 +3 2 1136 1137 +3 1062 2510 2511 +3 1811 219 1809 +3 1736 997 1732 +3 264 268 274 +3 439 1427 1247 +3 526 2722 530 +3 2722 2721 530 +3 118 105 106 +3 164 120 121 +3 71 131 165 +3 63 247 2005 +3 1894 165 1895 +3 2054 2052 2053 +3 2285 2432 2286 +3 254 106 249 +3 254 68 106 +3 685 661 670 +3 1498 75 2135 +3 989 180 991 +3 263 24 265 +3 2021 2020 932 +3 1724 170 1487 +3 124 1016 76 +3 277 278 64 +3 431 151 430 +3 2225 2757 2189 +3 818 407 478 +3 1499 237 74 +3 1994 1576 2611 +3 2697 904 897 +3 904 899 897 +3 377 378 135 +3 132 72 364 +3 282 109 293 +3 109 282 319 +3 224 83 1306 +3 74 381 376 +3 2054 2053 141 +3 2226 2678 2224 +3 1134 1438 1437 +3 412 814 813 +3 2624 1641 709 +3 126 1618 261 +3 999 34 991 +3 899 1991 1989 +3 98 1315 275 +3 928 1767 931 +3 144 2131 2136 +3 23 234 78 +3 603 800 707 +3 337 1490 332 +3 1490 1491 332 +3 1348 1341 727 +3 1591 16 1590 +3 547 92 549 +3 2194 2226 2189 +3 2236 2582 2581 +3 378 72 135 +3 1796 1784 1893 +3 278 206 207 +3 170 82 1487 +3 265 24 266 +3 308 153 943 +3 310 308 943 +3 569 565 177 +3 267 1987 1502 +3 236 316 317 +3 1895 165 134 +3 1898 2388 1479 +3 163 159 120 +3 1464 1468 1463 +3 756 903 117 +3 138 903 756 +3 951 1231 986 +3 987 951 986 +3 2670 700 2672 +3 445 187 446 +3 1722 154 910 +3 256 21 29 +3 84 168 81 +3 1283 2386 2684 +3 2736 79 852 +3 146 363 2143 +3 1323 1324 2271 +3 68 118 106 +3 1043 1038 1673 +3 2773 1585 1705 +3 1231 1232 1230 +3 1337 729 750 +3 922 917 93 +3 825 395 824 +3 510 389 511 +3 763 1188 2128 +3 833 831 487 +3 560 1355 179 +3 560 1354 1355 +3 899 904 1991 +3 639 1133 1138 +3 674 639 1138 +3 1250 1243 1254 +3 2715 2714 1433 +3 502 499 503 +3 1690 1213 1212 +3 1342 451 1341 +3 1397 1025 443 +3 929 928 930 +3 1855 1854 1262 +3 1854 1857 1262 +3 2733 2736 241 +3 1001 987 993 +3 2662 2708 191 +3 1470 2764 1459 +3 264 1717 1720 +3 264 1718 1717 +3 346 330 1139 +3 1137 1136 353 +3 1514 557 1515 +3 2045 115 2026 +3 143 1494 1495 +3 1487 1713 1724 +3 211 974 975 +3 319 318 109 +3 319 317 318 +3 2081 2077 209 +3 1015 123 258 +3 207 59 910 +3 1770 241 848 +3 857 222 1810 +3 546 857 1810 +3 87 343 1750 +3 621 915 622 +3 393 803 806 +3 977 976 975 +3 2016 992 934 +3 992 176 934 +3 1794 2744 2745 +3 278 207 64 +3 524 1692 1691 +3 2772 1702 2771 +3 1702 2772 1586 +3 1107 1105 1106 +3 190 2593 2594 +3 802 393 586 +3 1777 1783 1793 +3 476 816 390 +3 2159 1049 1048 +3 516 515 1576 +3 321 2057 2063 +3 476 477 509 +3 1180 773 1181 +3 553 184 945 +3 1227 1228 949 +3 1892 255 101 +3 1919 600 2258 +3 124 1014 1015 +3 273 98 275 +3 225 1612 1613 +3 48 313 314 +3 539 2728 2729 +3 2728 539 538 +3 1897 1896 468 +3 1810 1809 980 +3 794 2238 2237 +3 307 39 311 +3 39 307 320 +3 1531 1533 1538 +3 1583 1702 1582 +3 410 954 621 +3 2519 2333 2332 +3 541 854 855 +3 459 439 1249 +3 529 1511 2740 +3 1259 450 1258 +3 1677 2170 2175 +3 509 389 510 +3 1704 1703 1707 +3 1703 1583 1707 +3 1644 1645 584 +3 463 562 2660 +3 175 929 930 +3 262 1756 1755 +3 1756 262 1757 +3 380 72 378 +3 365 72 380 +3 128 2247 1985 +3 2532 135 2533 +3 128 1985 1987 +3 1121 2187 288 +3 891 1663 1377 +3 135 132 2533 +3 76 1016 258 +3 117 902 901 +3 132 135 72 +3 908 139 909 +3 125 76 1618 +3 76 125 124 +3 737 736 745 +3 30 541 543 +3 30 540 541 +3 395 826 824 +3 260 1751 1749 +3 341 1746 1753 +3 173 553 554 +3 1141 331 1139 +3 1756 1490 337 +3 2668 2667 700 +3 1751 1752 259 +3 230 1380 2377 +3 281 282 12 +3 2137 2138 2146 +3 1689 1852 1850 +3 588 1697 1083 +3 1069 1169 641 +3 1149 424 1088 +3 11 279 280 +3 919 1331 213 +3 1626 715 3 +3 2374 2368 2367 +3 178 2661 2707 +3 2094 2093 2092 +3 320 318 39 +3 318 317 39 +3 754 14 755 +3 6 272 273 +3 2172 1047 1051 +3 1058 2163 2162 +3 237 1499 142 +3 1799 523 1518 +3 591 695 781 +3 696 695 2128 +3 234 23 430 +3 800 720 683 +3 236 282 47 +3 235 236 47 +3 23 1162 2312 +3 2192 2678 2227 +3 2681 2680 832 +3 236 319 282 +3 817 390 808 +3 509 510 476 +3 1661 1474 492 +3 1278 1659 1657 +3 191 2715 2716 +3 1138 1133 1171 +3 835 840 412 +3 840 1184 412 +3 1898 1897 468 +3 138 756 754 +3 22 2069 300 +3 309 755 1018 +3 1651 586 589 +3 1147 1651 589 +3 1771 2733 241 +3 2733 1771 522 +3 379 380 378 +3 1749 1751 65 +3 1729 1728 197 +3 2092 2093 970 +3 300 2069 2068 +3 903 137 902 +3 25 332 1002 +3 236 235 315 +3 1162 78 1027 +3 1163 318 320 +3 147 429 801 +3 360 359 302 +3 2285 1172 3 +3 637 669 677 +3 754 1143 14 +3 2706 2709 418 +3 1213 575 574 +3 1215 575 1213 +3 2186 2223 2192 +3 2364 718 2365 +3 535 184 544 +3 610 1197 394 +3 1401 2331 2444 +3 839 149 837 +3 956 149 839 +3 181 330 347 +3 674 1138 657 +3 340 326 329 +3 1430 1415 1635 +3 2664 1822 692 +3 173 554 924 +3 944 553 945 +3 535 544 533 +3 1740 216 944 +3 334 90 336 +3 2475 783 2480 +3 927 1767 929 +3 1267 310 943 +3 2479 952 783 +3 1144 592 1146 +3 929 175 927 +3 323 1731 1730 +3 2280 2292 2430 +3 1811 1813 1812 +3 1733 1735 2570 +3 222 857 858 +3 346 1139 1760 +3 809 808 390 +3 292 1073 1072 +3 1113 1959 1962 +3 1765 1764 1116 +3 2285 2286 1172 +3 1961 1012 287 +3 1754 77 1752 +3 509 820 844 +3 417 839 2710 +3 1260 1024 1252 +3 1463 1468 483 +3 2734 2732 537 +3 568 742 734 +3 2060 2059 298 +3 187 1137 353 +3 1438 1414 441 +3 469 133 753 +3 901 902 360 +3 902 1166 360 +3 592 1144 811 +3 151 234 430 +3 2321 715 2322 +3 1648 1643 1642 +3 498 786 2606 +3 1501 2696 146 +3 2699 145 898 +3 373 1970 1273 +3 1229 985 182 +3 384 237 142 +3 1025 1263 443 +3 1273 1275 1282 +3 900 1989 1193 +3 381 237 383 +3 839 837 415 +3 755 753 754 +3 138 754 753 +3 2719 437 1701 +3 789 1562 1536 +3 2604 2607 1573 +3 820 509 477 +3 780 2484 2485 +3 1184 840 416 +3 2717 1433 2713 +3 437 2717 2713 +3 1216 1219 1217 +3 394 1195 612 +3 238 550 551 +3 1206 529 1207 +3 1442 1472 2637 +3 1472 190 2637 +3 1778 1794 2745 +3 1082 1078 656 +3 1709 2266 2265 +3 498 497 1 +3 1235 735 1234 +3 526 527 705 +3 624 620 558 +3 393 589 586 +3 2128 1188 696 +3 501 497 498 +3 616 1204 1205 +3 825 514 798 +3 293 2063 294 +3 215 343 87 +3 853 854 544 +3 854 853 542 +3 2769 1060 1129 +3 212 547 548 +3 121 479 119 +3 784 620 411 +3 1320 610 1321 +3 419 618 624 +3 1518 2740 528 +3 410 953 954 +3 957 2709 2705 +3 1662 1470 1661 +3 619 2484 1174 +3 2672 708 2670 +3 893 771 887 +3 1418 2622 1700 +3 2306 2307 428 +3 1348 1342 1341 +3 527 528 1355 +3 455 436 454 +3 1704 1705 1585 +3 1703 1704 1585 +3 1900 848 1901 +3 1259 1257 455 +3 401 1323 1646 +3 422 2250 1553 +3 2250 422 1524 +3 668 666 671 +3 1469 482 481 +3 1449 1662 1661 +3 622 912 410 +3 844 2681 832 +3 454 1630 453 +3 463 748 747 +3 467 1433 2717 +3 735 1021 733 +3 909 2051 140 +3 1216 524 1219 +3 840 956 416 +3 408 811 1144 +3 739 740 738 +3 449 446 447 +3 2731 536 2726 +3 576 1223 1221 +3 461 2716 192 +3 598 2665 2664 +3 1144 1146 589 +3 627 1392 1393 +3 569 177 705 +3 1390 1391 651 +3 1799 1518 240 +3 1089 606 626 +3 1776 1220 523 +3 462 461 192 +3 1505 561 560 +3 192 459 456 +3 701 581 704 +3 673 676 636 +3 1022 1349 480 +3 2722 177 2721 +3 462 178 461 +3 611 1358 1357 +3 625 624 558 +3 2322 1621 2321 +3 1630 1460 386 +3 2727 537 2726 +3 748 178 462 +3 480 733 1021 +3 983 1543 1545 +3 531 534 532 +3 778 611 1357 +3 2607 2604 2605 +3 1463 485 148 +3 567 565 566 +3 748 462 464 +3 412 816 834 +3 743 746 464 +3 566 534 567 +3 606 663 1808 +3 1770 1771 241 +3 834 835 412 +3 420 798 514 +3 1454 1662 1449 +3 2306 428 2309 +3 763 2128 591 +3 625 558 1513 +3 477 476 390 +3 817 477 390 +3 1526 1523 1528 +3 1562 1521 791 +3 551 46 552 +3 700 2670 2669 +3 497 501 518 +3 790 1562 1552 +3 1212 574 1214 +3 1588 1587 1571 +3 2736 849 241 +3 2039 2024 2038 +3 123 128 258 +3 128 123 965 +3 1726 1727 582 +3 550 46 551 +3 274 2742 64 +3 1779 1781 2755 +3 1781 1782 2755 +3 503 506 500 +3 709 1641 581 +3 1563 1589 1587 +3 505 498 515 +3 2238 2239 392 +3 807 2243 2241 +3 818 477 817 +3 1589 1565 507 +3 1736 325 1737 +3 1530 1531 1525 +3 872 1052 1051 +3 1800 2753 2752 +3 534 186 448 +3 603 1069 721 +3 2665 653 687 +3 1513 559 1512 +3 1782 520 571 +3 2473 1727 399 +3 2748 2750 2747 +3 240 1773 1799 +3 1773 1774 1799 +3 753 752 138 +3 1 497 851 +3 1070 627 1393 +3 1071 627 1070 +3 744 743 464 +3 803 397 806 +3 1086 1084 1085 +3 402 1086 1085 +3 1020 458 1021 +3 854 540 544 +3 540 533 544 +3 811 810 174 +3 729 562 563 +3 1351 562 729 +3 731 749 568 +3 749 746 568 +3 1338 564 1350 +3 1337 1338 1350 +3 455 1257 54 +3 1198 2486 426 +3 817 2244 818 +3 239 530 536 +3 242 1225 1216 +3 1582 499 938 +3 50 737 745 +3 735 724 1234 +3 540 539 533 +3 539 540 30 +3 901 1990 900 +3 223 541 855 +3 541 540 854 +3 715 1620 3 +3 212 548 550 +3 545 543 541 +3 223 545 541 +3 2456 2455 1680 +3 545 546 547 +3 223 546 545 +3 1163 110 2066 +3 212 545 547 +3 945 946 183 +3 549 548 547 +3 2748 2747 2749 +3 217 917 920 +3 173 924 925 +3 855 542 856 +3 855 854 542 +3 46 203 552 +3 1081 95 662 +3 173 542 553 +3 149 956 840 +3 1505 560 1507 +3 742 50 745 +3 2749 1710 2751 +3 561 562 452 +3 179 1509 1508 +3 1507 560 179 +3 2574 150 2248 +3 665 638 693 +3 571 1778 2754 +3 727 751 480 +3 705 177 2722 +3 885 882 765 +3 177 565 567 +3 402 1326 587 +3 556 1516 1509 +3 1690 1691 1213 +3 742 745 734 +3 725 1235 736 +3 1374 769 1375 +3 1361 769 1374 +3 1343 566 565 +3 451 1343 565 +3 707 1066 603 +3 707 632 1066 +3 1076 656 1078 +3 584 1643 1644 +3 705 2722 526 +3 1326 402 1085 +3 1148 1086 402 +3 598 652 2665 +3 2636 2635 577 +3 773 611 914 +3 611 773 772 +3 914 622 915 +3 1925 1924 757 +3 680 697 605 +3 663 646 645 +3 732 724 733 +3 833 490 831 +3 677 669 636 +3 618 617 1182 +3 617 618 419 +3 844 490 509 +3 697 680 635 +3 566 713 186 +3 1070 595 1071 +3 1825 107 57 +3 814 409 813 +3 636 672 673 +3 2349 2348 1203 +3 900 117 901 +3 1206 573 1205 +3 658 679 675 +3 2653 1821 596 +3 410 621 622 +3 2738 2737 1207 +3 649 1665 891 +3 620 0 621 +3 680 678 635 +3 674 658 675 +3 598 2664 2666 +3 1807 602 1806 +3 698 710 584 +3 710 698 1096 +3 395 798 828 +3 1365 1372 1364 +3 1371 1372 1365 +3 409 2479 827 +3 1321 610 609 +3 1151 616 1223 +3 2177 2176 1044 +3 0 915 621 +3 2664 2665 687 +3 2672 2671 580 +3 733 724 735 +3 2737 1211 2741 +3 1346 453 1345 +3 2351 1209 1204 +3 845 2676 833 +3 2323 715 1625 +3 1151 1150 616 +3 2352 2344 1201 +3 2273 2274 588 +3 615 1516 556 +3 557 1516 1515 +3 744 50 743 +3 1145 1144 589 +3 1181 1182 619 +3 1182 1181 618 +3 2546 2545 1626 +3 620 621 411 +3 1374 1375 770 +3 405 1356 1320 +3 1359 1356 405 +3 145 2144 2139 +3 1353 452 1352 +3 1469 2141 355 +3 137 379 1165 +3 784 558 620 +3 670 693 638 +3 668 671 672 +3 2753 1779 2754 +3 1069 722 721 +3 654 1187 1188 +3 637 678 680 +3 1687 1688 660 +3 813 390 816 +3 671 667 658 +3 667 679 658 +3 2350 1195 613 +3 607 646 663 +3 665 595 666 +3 638 666 668 +3 711 1096 1095 +3 769 1361 1358 +3 758 1924 1925 +3 597 1086 1087 +3 1989 900 1990 +3 1183 1184 416 +3 708 581 701 +3 1420 1407 2330 +3 637 680 685 +3 672 671 658 +3 669 670 638 +3 636 669 668 +3 669 638 668 +3 637 670 669 +3 1919 1921 600 +3 816 412 813 +3 693 628 665 +3 1082 1077 1078 +3 636 668 672 +3 666 595 667 +3 1641 1642 710 +3 884 648 881 +3 1688 707 660 +3 637 685 670 +3 145 359 2144 +3 1908 1907 895 +3 706 660 707 +3 1861 1247 1860 +3 731 568 734 +3 721 722 642 +3 606 1089 1081 +3 1352 452 1351 +3 2152 682 1504 +3 857 546 223 +3 717 1627 2545 +3 1780 1797 2750 +3 747 746 563 +3 881 694 882 +3 1133 639 1132 +3 489 829 2680 +3 1548 1537 1564 +3 965 964 252 +3 490 844 832 +3 1175 1176 1180 +3 1557 1559 793 +3 2547 2542 1628 +3 1726 1639 2009 +3 992 990 176 +3 859 222 858 +3 1667 222 859 +3 732 465 731 +3 465 730 731 +3 566 186 534 +3 357 2130 2129 +3 465 732 733 +3 1366 768 1368 +3 746 749 563 +3 731 734 732 +3 743 568 746 +3 568 743 742 +3 1579 516 1994 +3 878 2164 2165 +3 773 1176 772 +3 956 839 417 +3 50 742 743 +3 1233 736 1234 +3 751 733 480 +3 903 365 137 +3 465 733 751 +3 751 728 750 +3 465 751 750 +3 752 365 138 +3 1922 1923 758 +3 1389 2666 1392 +3 575 805 94 +3 881 762 694 +3 1442 2492 1134 +3 887 886 765 +3 406 776 1371 +3 954 417 955 +3 590 1322 1323 +3 2661 178 2659 +3 137 1165 1166 +3 773 1180 1176 +3 622 914 911 +3 439 467 1426 +3 782 591 781 +3 765 893 887 +3 413 835 834 +3 809 813 409 +3 805 823 397 +3 1356 777 1320 +3 1020 1236 1237 +3 793 1558 1557 +3 2686 2685 866 +3 965 123 964 +3 703 1096 1097 +3 2317 1019 2316 +3 1557 421 1559 +3 286 2179 232 +3 1676 2176 2177 +3 354 2133 352 +3 393 802 803 +3 407 806 478 +3 954 956 417 +3 777 2488 1320 +3 1212 1211 244 +3 2238 2580 2237 +3 813 809 390 +3 1184 1183 814 +3 835 149 840 +3 478 821 819 +3 392 2579 2580 +3 1127 2481 953 +3 819 821 820 +3 818 819 477 +3 818 478 819 +3 805 396 823 +3 819 820 477 +3 1211 573 2741 +3 397 823 478 +3 395 825 798 +3 2236 829 797 +3 831 392 487 +3 2681 489 2680 +3 798 829 828 +3 956 953 416 +3 953 956 954 +3 2128 695 591 +3 1184 814 412 +3 1943 2576 1122 +3 487 846 845 +3 1904 1903 849 +3 542 853 553 +3 16 2608 1593 +3 1048 2160 2159 +3 1586 2772 2773 +3 856 223 855 +3 978 867 1108 +3 2194 2189 2758 +3 239 536 2731 +3 2295 2296 865 +3 2170 2166 1046 +3 1138 1171 657 +3 873 1055 1035 +3 2046 2045 936 +3 2134 2145 142 +3 1167 44 360 +3 875 2296 2770 +3 2165 2164 2167 +3 1051 1052 1034 +3 914 915 773 +3 306 14 1143 +3 623 913 912 +3 2695 2694 301 +3 2353 2354 614 +3 694 762 1920 +3 1906 1907 1367 +3 1142 304 1143 +3 906 117 900 +3 756 117 906 +3 931 1767 1766 +3 754 756 906 +3 214 910 59 +3 911 912 622 +3 1129 870 1128 +3 77 337 1126 +3 917 217 916 +3 917 916 918 +3 1001 998 951 +3 1392 1818 1393 +3 1739 1740 183 +3 1075 1124 1125 +3 1414 440 1412 +3 964 963 252 +3 1494 1496 1495 +3 2708 2662 2707 +3 1881 1882 2437 +3 396 2766 822 +3 823 396 822 +3 2711 415 2708 +3 417 2710 957 +3 1008 473 1005 +3 289 1073 960 +3 71 130 131 +3 2223 1004 2222 +3 2050 339 2051 +3 1625 715 1626 +3 2520 2333 2519 +3 2407 2197 2408 +3 2197 2407 2198 +3 1226 2334 948 +3 2678 2192 2224 +3 2433 2305 2302 +3 124 1015 1016 +3 248 255 60 +3 473 1003 1005 +3 2191 1003 473 +3 2348 613 1202 +3 2036 993 2035 +3 123 907 964 +3 907 123 1015 +3 1207 2739 2738 +3 1242 1838 1839 +3 926 1681 1680 +3 1109 865 1110 +3 868 1109 1110 +3 2320 1621 2319 +3 1037 1038 1043 +3 2768 2767 1130 +3 1986 265 86 +3 1984 1986 86 +3 2107 1298 2108 +3 2377 2375 1271 +3 1380 2375 2377 +3 2195 2229 2214 +3 1294 1153 1289 +3 995 61 994 +3 1253 1856 1689 +3 2113 1299 229 +3 2423 889 2421 +3 1274 1273 1269 +3 373 1273 1274 +3 1610 1611 1154 +3 1610 471 1611 +3 2120 226 2121 +3 2535 1524 1526 +3 1375 894 770 +3 2072 204 2073 +3 2601 2604 2602 +3 2601 1575 2604 +3 981 980 979 +3 981 979 221 +3 922 425 920 +3 425 922 970 +3 2142 2145 2134 +3 2650 2145 2142 +3 970 922 220 +3 113 2062 2060 +3 2451 921 1996 +3 1996 217 2451 +3 217 920 2451 +3 57 1826 1825 +3 2168 2171 2169 +3 208 2081 214 +3 770 2258 600 +3 2258 770 883 +3 2085 975 974 +3 549 974 211 +3 335 1888 1887 +3 1334 2084 213 +3 976 548 211 +3 2079 2078 210 +3 1755 337 1754 +3 1332 213 1331 +3 869 1672 1669 +3 281 58 11 +3 58 281 1938 +3 1815 1816 219 +3 1816 979 219 +3 1812 1815 219 +3 998 1232 951 +3 1997 1996 1995 +3 2094 2096 2093 +3 2096 2094 221 +3 2098 978 971 +3 978 973 971 +3 2093 2096 971 +3 2096 2098 971 +3 2098 2096 2097 +3 1619 547 546 +3 1996 921 1995 +3 2096 221 2097 +3 1821 601 1820 +3 1769 1577 1768 +3 1581 1769 1768 +3 925 924 1997 +3 984 316 233 +3 303 2692 2068 +3 2692 300 2068 +3 2129 2130 2147 +3 1529 1525 792 +3 1530 1529 1523 +3 729 563 730 +3 2728 257 2729 +3 2673 699 2668 +3 699 2667 2668 +3 1541 1540 55 +3 1536 1540 1541 +3 1533 1531 1530 +3 348 1971 1998 +3 1523 1532 1530 +3 2250 2251 1553 +3 2251 2250 796 +3 676 657 1632 +3 1633 676 1632 +3 1527 422 983 +3 2248 150 2253 +3 2249 2248 2253 +3 2693 2689 2694 +3 2693 2691 2689 +3 22 298 299 +3 2656 697 635 +3 787 2656 635 +3 2599 1972 2597 +3 1972 1973 2597 +3 316 39 317 +3 316 984 39 +3 984 311 39 +3 1393 1818 601 +3 37 195 1729 +3 2052 2054 140 +3 1120 2218 1949 +3 989 990 96 +3 990 989 991 +3 1684 9 1682 +3 998 1001 61 +3 66 1686 1683 +3 990 930 176 +3 930 990 34 +3 930 933 176 +3 298 2059 295 +3 444 1460 1461 +3 444 2743 1460 +3 195 996 995 +3 2158 1049 2159 +3 1677 1676 1045 +3 985 180 989 +3 180 985 423 +3 333 89 1140 +3 333 1492 89 +3 695 1186 2477 +3 1186 174 2477 +3 2062 2061 2060 +3 991 34 990 +3 1699 1063 1669 +3 930 928 933 +3 33 347 346 +3 33 1000 347 +3 1030 1032 860 +3 1030 2515 1032 +3 1886 2640 2649 +3 2640 1885 2649 +3 1161 2432 2285 +3 993 987 988 +3 987 96 988 +3 143 1491 1492 +3 1493 143 1492 +3 1493 334 336 +3 734 745 1233 +3 38 1334 344 +3 927 926 1685 +3 1867 1265 1864 +3 1679 4 202 +3 2050 127 1614 +3 127 1616 1614 +3 922 920 917 +3 195 37 996 +3 1731 1736 1732 +3 1757 329 1760 +3 351 34 999 +3 327 351 999 +3 774 1179 1369 +3 1233 745 736 +3 1491 1002 332 +3 2565 88 2569 +3 323 197 99 +3 996 997 998 +3 999 991 180 +3 1000 999 180 +3 1000 327 999 +3 2140 356 2141 +3 1743 1742 324 +3 1000 180 423 +3 347 1000 423 +3 33 327 1000 +3 987 1001 951 +3 351 99 197 +3 1029 864 1030 +3 2773 1706 2006 +3 2605 2606 1574 +3 960 292 1117 +3 1073 292 960 +3 1959 1958 1114 +3 2272 1326 2274 +3 2002 249 248 +3 249 67 248 +3 2201 1006 2203 +3 2200 2210 2211 +3 1939 1935 1936 +3 1939 112 1935 +3 1533 982 1534 +3 1538 1533 1534 +3 2206 2203 2204 +3 70 124 125 +3 1014 124 70 +3 2028 994 2042 +3 2041 2028 2042 +3 2192 1005 2186 +3 1962 1960 1963 +3 1965 350 1960 +3 2187 961 2188 +3 77 1395 261 +3 41 2000 1999 +3 1014 907 1015 +3 122 907 1014 +3 70 122 1014 +3 350 1114 2213 +3 2209 2200 2204 +3 2209 2204 1006 +3 2668 700 2669 +3 141 2053 2056 +3 2321 2320 1620 +3 2321 1621 2320 +3 1010 2213 2208 +3 2299 1321 1322 +3 405 1321 2299 +3 706 707 683 +3 2301 1157 1602 +3 831 490 2679 +3 490 832 2679 +3 287 1012 1011 +3 1010 2206 2204 +3 1013 2191 473 +3 2205 1013 473 +3 2561 166 2560 +3 2201 2202 1008 +3 2203 2202 2201 +3 2369 2368 2370 +3 1896 1897 1895 +3 102 40 107 +3 2394 1283 53 +3 1283 2394 2390 +3 985 2154 986 +3 2076 2072 2073 +3 2076 208 2072 +3 308 310 1018 +3 755 308 1018 +3 308 755 14 +3 1848 1849 1251 +3 2345 1200 2346 +3 737 740 1238 +3 740 737 738 +3 1020 1021 735 +3 738 737 50 +3 50 744 738 +3 454 1259 455 +3 1337 1350 729 +3 480 1021 1022 +3 738 744 741 +3 457 738 741 +3 1841 1840 193 +3 1840 1841 1242 +3 1693 1691 1519 +3 1025 442 188 +3 1257 1256 1024 +3 453 450 1259 +3 928 931 2022 +3 931 932 2022 +3 2055 2056 2053 +3 2056 2055 1495 +3 336 1497 1496 +3 2701 1678 1673 +3 1672 2701 1673 +3 436 455 1025 +3 188 436 1025 +3 459 467 439 +3 702 1123 1093 +3 1026 842 843 +3 1093 1123 841 +3 1945 2578 1943 +3 2684 2384 371 +3 2384 2684 2386 +3 1526 1524 1527 +3 2537 2538 1173 +3 2252 796 2235 +3 1076 1125 656 +3 691 2316 2315 +3 704 842 1026 +3 342 1747 1748 +3 1747 341 1748 +3 1163 320 110 +3 190 2639 2637 +3 2065 2064 2066 +3 2079 93 919 +3 2078 2077 2082 +3 2077 91 2082 +3 1231 1230 182 +3 1678 2178 1674 +3 1048 2168 2167 +3 1676 2177 2178 +3 2177 1044 2178 +3 2500 2508 1041 +3 190 2594 2595 +3 377 136 2774 +3 874 1033 1032 +3 1710 2265 2337 +3 2336 1710 2337 +3 2158 1057 2157 +3 1057 2163 2157 +3 1236 735 1235 +3 1815 1812 1814 +3 499 1578 503 +3 2315 2316 714 +3 1620 2315 714 +3 382 1165 379 +3 1033 873 1035 +3 1033 1034 873 +3 1238 725 737 +3 861 1030 860 +3 1036 861 860 +3 1035 1036 860 +3 1938 2490 58 +3 861 1029 1030 +3 1285 2720 1488 +3 1801 1286 1274 +3 367 1801 1274 +3 937 2013 2021 +3 1673 1674 1043 +3 1415 1430 2622 +3 1430 1419 2622 +3 2161 1057 2160 +3 1037 871 1038 +3 28 1599 1597 +3 1830 28 1597 +3 2025 2044 2043 +3 2161 2162 2163 +3 2173 2172 1050 +3 2172 2173 879 +3 1095 703 2502 +3 1169 604 1170 +3 1169 1065 604 +3 971 425 970 +3 658 674 673 +3 788 604 1065 +3 631 788 1065 +3 659 2153 1019 +3 2153 2318 1019 +3 425 971 973 +3 1059 2155 2770 +3 868 1105 1107 +3 1109 868 1107 +3 35 2028 2027 +3 2028 198 2027 +3 2132 356 2131 +3 331 1756 1757 +3 2014 2032 2031 +3 2032 2015 2031 +3 1047 2171 2168 +3 1046 2166 2165 +3 1048 1049 872 +3 1834 1759 262 +3 873 1053 1055 +3 1715 155 1714 +3 2509 2508 1040 +3 2731 2726 537 +3 1705 1704 1584 +3 616 2349 1203 +3 238 543 212 +3 1047 872 1051 +3 2171 2172 879 +3 1050 1051 1034 +3 1708 1707 572 +3 2090 2089 967 +3 1681 31 1680 +3 2513 1031 2514 +3 1031 2515 2514 +3 2508 2500 1061 +3 2500 2501 1061 +3 1033 874 1034 +3 1034 1052 873 +3 1052 1053 873 +3 1052 1056 1053 +3 1055 863 1035 +3 1032 1033 860 +3 1033 1035 860 +3 1054 863 1055 +3 1049 2295 880 +3 2295 1049 876 +3 1967 1444 2491 +3 1056 1052 872 +3 1706 508 2268 +3 1580 1706 2268 +3 1814 863 1054 +3 1788 1790 1789 +3 1056 880 1053 +3 2016 2017 2033 +3 1054 1053 880 +3 2194 1011 2193 +3 2095 969 967 +3 2091 2092 970 +3 2091 969 2092 +3 2618 2616 2608 +3 2618 2607 2616 +3 2167 1046 2165 +3 2162 2161 878 +3 2644 2643 9 +3 2025 2038 2037 +3 2008 2257 2258 +3 883 2008 2258 +3 1004 2185 2187 +3 673 672 658 +3 940 1979 1976 +3 199 1886 196 +3 2769 875 2770 +3 1106 864 1029 +3 923 1106 1029 +3 2506 2508 1061 +3 640 1171 1170 +3 1171 641 1170 +3 2224 2192 2223 +3 2770 2155 1060 +3 2155 870 1060 +3 240 528 527 +3 1518 528 240 +3 220 2088 2090 +3 2088 2089 2090 +3 2035 993 988 +3 2099 2085 974 +3 2564 1742 1745 +3 2165 2166 878 +3 2013 2046 936 +3 937 2046 2013 +3 1684 1686 66 +3 631 1065 1066 +3 1067 631 1066 +3 667 1067 632 +3 1067 1066 632 +3 595 1067 667 +3 1091 2468 2466 +3 1170 641 1169 +3 1066 1068 603 +3 1066 1065 1068 +3 1170 635 640 +3 604 635 1170 +3 1934 1932 1912 +3 1928 1927 758 +3 1067 595 1070 +3 1068 1065 1169 +3 471 1612 1611 +3 1612 225 1611 +3 1067 1070 631 +3 2399 271 2400 +3 665 664 1071 +3 664 665 628 +3 2125 2126 224 +3 102 103 40 +3 712 1075 2589 +3 2588 712 2589 +3 612 399 583 +3 399 612 1150 +3 1076 1078 1074 +3 673 657 676 +3 1084 597 1078 +3 1115 1765 1116 +3 291 1115 1116 +3 653 1083 1082 +3 687 653 1082 +3 656 1824 1823 +3 1077 1082 1083 +3 1075 1125 1076 +3 1094 1093 712 +3 711 710 1096 +3 2274 2273 2272 +3 1094 702 1093 +3 584 2011 698 +3 2011 584 1645 +3 1087 1080 597 +3 1080 1087 95 +3 593 1087 1086 +3 593 1088 1087 +3 1078 1077 1084 +3 1179 1174 406 +3 1911 1394 645 +3 1911 1926 1394 +3 690 2463 1102 +3 1076 1074 2589 +3 1822 1823 688 +3 173 1104 542 +3 1091 1090 2468 +3 1099 599 1091 +3 690 1099 1091 +3 1529 1528 1523 +3 594 1098 1099 +3 1077 1085 1084 +3 2570 325 1733 +3 597 1080 1079 +3 1963 1960 1112 +3 424 655 1088 +3 1079 1080 599 +3 1080 1081 599 +3 2423 2422 757 +3 2422 2423 2421 +3 404 2422 2421 +3 760 653 759 +3 760 1083 653 +3 48 314 275 +3 1149 1088 593 +3 2589 1075 1076 +3 2588 2589 1074 +3 1085 1077 1697 +3 1146 1148 402 +3 1146 592 1148 +3 1641 711 581 +3 711 2563 581 +3 591 782 1330 +3 1146 1147 589 +3 1147 402 587 +3 1087 1088 95 +3 1088 655 95 +3 655 662 95 +3 1820 601 1819 +3 2291 2281 2365 +3 2286 2291 2365 +3 1527 982 1594 +3 962 1124 1101 +3 1203 1204 616 +3 1093 841 1075 +3 1091 599 1090 +3 599 1089 1090 +3 2469 1090 2470 +3 1103 2461 1122 +3 2458 2461 1103 +3 399 2472 2473 +3 2472 399 1151 +3 2060 2061 26 +3 794 2237 2232 +3 599 1081 1089 +3 603 721 800 +3 721 720 800 +3 2117 2114 2115 +3 2466 2468 2467 +3 689 2466 2467 +3 2468 1090 2469 +3 2467 2468 2469 +3 626 2470 1089 +3 688 1092 689 +3 1820 689 1821 +3 1099 1079 599 +3 1126 332 338 +3 332 25 338 +3 706 686 1504 +3 683 686 706 +3 702 1094 1095 +3 962 1100 1092 +3 1078 1079 1098 +3 1079 1078 597 +3 2566 1747 342 +3 1074 1098 594 +3 1074 1078 1098 +3 594 1099 1102 +3 2562 2563 711 +3 841 1124 1075 +3 1098 1079 1099 +3 1460 1630 1461 +3 1760 329 1761 +3 249 2002 2763 +3 254 249 2763 +3 1628 1629 642 +3 1628 720 1629 +3 925 1104 173 +3 1823 1824 688 +3 1125 1124 962 +3 677 1633 1634 +3 1183 815 814 +3 1503 2282 2287 +3 2288 1503 2287 +3 2717 2718 1432 +3 856 542 1104 +3 858 856 1104 +3 858 857 856 +3 858 1104 925 +3 858 925 859 +3 594 2459 2460 +3 1102 1099 690 +3 2578 1026 2576 +3 1671 1039 870 +3 1107 1106 5 +3 1108 1107 5 +3 2277 2505 2501 +3 2277 2504 2505 +3 2505 1061 2501 +3 1672 1038 1699 +3 2367 370 1475 +3 2014 936 2032 +3 521 1791 1785 +3 1814 1054 866 +3 1815 1814 866 +3 1608 1607 470 +3 1607 1608 2687 +3 1154 2687 1608 +3 1108 867 1109 +3 1107 1108 1109 +3 1030 2514 2515 +3 1281 2262 1696 +3 2262 1281 2263 +3 1825 8 107 +3 1956 1955 1117 +3 2185 2184 288 +3 1003 2184 2185 +3 2224 2225 2189 +3 2226 2224 2189 +3 88 2565 2566 +3 185 448 1887 +3 1174 780 406 +3 286 232 285 +3 1834 1753 1746 +3 116 2021 2023 +3 2021 2013 2023 +3 1954 1963 1112 +3 1833 1832 1830 +3 620 624 618 +3 2760 1004 2188 +3 799 1524 2535 +3 2210 2200 2209 +3 1116 1119 291 +3 2416 1190 1189 +3 1521 2230 1525 +3 8 102 107 +3 1118 1953 1955 +3 1954 1953 1118 +3 1007 2196 2195 +3 1116 475 1613 +3 1113 1956 1957 +3 1952 1951 1120 +3 1950 290 1111 +3 882 2007 765 +3 1955 1964 1118 +3 1445 1444 1966 +3 1008 2202 473 +3 896 2699 2700 +3 683 707 800 +3 2242 2241 2243 +3 675 1687 681 +3 639 675 681 +3 1525 1529 1530 +3 2546 1626 3 +3 2461 841 1122 +3 912 913 1127 +3 912 1127 410 +3 953 410 1127 +3 810 827 174 +3 827 2476 174 +3 2481 2480 783 +3 2481 1127 2480 +3 845 846 2482 +3 2352 2353 2357 +3 1229 182 1228 +3 182 1230 1228 +3 1069 641 722 +3 641 1133 722 +3 2320 2319 691 +3 722 1132 1131 +3 1132 722 1133 +3 361 383 1167 +3 1902 391 1901 +3 431 147 432 +3 1229 181 423 +3 2316 2318 714 +3 2318 2316 1019 +3 1131 659 1019 +3 1131 1132 659 +3 2716 459 192 +3 1136 2 354 +3 461 2662 191 +3 536 2725 2726 +3 484 485 1462 +3 484 389 485 +3 973 2452 2450 +3 2452 921 2450 +3 2141 1891 355 +3 1440 1701 437 +3 1936 1935 13 +3 1409 2520 2519 +3 355 494 1453 +3 346 1760 1761 +3 329 1758 340 +3 1847 193 1845 +3 1846 1847 1845 +3 1856 1853 1689 +3 1247 1266 1860 +3 1395 1126 338 +3 153 366 943 +3 366 1267 943 +3 1798 525 1774 +3 2696 2690 2695 +3 363 2696 2695 +3 898 2695 301 +3 94 805 804 +3 1194 111 1142 +3 633 1805 1804 +3 1737 997 1736 +3 1517 1208 1518 +3 523 1517 1518 +3 715 2321 1620 +3 582 2474 2471 +3 582 2473 2474 +3 111 304 1142 +3 303 304 2692 +3 111 1194 905 +3 1498 2135 142 +3 2136 357 2137 +3 304 306 1143 +3 152 306 304 +3 408 810 811 +3 2476 2478 2475 +3 913 2476 2475 +3 593 1148 1149 +3 592 1149 1148 +3 808 408 2241 +3 1148 593 1086 +3 594 2460 1074 +3 2459 1103 2460 +3 1558 2231 1521 +3 810 408 809 +3 809 408 808 +3 2275 2270 2272 +3 886 885 765 +3 1149 592 812 +3 592 811 812 +3 2145 385 384 +3 142 2145 384 +3 1197 610 1198 +3 2517 1776 523 +3 2724 2723 257 +3 56 2267 1709 +3 471 2183 1612 +3 227 2112 2111 +3 1608 1609 1610 +3 470 1609 1608 +3 314 313 233 +3 313 312 233 +3 1310 1309 231 +3 276 1310 1297 +3 1292 2413 2415 +3 48 372 313 +3 471 1610 1609 +3 2387 2388 161 +3 2391 2387 161 +3 225 1603 1155 +3 321 2066 2064 +3 1163 2066 321 +3 2261 472 2260 +3 1606 1154 1155 +3 1603 1602 1155 +3 1083 1697 1077 +3 2263 1281 1287 +3 1281 228 1287 +3 1611 225 1155 +3 1310 231 1297 +3 1306 1299 2112 +3 1277 1288 1289 +3 1288 1294 1289 +3 1694 1695 1279 +3 1695 1694 1281 +3 643 661 1804 +3 1382 661 643 +3 1279 1275 1656 +3 1278 1654 1655 +3 1156 1660 1292 +3 1291 1652 1653 +3 1291 1277 1289 +3 228 1288 1287 +3 228 1293 1288 +3 1970 1275 1273 +3 2347 2348 2346 +3 2291 2432 2431 +3 2432 2291 2286 +3 2013 2366 2023 +3 366 153 312 +3 2372 366 312 +3 370 2368 2369 +3 472 2261 1119 +3 1951 2297 2218 +3 2217 2297 1950 +3 2297 2217 2218 +3 1365 1366 775 +3 1166 1167 360 +3 361 1167 1166 +3 2206 2207 1009 +3 277 6 279 +3 277 1168 6 +3 444 1459 2743 +3 268 97 274 +3 821 823 822 +3 1458 1460 2743 +3 1460 1458 1457 +3 1005 2227 2193 +3 2159 1057 2158 +3 1919 2258 2257 +3 2169 1046 2765 +3 720 721 1629 +3 657 1171 1632 +3 1627 2547 1628 +3 2466 2465 1091 +3 2466 1092 2465 +3 1523 1594 1532 +3 426 2485 1182 +3 617 426 1182 +3 1196 2356 1199 +3 2356 1196 1197 +3 1181 0 618 +3 0 620 618 +3 1180 619 1175 +3 741 192 457 +3 1250 1254 1244 +3 1176 774 1177 +3 773 915 1181 +3 1636 1405 1635 +3 619 1180 1181 +3 462 192 741 +3 646 1911 645 +3 1911 646 1912 +3 771 1367 888 +3 629 1387 1910 +3 1926 629 1910 +3 1371 775 406 +3 1179 406 775 +3 1369 1179 775 +3 1440 2592 1701 +3 2590 1437 1436 +3 712 1093 1075 +3 1176 1175 774 +3 2484 619 1182 +3 2485 2484 1182 +3 2486 2487 780 +3 779 780 2487 +3 780 779 406 +3 98 272 284 +3 272 2399 284 +3 424 1187 655 +3 38 2084 1334 +3 494 493 1450 +3 1192 654 1191 +3 799 2535 1522 +3 812 1185 424 +3 1149 812 424 +3 1808 663 645 +3 812 1186 1185 +3 812 174 1186 +3 811 174 812 +3 1404 1428 2521 +3 1666 1668 861 +3 1189 654 1188 +3 2417 1189 2419 +3 884 2423 648 +3 647 1913 2397 +3 655 1187 1192 +3 2426 890 2416 +3 654 1189 1190 +3 270 2402 2401 +3 1193 906 900 +3 271 2398 97 +3 2417 2416 1189 +3 2426 2416 2417 +3 1191 2397 607 +3 654 1190 1191 +3 305 906 1193 +3 906 305 754 +3 654 1192 1187 +3 1936 108 1939 +3 1192 662 655 +3 607 662 1192 +3 662 607 663 +3 2446 1027 2448 +3 1570 2587 1587 +3 2587 1563 1587 +3 647 1914 1913 +3 1142 1143 305 +3 1193 1142 305 +3 2595 2639 190 +3 1473 2639 2595 +3 322 905 1194 +3 1194 1142 1193 +3 1196 394 1197 +3 915 0 1181 +3 2676 486 2575 +3 615 556 400 +3 1206 1205 556 +3 529 1206 556 +3 1205 400 556 +3 2211 350 2213 +3 2211 1961 350 +3 577 2471 2472 +3 576 577 2472 +3 805 397 804 +3 1195 394 1196 +3 2486 2485 426 +3 913 623 2477 +3 2636 577 94 +3 1631 719 720 +3 719 1631 2539 +3 1195 1196 613 +3 1196 1199 613 +3 616 2350 2349 +3 616 1150 2350 +3 528 2740 1511 +3 1209 1224 1210 +3 1224 2358 1210 +3 2242 407 2244 +3 83 1711 1302 +3 1300 83 1302 +3 1727 1726 579 +3 1645 579 2011 +3 1516 557 1509 +3 1221 1222 576 +3 1222 94 576 +3 613 1199 1202 +3 170 1716 263 +3 1355 528 1511 +3 1210 400 1209 +3 2767 2768 824 +3 2221 2196 2756 +3 2196 2221 2220 +3 570 1217 1219 +3 1217 570 520 +3 2739 1207 529 +3 1219 1693 1220 +3 1219 524 1693 +3 207 910 154 +3 1212 1213 574 +3 2358 1224 2357 +3 1204 400 1205 +3 1204 1209 400 +3 613 2349 2350 +3 2351 1203 2347 +3 1203 2348 2347 +3 399 1727 583 +3 501 1788 1787 +3 1971 1973 1972 +3 396 575 1130 +3 575 1225 1130 +3 2352 2357 1224 +3 1639 1726 582 +3 520 1218 1217 +3 497 518 1792 +3 2348 1202 2346 +3 242 1217 1218 +3 1208 2739 2740 +3 2739 529 2740 +3 277 2742 1168 +3 519 1785 1786 +3 1772 522 1771 +3 1218 825 242 +3 825 1218 500 +3 2023 2366 935 +3 242 1216 1217 +3 782 1327 1330 +3 56 1788 1789 +3 2631 2633 2628 +3 2631 2634 2633 +3 233 312 984 +3 1786 1785 1791 +3 1793 1784 1794 +3 570 1220 1776 +3 1223 616 573 +3 616 1205 573 +3 1776 2517 1783 +3 574 1221 1214 +3 1199 2356 2354 +3 1214 1223 573 +3 1223 1214 1221 +3 1211 1214 573 +3 419 624 625 +3 1515 419 625 +3 1150 1195 2350 +3 2455 1685 1680 +3 2286 2362 1172 +3 1695 1696 375 +3 1219 1220 570 +3 2359 615 1210 +3 2358 2359 1210 +3 1509 557 1512 +3 1236 725 1237 +3 949 946 1226 +3 183 946 949 +3 36 1232 998 +3 997 36 998 +3 874 1037 1043 +3 1226 1227 949 +3 1226 181 1227 +3 1123 702 1943 +3 740 739 1240 +3 1836 740 1240 +3 354 2 1891 +3 1229 1227 181 +3 1229 1228 1227 +3 1909 769 1358 +3 772 1909 1358 +3 923 1029 1028 +3 2178 1044 1674 +3 1232 36 950 +3 859 925 218 +3 925 1997 218 +3 924 217 1996 +3 1817 949 1230 +3 945 184 947 +3 2044 2048 2049 +3 2048 2044 2026 +3 2734 537 238 +3 1836 2496 2497 +3 1236 1020 735 +3 18 2642 2644 +3 1844 1839 1843 +3 1839 1844 1840 +3 1235 725 1236 +3 1243 1846 739 +3 1251 193 1847 +3 1366 1365 888 +3 1846 1250 1847 +3 1022 1842 1023 +3 458 1838 1242 +3 1842 1242 1841 +3 739 457 1243 +3 737 725 736 +3 2383 2386 2385 +3 2382 2383 2385 +3 1845 193 1840 +3 1255 193 1251 +3 184 535 947 +3 947 535 49 +3 535 1888 49 +3 1237 1239 1020 +3 1839 1838 1837 +3 1243 1250 1846 +3 192 456 457 +3 458 1242 1842 +3 1251 1252 1024 +3 339 2052 2051 +3 110 2065 2066 +3 1616 1617 130 +3 69 1616 130 +3 448 90 335 +3 1842 1841 1023 +3 2622 1418 2621 +3 1268 1270 367 +3 909 2050 2051 +3 2050 909 127 +3 1255 1841 193 +3 1247 1869 1868 +3 456 1254 457 +3 2552 60 2551 +3 1253 1254 456 +3 456 459 1249 +3 1249 439 1247 +3 1835 2496 1239 +3 2496 1835 2497 +3 1243 457 1254 +3 1496 1494 336 +3 2418 2419 763 +3 1277 1291 1653 +3 1909 1908 895 +3 1497 187 353 +3 2574 2230 2231 +3 1864 1865 1264 +3 1864 1265 1865 +3 440 2524 1412 +3 1254 1851 1244 +3 2308 2307 430 +3 1691 1692 1213 +3 1692 1215 1213 +3 1691 1690 1519 +3 450 1022 1258 +3 1909 1178 1908 +3 1263 1855 1262 +3 1024 1255 1251 +3 454 453 1259 +3 90 448 447 +3 448 186 447 +3 1256 1255 1024 +3 1255 1256 1023 +3 186 449 447 +3 1257 1260 54 +3 1023 1258 1022 +3 1023 1256 1258 +3 1256 1257 1258 +3 1258 1257 1259 +3 1245 1260 1252 +3 1488 2383 1285 +3 2383 1488 369 +3 1253 456 1862 +3 1861 1246 1862 +3 1367 768 1366 +3 1907 768 1367 +3 2764 1458 2743 +3 1459 2764 2743 +3 25 2052 339 +3 1263 1262 1866 +3 1519 1690 244 +3 1690 1212 244 +3 1457 386 1460 +3 1298 2110 2111 +3 1403 2327 2332 +3 2333 1403 2332 +3 2214 2219 2534 +3 2229 2219 2214 +3 2375 2380 2376 +3 140 74 908 +3 74 140 2054 +3 338 25 339 +3 520 570 571 +3 2598 250 2600 +3 1699 1038 1600 +3 1481 1479 369 +3 56 1789 2267 +3 1267 1270 1268 +3 1270 1267 366 +3 374 1267 1268 +3 433 1905 431 +3 1004 2186 2185 +3 351 1489 34 +3 1272 1801 1802 +3 2379 230 2378 +3 230 2377 2378 +3 1282 2394 53 +3 371 2683 2684 +3 1296 2107 2108 +3 1658 1293 228 +3 1314 98 285 +3 375 1282 1275 +3 1279 375 1275 +3 469 468 133 +3 1017 469 309 +3 1018 1017 309 +3 2393 1017 1018 +3 2684 2683 53 +3 2733 2732 2734 +3 551 2734 238 +3 555 537 2727 +3 2107 1296 1295 +3 1158 2107 1295 +3 1159 1291 1290 +3 1291 1289 1290 +3 1273 1282 53 +3 1269 1273 53 +3 1292 1159 2413 +3 312 153 311 +3 2125 17 1715 +3 2119 2120 1304 +3 2401 271 296 +3 1288 1277 1287 +3 2122 2125 2124 +3 375 1279 1695 +3 1656 1657 1279 +3 1656 1278 1657 +3 373 1969 1970 +3 424 1185 1187 +3 716 1623 642 +3 1131 716 642 +3 288 2184 2181 +3 2184 2182 2181 +3 1360 778 1359 +3 369 2384 2383 +3 2028 35 994 +3 370 1300 1319 +3 158 2100 2101 +3 227 2118 1306 +3 828 489 2682 +3 52 160 1478 +3 1305 52 1478 +3 1036 2429 1666 +3 1270 2378 367 +3 2378 1270 2379 +3 2730 2735 533 +3 1271 2375 2376 +3 1802 1271 1803 +3 1271 2376 1803 +3 1152 1307 1309 +3 1307 231 1309 +3 315 314 233 +3 231 1307 1295 +3 2111 2114 227 +3 1802 1803 1272 +3 2560 166 2549 +3 1158 2104 2106 +3 1158 2103 2104 +3 1153 1290 1289 +3 984 312 311 +3 1710 1709 2265 +3 1309 1311 470 +3 1153 1294 1295 +3 289 1336 2121 +3 2384 2386 2383 +3 1336 297 2121 +3 1300 229 1299 +3 83 1300 1299 +3 1607 1309 470 +3 48 1297 1313 +3 2272 1325 2275 +3 1325 2272 2273 +3 1422 1423 1399 +3 1114 1115 291 +3 1603 2301 1602 +3 1605 1308 1152 +3 1012 2211 2210 +3 371 2384 2391 +3 1116 1764 475 +3 1306 2112 227 +3 1280 1293 1658 +3 1603 225 1317 +3 1156 1603 1317 +3 475 1764 1763 +3 162 1476 1475 +3 2685 972 1816 +3 978 972 2685 +3 2114 2111 1301 +3 1315 1314 276 +3 1315 1297 275 +3 275 1297 48 +3 1315 276 1297 +3 2076 91 2077 +3 91 2076 2073 +3 2221 2760 2188 +3 1319 1302 1483 +3 369 1479 2387 +3 2384 369 2387 +3 160 52 159 +3 469 753 309 +3 1989 1991 322 +3 543 555 30 +3 555 2727 30 +3 189 1881 2437 +3 2396 1191 1190 +3 1009 2203 2206 +3 2106 2107 1158 +3 2107 2106 1298 +3 1290 2410 2413 +3 367 1802 1801 +3 1153 1295 1308 +3 1308 1295 1307 +3 1308 1307 1152 +3 47 280 283 +3 372 48 1313 +3 230 2370 1380 +3 1610 1154 1608 +3 1311 1309 1310 +3 235 314 315 +3 283 273 235 +3 2110 1301 2111 +3 98 1314 1315 +3 1311 276 1312 +3 276 1311 1310 +3 1660 1280 1659 +3 1312 1314 285 +3 1314 1312 276 +3 1301 2116 2115 +3 2115 2123 1303 +3 2123 1763 1303 +3 1010 2208 2206 +3 2410 2415 2413 +3 2651 2650 2142 +3 2412 2411 1153 +3 966 1155 1602 +3 1304 2120 2122 +3 1602 1157 1601 +3 2301 1292 2415 +3 1316 2409 2411 +3 2756 2196 2757 +3 647 2397 2396 +3 1357 777 1356 +3 1357 767 777 +3 911 778 623 +3 912 911 623 +3 611 911 914 +3 587 1650 1651 +3 805 575 396 +3 2478 783 2475 +3 952 2479 815 +3 405 1320 1321 +3 782 781 405 +3 2261 1013 1119 +3 1360 623 778 +3 1116 472 1119 +3 1322 1321 609 +3 1042 1129 2498 +3 1042 2769 1129 +3 2372 2379 366 +3 2379 1270 366 +3 2084 919 213 +3 2012 2673 1725 +3 1323 1322 609 +3 782 2299 2300 +3 1064 1600 871 +3 2274 1697 588 +3 2505 2506 1061 +3 1324 587 2270 +3 2400 284 2399 +3 2402 284 2400 +3 2074 977 2073 +3 977 2074 203 +3 2270 2269 1324 +3 404 2417 2418 +3 2417 2419 2418 +3 2563 2562 842 +3 2396 2397 1191 +3 1819 1822 688 +3 1330 1327 1328 +3 761 1330 1328 +3 1801 2264 1286 +3 2373 1475 1476 +3 918 1331 919 +3 1331 918 216 +3 1732 1730 1731 +3 2215 1950 1111 +3 77 1126 1395 +3 1757 1760 331 +3 1760 1139 331 +3 324 323 1744 +3 296 1336 270 +3 297 1336 296 +3 1038 871 1600 +3 1538 1534 1539 +3 728 1338 1337 +3 1340 1338 728 +3 1338 1340 1339 +3 1339 564 1338 +3 1339 569 564 +3 569 1339 565 +3 1346 1344 726 +3 564 1351 1350 +3 1351 564 1352 +3 451 1339 1340 +3 1339 451 565 +3 2168 2169 2765 +3 1349 1348 727 +3 450 1346 726 +3 955 957 411 +3 508 2267 2268 +3 453 1346 450 +3 1341 1347 727 +3 449 186 713 +3 1345 449 713 +3 1347 751 727 +3 451 1342 1343 +3 1349 727 480 +3 1343 713 566 +3 1344 713 1343 +3 713 1344 1345 +3 746 747 464 +3 463 2660 748 +3 2717 1432 467 +3 1344 1343 1342 +3 1347 728 751 +3 2660 178 748 +3 2659 178 2660 +3 1340 728 1347 +3 1340 1347 1341 +3 386 1345 453 +3 1345 1344 1346 +3 726 1342 1348 +3 726 1348 1349 +3 726 1349 450 +3 741 464 462 +3 741 744 464 +3 450 1349 1022 +3 1350 1351 729 +3 452 1353 1354 +3 1353 527 1354 +3 781 1360 1359 +3 411 2705 784 +3 569 1352 564 +3 1006 2201 2198 +3 497 1792 850 +3 887 888 403 +3 419 1516 615 +3 522 1772 526 +3 569 1353 1352 +3 452 1354 560 +3 561 452 560 +3 463 747 563 +3 776 406 779 +3 2443 1423 1422 +3 1379 885 886 +3 1362 1363 767 +3 1394 1910 644 +3 1910 1387 644 +3 1361 766 1362 +3 1576 1994 516 +3 590 1323 2271 +3 1357 1358 767 +3 1358 1361 767 +3 1407 1420 1400 +3 911 611 778 +3 611 772 1358 +3 1927 1922 758 +3 2331 1406 1402 +3 767 1361 1362 +3 888 1365 1364 +3 892 1363 1362 +3 1363 892 403 +3 1364 1363 403 +3 888 1364 403 +3 1177 772 1176 +3 766 892 1362 +3 774 1369 1370 +3 1177 774 1370 +3 1370 1368 768 +3 1178 1370 768 +3 1178 1177 1370 +3 1366 1368 775 +3 772 1177 1178 +3 2174 879 2173 +3 2174 2175 879 +3 2282 1161 2283 +3 2279 2282 1503 +3 1369 775 1368 +3 1370 1369 1368 +3 781 1359 405 +3 767 1363 1373 +3 709 708 2629 +3 1650 587 1324 +3 1646 608 1643 +3 1733 323 324 +3 1363 1364 1372 +3 2299 1322 2300 +3 767 1373 777 +3 1373 776 777 +3 1326 1697 2274 +3 1373 1363 1372 +3 1371 776 1372 +3 776 1373 1372 +3 1360 2477 623 +3 770 600 1376 +3 1374 770 1376 +3 1378 764 1379 +3 764 885 1379 +3 600 1377 1376 +3 1376 1377 766 +3 1234 724 1233 +3 1377 1378 766 +3 696 1186 695 +3 600 891 1377 +3 1028 1668 218 +3 554 217 924 +3 1378 1379 892 +3 766 1378 892 +3 1993 886 887 +3 1381 628 693 +3 670 1381 693 +3 1381 670 661 +3 1914 630 1915 +3 630 1916 1915 +3 1428 1417 1429 +3 1941 293 294 +3 1382 628 1381 +3 661 1382 1381 +3 2508 2509 1041 +3 2509 2512 1041 +3 980 219 979 +3 1809 219 980 +3 664 1388 1071 +3 651 1387 1390 +3 645 1384 602 +3 1072 1765 1115 +3 629 1390 1387 +3 629 1933 1390 +3 1870 1871 1265 +3 1874 1871 1870 +3 643 1804 1805 +3 2524 1410 2525 +3 644 1386 1385 +3 644 1387 1386 +3 628 1385 664 +3 644 1385 1383 +3 1383 1385 1382 +3 1385 628 1382 +3 1383 1382 643 +3 2523 1411 2333 +3 651 1388 1386 +3 1387 651 1386 +3 1934 1931 1932 +3 1931 650 1932 +3 2654 2653 596 +3 2654 2656 2653 +3 1615 1616 69 +3 1761 33 346 +3 644 1383 1384 +3 1929 1928 1925 +3 1391 1929 652 +3 598 1391 652 +3 598 1389 1391 +3 1388 1389 627 +3 1071 1388 627 +3 601 1818 1819 +3 1393 788 631 +3 1393 601 788 +3 290 1950 2298 +3 1388 664 1386 +3 1910 1394 1926 +3 1388 651 1389 +3 1407 2329 2330 +3 629 1926 1912 +3 1926 1911 1912 +3 638 665 666 +3 1389 651 1391 +3 440 1402 1406 +3 1666 862 1667 +3 862 1666 2429 +3 2672 700 2671 +3 92 1619 981 +3 1392 627 1389 +3 1394 644 1384 +3 1923 762 881 +3 1669 1672 1699 +3 200 2641 199 +3 126 261 1395 +3 260 1754 1752 +3 2123 475 1763 +3 475 2123 2116 +3 1263 1866 1865 +3 1496 353 75 +3 1497 353 1496 +3 1916 1922 1927 +3 1432 1431 1426 +3 1476 2720 1285 +3 2720 1476 1477 +3 2141 356 1891 +3 1441 1442 1134 +3 909 139 127 +3 838 837 1473 +3 306 152 307 +3 25 1002 2053 +3 189 1878 1881 +3 2328 2329 1407 +3 1436 441 2623 +3 2130 2131 356 +3 1411 1403 2333 +3 383 384 44 +3 1040 2513 1105 +3 1617 1616 127 +3 2449 1421 2528 +3 1410 2521 1428 +3 2521 1410 2520 +3 1811 862 1813 +3 1411 1406 1403 +3 1918 2259 1920 +3 630 1918 1920 +3 920 425 2450 +3 1439 2331 1402 +3 2331 1439 2444 +3 10 1413 2525 +3 1413 1412 2525 +3 1425 1424 460 +3 381 74 237 +3 1868 1869 1248 +3 2327 1408 2522 +3 1414 1413 441 +3 1418 1436 2623 +3 2701 1672 869 +3 1635 1415 1636 +3 2399 2398 271 +3 1409 2521 2520 +3 1416 1417 1404 +3 2314 2308 2311 +3 2330 1401 1420 +3 147 430 2307 +3 147 431 430 +3 1404 1417 1428 +3 353 1136 352 +3 1165 361 1166 +3 2332 2327 1409 +3 237 384 383 +3 2331 1401 2330 +3 188 442 1414 +3 349 74 376 +3 753 133 752 +3 133 1883 752 +3 1424 438 1405 +3 438 1424 1425 +3 2055 1002 143 +3 2053 1002 2055 +3 1879 2441 442 +3 579 583 1727 +3 2131 2130 2136 +3 1636 1415 1429 +3 1437 1441 1134 +3 1401 2443 1422 +3 439 1426 1427 +3 1426 1425 1427 +3 2260 2191 1013 +3 2443 2444 2442 +3 1807 1808 602 +3 1431 438 1426 +3 1431 1430 438 +3 2717 437 2718 +3 2714 2713 1433 +3 364 365 1883 +3 2525 2529 10 +3 2525 1410 2529 +3 1878 1880 1396 +3 838 2595 1435 +3 1879 189 2439 +3 460 1424 1421 +3 1881 1877 1398 +3 1877 1881 1878 +3 1434 2713 2714 +3 356 2140 2130 +3 1880 443 1396 +3 1397 443 1880 +3 442 1025 1397 +3 467 1432 1426 +3 1399 1423 1875 +3 1867 1870 1265 +3 1870 1867 1868 +3 1427 1425 460 +3 1248 1876 1875 +3 444 1461 436 +3 1426 438 1425 +3 2524 2525 1412 +3 2530 1947 1946 +3 1947 2530 703 +3 1807 633 626 +3 2133 2132 144 +3 2404 286 2403 +3 108 1936 1937 +3 1419 1701 1700 +3 600 1921 891 +3 1700 1701 1135 +3 1417 1636 1429 +3 1406 2331 2330 +3 2620 2623 1413 +3 1913 1914 1915 +3 714 2290 2284 +3 2290 714 2318 +3 1703 2771 1702 +3 1405 1636 1417 +3 1416 1405 1417 +3 1919 1918 649 +3 2259 1918 1919 +3 2716 467 459 +3 66 351 197 +3 351 66 1489 +3 132 73 2533 +3 1438 435 188 +3 1459 435 1471 +3 441 1437 1438 +3 2652 44 385 +3 2444 1439 2442 +3 265 266 1502 +3 266 267 1502 +3 1500 2302 2305 +3 2440 2439 1402 +3 1437 441 1436 +3 1447 491 1451 +3 188 1414 1438 +3 1134 435 1438 +3 2593 1440 2594 +3 2201 1008 2198 +3 2651 2136 358 +3 2652 2651 358 +3 2492 2491 434 +3 1977 1596 1597 +3 2637 2638 1442 +3 434 1474 1470 +3 1450 493 1448 +3 2 493 494 +3 1445 491 1447 +3 492 1445 1447 +3 2595 838 1473 +3 2639 2638 2637 +3 2639 1443 2638 +3 413 491 1446 +3 413 511 491 +3 1446 836 413 +3 413 836 835 +3 414 836 1446 +3 491 1445 1446 +3 1447 1448 492 +3 1448 1449 492 +3 445 1455 1137 +3 485 389 486 +3 926 1680 1685 +3 388 1447 1451 +3 2598 2600 253 +3 1472 2592 2593 +3 190 1472 2593 +3 493 1449 1448 +3 485 486 1902 +3 1448 388 1450 +3 1454 1455 1456 +3 1134 2492 1471 +3 1451 511 484 +3 511 1451 491 +3 511 389 484 +3 1447 388 1448 +3 482 1467 481 +3 1966 1444 1967 +3 1451 484 1452 +3 1454 1449 493 +3 388 1453 1450 +3 388 1452 1453 +3 2485 2486 780 +3 1456 387 1454 +3 1455 2 1137 +3 551 79 2734 +3 552 79 551 +3 1906 1367 771 +3 1456 1455 445 +3 1902 486 2483 +3 780 1174 2484 +3 1458 387 1456 +3 1457 1458 1456 +3 1459 444 435 +3 1452 1462 483 +3 1452 484 1462 +3 1457 445 446 +3 521 1785 1773 +3 1324 2269 2271 +3 2269 590 2271 +3 1471 1470 1459 +3 1134 1471 435 +3 1470 1471 434 +3 2766 826 822 +3 2744 1784 1795 +3 939 2746 2748 +3 1794 1784 2744 +3 1452 483 1453 +3 1462 1463 483 +3 1469 355 1468 +3 482 1469 1468 +3 485 1463 1462 +3 619 2583 1175 +3 1174 2583 619 +3 830 829 2236 +3 2680 829 830 +3 392 2580 2238 +3 1466 1467 482 +3 942 1984 2245 +3 2255 1445 492 +3 1561 2238 794 +3 1465 431 432 +3 433 431 1465 +3 1466 432 1467 +3 60 2552 2005 +3 2552 246 2005 +3 1465 1464 148 +3 1455 493 2 +3 255 1892 60 +3 415 837 838 +3 355 1453 483 +3 1468 355 483 +3 482 1468 1464 +3 2133 2142 2134 +3 476 834 816 +3 476 413 834 +3 476 510 413 +3 1284 2374 2367 +3 2168 2765 2167 +3 2765 1046 2167 +3 2141 481 2140 +3 1469 481 2141 +3 1664 889 764 +3 2689 301 2694 +3 493 1455 1454 +3 2638 2492 1442 +3 2492 2638 2491 +3 2491 2638 1443 +3 836 149 835 +3 414 837 836 +3 414 1473 837 +3 837 149 836 +3 1712 171 1713 +3 2398 1168 97 +3 1168 2398 272 +3 1305 1485 52 +3 2265 2266 2339 +3 1476 162 1477 +3 66 197 1684 +3 2368 1380 2370 +3 370 2367 2368 +3 1302 1484 1483 +3 1319 162 1475 +3 1475 370 1319 +3 1902 2483 391 +3 2395 1017 2393 +3 19 1898 1479 +3 2389 161 2388 +3 1478 1479 1481 +3 1478 160 1479 +3 2723 531 257 +3 2750 1797 56 +3 930 34 175 +3 34 1489 175 +3 2369 2370 372 +3 1482 1483 1484 +3 1482 162 1483 +3 1716 1714 155 +3 1717 1716 155 +3 1305 1484 1485 +3 1484 172 1485 +3 2730 2729 532 +3 2303 1501 146 +3 2303 2302 1501 +3 147 2307 2306 +3 1566 1544 512 +3 1501 1500 113 +3 220 2080 2088 +3 2726 2725 538 +3 2392 2395 2393 +3 1477 1480 1488 +3 172 1486 1485 +3 1486 172 1487 +3 1017 2389 469 +3 161 2389 1017 +3 1712 1487 172 +3 1487 1712 1713 +3 1480 1481 1488 +3 2727 538 30 +3 538 539 30 +3 2727 2726 538 +3 536 2724 2725 +3 2724 257 2725 +3 1493 1492 334 +3 1858 1246 1859 +3 1025 54 1263 +3 1493 336 1494 +3 143 1493 1494 +3 2306 2309 2305 +3 2309 1500 2305 +3 26 2058 2059 +3 140 908 909 +3 1879 1878 189 +3 430 23 2308 +3 1498 1495 75 +3 90 1497 336 +3 234 151 852 +3 447 187 1497 +3 90 447 1497 +3 1025 455 54 +3 1495 1498 2056 +3 1498 141 2056 +3 2136 2130 357 +3 2308 2314 428 +3 2138 114 362 +3 771 888 887 +3 2294 2295 865 +3 2294 880 2295 +3 2322 2323 1622 +3 2686 865 1109 +3 463 563 562 +3 1506 1513 558 +3 1513 1506 559 +3 466 561 1505 +3 559 1505 1507 +3 1355 1511 179 +3 523 1220 1517 +3 2129 2148 114 +3 2704 2703 2658 +3 2705 2704 784 +3 2657 1506 2658 +3 1506 784 2658 +3 1440 2713 1434 +3 2594 1440 1434 +3 2660 466 2659 +3 556 1510 529 +3 1509 1510 556 +3 1509 179 1510 +3 1508 1512 559 +3 1509 1512 1508 +3 2703 466 2658 +3 2703 2659 466 +3 1726 2009 579 +3 579 2009 2010 +3 1222 574 575 +3 2707 418 2708 +3 2705 785 2704 +3 557 1514 1512 +3 2435 2434 847 +3 1786 501 1787 +3 1510 1511 529 +3 179 1511 1510 +3 530 2721 2723 +3 2721 531 2723 +3 536 530 2724 +3 730 749 731 +3 730 563 749 +3 625 1513 1514 +3 1514 1513 1512 +3 2129 2147 2148 +3 452 562 1351 +3 1207 2741 1206 +3 2251 420 1553 +3 295 2058 2057 +3 806 2243 807 +3 393 806 807 +3 269 268 2149 +3 486 389 2575 +3 389 509 2575 +3 1561 488 2238 +3 408 1145 2240 +3 408 1144 1145 +3 144 2132 2131 +3 787 1821 2653 +3 1445 2255 1444 +3 1554 1559 421 +3 792 1520 1522 +3 2708 1435 191 +3 1545 1542 55 +3 1542 1541 55 +3 2222 2756 2761 +3 1546 1541 1542 +3 1536 1541 1546 +3 2231 2230 1521 +3 2691 905 2689 +3 2515 1031 1032 +3 2325 1627 723 +3 1528 792 1522 +3 583 1645 1644 +3 1527 1524 422 +3 303 152 304 +3 2690 2694 2695 +3 2697 301 2688 +3 1164 1121 288 +3 2677 1121 1164 +3 1532 982 1533 +3 1530 1532 1533 +3 434 2491 1474 +3 2057 2058 294 +3 299 298 295 +3 791 1525 1531 +3 2541 1631 2542 +3 1555 1570 1588 +3 1572 1555 1588 +3 1999 253 2600 +3 421 1551 1550 +3 2585 2584 1568 +3 2584 2585 1567 +3 789 1536 1569 +3 704 1026 1945 +3 982 983 1534 +3 2059 2058 295 +3 2541 2540 1631 +3 2064 2057 321 +3 1531 1539 1535 +3 1539 1531 1538 +3 2057 2064 295 +3 1937 1942 108 +3 1406 2329 1403 +3 2329 2328 1403 +3 282 281 47 +3 1723 215 87 +3 1546 1548 1569 +3 1551 789 1549 +3 2670 1948 2669 +3 1562 791 1535 +3 1587 1589 1571 +3 1543 1544 513 +3 1552 1557 790 +3 1097 578 1947 +3 578 1097 1725 +3 1547 1548 1564 +3 1548 1547 1549 +3 1560 793 1559 +3 1622 2324 1623 +3 2324 723 1623 +3 498 1 1556 +3 1546 1537 1548 +3 677 678 637 +3 677 1634 678 +3 513 1537 1543 +3 1942 12 293 +3 293 12 282 +3 1540 1539 55 +3 1543 1542 1545 +3 1543 1537 1542 +3 1545 55 1534 +3 1539 1534 55 +3 798 420 797 +3 422 1544 983 +3 512 1553 420 +3 1557 1558 790 +3 1937 1938 12 +3 421 1552 1551 +3 131 132 134 +3 1544 1543 983 +3 1054 880 2294 +3 1534 983 1545 +3 1540 1535 1539 +3 1536 1535 1540 +3 843 842 2588 +3 1565 1564 513 +3 1537 1546 1542 +3 512 420 514 +3 1567 1565 1563 +3 1565 1567 1564 +3 1591 2610 16 +3 1556 1 1560 +3 498 1556 786 +3 1946 1948 701 +3 2323 2324 1622 +3 321 2063 109 +3 1552 421 1557 +3 1579 1580 516 +3 1569 1536 1546 +3 1162 23 78 +3 2587 2584 1563 +3 2587 1568 2584 +3 1551 1552 789 +3 1171 640 1632 +3 422 1553 1544 +3 1558 1521 790 +3 2254 795 2234 +3 1120 1951 2218 +3 512 1544 1553 +3 1549 789 1569 +3 2609 16 2610 +3 2281 2364 2365 +3 234 552 78 +3 1121 961 2187 +3 1554 1550 1555 +3 2460 2577 843 +3 499 2614 1578 +3 2614 499 1768 +3 494 1450 1453 +3 482 1464 1466 +3 794 2232 1558 +3 796 2252 2251 +3 793 794 1558 +3 504 2601 2602 +3 2613 504 2602 +3 488 2239 2238 +3 1905 151 431 +3 1 1561 1560 +3 1 851 1561 +3 1561 851 488 +3 2063 2057 294 +3 1552 1562 789 +3 790 1521 1562 +3 506 1591 1592 +3 1550 1551 2586 +3 2586 2585 1568 +3 1570 1568 2587 +3 1550 1568 1555 +3 1555 1574 786 +3 1569 1548 1549 +3 2603 2613 2602 +3 1574 2606 786 +3 787 788 1821 +3 1554 421 1550 +3 1565 1566 507 +3 1566 1565 513 +3 1544 1566 513 +3 843 2588 1074 +3 2586 1568 1550 +3 982 1532 1594 +3 281 12 1938 +3 1567 1563 2584 +3 1570 1555 1568 +3 2491 1444 1474 +3 1555 1572 1574 +3 976 211 975 +3 2604 1575 2605 +3 507 1591 1590 +3 46 976 203 +3 516 505 515 +3 1573 2618 2608 +3 1582 1581 499 +3 684 2289 2288 +3 951 1232 1231 +3 1575 515 2605 +3 1790 505 1789 +3 2319 2317 691 +3 2287 2282 2283 +3 1779 2753 1800 +3 572 1779 1800 +3 206 205 59 +3 1577 2612 2614 +3 1768 1577 2614 +3 2611 2601 504 +3 69 129 125 +3 1583 1582 938 +3 2742 277 64 +3 1580 505 516 +3 218 1995 923 +3 1581 1768 499 +3 1708 2341 1707 +3 2659 785 2661 +3 1772 240 526 +3 240 527 526 +3 2170 1045 2166 +3 1064 871 2505 +3 238 555 543 +3 1230 949 1228 +3 876 2158 2157 +3 1809 1810 222 +3 862 1809 222 +3 979 972 2097 +3 972 2098 2097 +3 972 978 2098 +3 1817 1739 183 +3 2287 2283 2284 +3 1050 2172 1051 +3 2164 2160 2167 +3 2160 1048 2167 +3 848 1900 1899 +3 2357 2353 614 +3 2342 2102 51 +3 2342 156 2102 +3 183 949 1817 +3 578 1948 1947 +3 1620 714 3 +3 446 2326 1457 +3 2671 2674 580 +3 1709 2747 56 +3 1121 2677 1120 +3 517 1580 1579 +3 1585 2772 2771 +3 1300 1302 1319 +3 1707 1583 572 +3 1789 505 2268 +3 1781 1583 938 +3 543 545 212 +3 1200 1224 1209 +3 1563 1565 1589 +3 507 1566 1592 +3 1590 1589 507 +3 1571 1589 1590 +3 786 1554 1555 +3 507 1592 1591 +3 1554 786 1556 +3 604 788 787 +3 1554 1556 1559 +3 1556 1560 1559 +3 1588 1571 1593 +3 1590 1593 1571 +3 1590 16 1593 +3 2217 2216 1949 +3 1527 1594 1526 +3 1594 1523 1526 +3 2400 2401 2402 +3 2324 2323 2325 +3 1132 639 2150 +3 1978 1598 940 +3 1598 1979 940 +3 1980 1979 1598 +3 926 1683 1681 +3 1838 458 1020 +3 1156 1292 2301 +3 940 1976 1975 +3 1598 1599 27 +3 869 1669 1670 +3 2597 1595 2599 +3 2643 31 1682 +3 1828 1825 1826 +3 1829 28 1830 +3 1113 1957 1958 +3 1963 1954 1118 +3 2559 42 1831 +3 1599 1598 1597 +3 101 2550 2549 +3 2264 1287 1286 +3 1801 1272 2264 +3 1277 1286 1287 +3 1294 1158 1295 +3 1611 1155 1154 +3 2194 2227 2226 +3 206 58 205 +3 58 2490 205 +3 966 1605 1606 +3 966 1606 1155 +3 2087 2086 968 +3 2086 974 968 +3 2084 2083 919 +3 311 153 307 +3 958 471 1609 +3 232 958 1609 +3 1013 2207 1119 +3 1604 966 1601 +3 966 1602 1601 +3 2227 1005 2192 +3 1607 1152 1309 +3 1152 1607 1605 +3 1606 1605 1607 +3 143 1002 1491 +3 1609 1312 232 +3 470 1312 1609 +3 1311 1312 470 +3 1013 2261 2260 +3 1617 127 139 +3 2008 883 2007 +3 503 2610 506 +3 1614 1616 1615 +3 125 1615 69 +3 1615 125 1618 +3 1764 1072 1763 +3 2774 136 379 +3 694 2008 882 +3 2257 2008 694 +3 2015 2033 2031 +3 73 1617 139 +3 73 132 131 +3 2214 2534 2216 +3 2534 1949 2216 +3 130 73 131 +3 130 1617 73 +3 129 69 130 +3 71 129 130 +3 2002 248 2003 +3 2669 1948 578 +3 2668 2669 578 +3 126 1614 1615 +3 217 554 916 +3 318 321 109 +3 141 1499 2054 +3 2534 2219 2228 +3 961 2534 2228 +3 2284 2283 3 +3 689 1092 2466 +3 2465 690 1091 +3 1634 1633 640 +3 677 676 1633 +3 676 677 636 +3 1632 640 1633 +3 472 1612 2260 +3 2544 2545 2546 +3 2363 2544 2546 +3 723 1628 642 +3 721 642 1629 +3 1630 386 453 +3 1624 1623 716 +3 1102 2463 2462 +3 2458 1102 2462 +3 1173 2543 2363 +3 962 1101 1100 +3 1101 2462 1100 +3 963 68 254 +3 722 1131 642 +3 1623 723 642 +3 1103 2459 2458 +3 2459 1102 2458 +3 1461 1630 454 +3 2579 830 2236 +3 2067 299 2065 +3 2070 2068 110 +3 2068 2070 303 +3 2067 2065 110 +3 2691 300 2692 +3 2446 45 2445 +3 152 2070 320 +3 320 2070 110 +3 111 2691 2692 +3 2362 2363 1172 +3 678 1634 640 +3 1621 1622 1623 +3 2183 2260 1612 +3 2257 2259 1919 +3 2257 694 2259 +3 438 1635 1405 +3 2667 2671 700 +3 1920 2259 694 +3 1413 1414 1412 +3 1635 438 1430 +3 1435 1434 2714 +3 1324 1323 401 +3 1650 1324 401 +3 1145 393 807 +3 711 1641 710 +3 1291 1159 1652 +3 502 938 499 +3 401 1646 1648 +3 1649 401 1648 +3 1647 608 1646 +3 2559 62 167 +3 2634 802 2626 +3 1647 1646 1323 +3 1648 1646 1643 +3 608 612 583 +3 1644 608 583 +3 1642 1643 584 +3 585 2634 2626 +3 2627 2629 2632 +3 585 2627 2632 +3 586 1649 2626 +3 802 586 2626 +3 1647 394 612 +3 612 608 1647 +3 394 1647 609 +3 2489 1036 1035 +3 613 2348 2349 +3 609 1647 1323 +3 401 1649 1650 +3 1654 1656 1276 +3 1649 586 1651 +3 1649 1651 1650 +3 2564 1735 1742 +3 2408 1011 2407 +3 1277 1653 1286 +3 1275 1276 1656 +3 1159 1654 1652 +3 1652 1654 1276 +3 157 479 120 +3 159 157 120 +3 479 121 120 +3 2101 82 158 +3 1293 1294 1288 +3 1660 1659 1278 +3 1899 496 1770 +3 1654 1278 1656 +3 1655 1660 1278 +3 1970 1969 1275 +3 1329 588 760 +3 2100 159 2101 +3 159 52 2101 +3 1486 82 2101 +3 2117 227 2114 +3 1294 2103 1158 +3 1662 1454 387 +3 1474 1661 1470 +3 2124 1304 2122 +3 1660 1655 1292 +3 1470 1662 387 +3 1663 1378 1377 +3 1378 1663 764 +3 2425 2422 759 +3 2425 757 2422 +3 1664 891 1665 +3 891 1664 1663 +3 1664 764 1663 +3 2421 2417 404 +3 889 884 764 +3 2417 2421 2426 +3 1667 1668 1666 +3 1668 1667 859 +3 1814 1812 863 +3 1666 861 1036 +3 2686 1109 867 +3 1029 861 1028 +3 1668 859 218 +3 1371 1365 775 +3 861 1668 1028 +3 1677 2175 2174 +3 2176 1677 2174 +3 1670 1669 1039 +3 1044 1675 1674 +3 1675 1043 1674 +3 958 232 2179 +3 46 550 976 +3 1675 1050 1034 +3 1845 1241 1846 +3 2162 1671 870 +3 872 1049 1056 +3 1671 1670 1039 +3 2295 1059 2296 +3 1059 2295 876 +3 1095 2502 702 +3 1722 1721 154 +3 874 1675 1034 +3 2174 2173 1044 +3 2176 2174 1044 +3 1122 1123 1943 +3 1037 874 1032 +3 1045 1670 1671 +3 874 1043 1675 +3 1834 262 1753 +3 1670 1676 869 +3 1670 1045 1676 +3 2335 946 947 +3 946 945 947 +3 201 4 1679 +3 1673 1678 1674 +3 2018 116 2023 +3 519 1774 2702 +3 662 663 606 +3 2664 692 2666 +3 1890 90 334 +3 1687 660 681 +3 1729 197 323 +3 2568 2567 343 +3 387 1458 2764 +3 2643 1682 9 +3 200 199 201 +3 2343 200 201 +3 119 118 122 +3 250 941 85 +3 250 1976 941 +3 1999 1998 253 +3 681 660 682 +3 2647 195 2648 +3 2008 2007 882 +3 175 1683 926 +3 927 175 926 +3 1686 1684 1682 +3 32 2035 2034 +3 32 2036 2035 +3 1614 1698 2050 +3 1595 2598 2599 +3 1683 1686 1681 +3 1866 1262 1873 +3 1262 1858 1873 +3 2017 2023 935 +3 1848 1250 1244 +3 1400 2527 1408 +3 1923 881 648 +3 679 632 1688 +3 679 667 632 +3 679 1688 1687 +3 675 679 1687 +3 603 1068 1069 +3 1688 632 707 +3 1852 1252 1850 +3 1882 2442 2437 +3 1861 1860 1246 +3 1693 1519 1517 +3 1519 1208 1517 +3 1220 1693 1517 +3 524 1691 1693 +3 1772 1771 521 +3 938 1782 1781 +3 1696 1318 375 +3 1657 1694 1279 +3 1657 228 1694 +3 1658 228 1657 +3 1281 1694 228 +3 1696 1695 1281 +3 1059 876 2156 +3 1326 1085 1697 +3 1096 703 1095 +3 1698 338 339 +3 1698 1395 338 +3 126 1395 1698 +3 126 1698 1614 +3 1706 1705 508 +3 1300 370 2369 +3 1436 1700 1135 +3 1700 1436 1418 +3 1582 1702 1586 +3 1581 1582 1586 +3 2007 893 765 +3 883 893 2007 +3 1418 2623 2620 +3 952 815 1183 +3 1817 950 1739 +3 2269 2275 1325 +3 2275 2269 2270 +3 1679 202 2455 +3 1790 1788 501 +3 1583 1703 1702 +3 379 378 2774 +3 2738 244 2737 +3 1711 172 1484 +3 1302 1711 1484 +3 826 2127 822 +3 2490 7 205 +3 2733 2734 79 +3 2474 2473 2472 +3 2471 2474 2472 +3 833 2575 490 +3 833 2676 2575 +3 1214 1211 1212 +3 849 2736 852 +3 2729 531 532 +3 2341 1584 1704 +3 1707 2341 1704 +3 2266 1584 2339 +3 2341 2340 1584 +3 2280 2430 2293 +3 156 2100 2102 +3 2100 158 2102 +3 171 83 224 +3 171 1711 83 +3 243 822 2127 +3 821 822 243 +3 172 1711 1712 +3 82 1486 1487 +3 1732 997 996 +3 1721 1719 154 +3 1713 171 1714 +3 1719 64 154 +3 171 1712 1711 +3 1476 1285 2381 +3 701 2670 708 +3 82 170 169 +3 272 98 273 +3 17 269 1715 +3 823 821 478 +3 155 1720 1717 +3 2448 1027 2075 +3 2447 2446 2448 +3 1717 263 1716 +3 263 1717 1718 +3 1719 1718 264 +3 1719 24 1718 +3 64 1719 264 +3 24 263 1718 +3 2075 7 2448 +3 2447 2448 7 +3 209 2083 2084 +3 38 209 2084 +3 266 1721 1723 +3 1721 266 24 +3 266 1723 87 +3 2645 2644 9 +3 1722 214 215 +3 1721 1722 1723 +3 1758 1759 340 +3 1714 1724 1713 +3 1724 1714 1716 +3 1716 170 1724 +3 1097 698 1725 +3 2675 1637 1638 +3 1637 1639 582 +3 576 1151 1223 +3 576 2472 1151 +3 994 2036 2042 +3 2010 1639 699 +3 2010 2009 1639 +3 1639 1640 699 +3 1578 2603 503 +3 2170 1677 1045 +3 2172 2171 1047 +3 2038 2024 2037 +3 261 259 1752 +3 820 243 844 +3 1729 1730 37 +3 323 1730 1729 +3 325 1333 328 +3 1333 325 1734 +3 1736 1731 325 +3 1733 1731 323 +3 1744 323 99 +3 2230 2574 1520 +3 792 2230 1520 +3 2564 2565 2573 +3 2565 2564 345 +3 325 1738 1737 +3 1743 326 340 +3 93 917 918 +3 260 341 1754 +3 1743 324 1744 +3 36 1738 1739 +3 1730 1732 37 +3 37 1732 996 +3 38 344 215 +3 325 328 1738 +3 1733 324 1735 +3 1126 337 332 +3 2573 2565 2569 +3 1741 1331 216 +3 1041 2512 875 +3 213 1333 1334 +3 36 997 1737 +3 340 1745 1742 +3 345 1745 1746 +3 1741 1332 1331 +3 2746 2750 2748 +3 2750 2746 1780 +3 1737 1738 36 +3 1070 1393 631 +3 1392 692 1818 +3 1891 2 494 +3 1889 335 1890 +3 355 1891 494 +3 36 1739 950 +3 1741 328 1332 +3 1072 226 1763 +3 1739 1738 328 +3 1740 1739 328 +3 1741 1740 328 +3 916 216 918 +3 216 1740 1741 +3 2142 144 2651 +3 1742 1743 340 +3 326 1743 1744 +3 99 326 1744 +3 327 326 99 +3 1754 337 77 +3 1734 325 2570 +3 2569 88 2571 +3 2570 2569 2571 +3 1750 343 2567 +3 342 1750 2567 +3 460 1421 1399 +3 1751 259 65 +3 260 1749 1748 +3 342 1748 1749 +3 1749 65 1750 +3 1750 342 1749 +3 2431 2430 2291 +3 327 99 351 +3 77 261 1752 +3 260 1752 1751 +3 341 1753 1754 +3 1753 1755 1754 +3 347 330 346 +3 1758 329 1757 +3 331 1141 1490 +3 1756 331 1490 +3 1141 89 1490 +3 1491 1490 89 +3 1492 1491 89 +3 1141 1140 89 +3 1753 262 1755 +3 948 330 181 +3 948 1140 330 +3 1850 1849 1244 +3 1850 1252 1849 +3 2020 2030 2029 +3 2030 2019 2029 +3 2018 2023 2017 +3 262 1759 1758 +3 262 1758 1757 +3 948 333 1140 +3 33 1762 327 +3 1762 326 327 +3 1762 33 1761 +3 329 1762 1761 +3 1613 475 2116 +3 1072 1073 226 +3 472 1116 1613 +3 40 103 104 +3 1115 292 1072 +3 4 931 1766 +3 1765 1072 1764 +3 1612 472 1613 +3 4 1766 202 +3 927 1685 202 +3 1766 927 202 +3 129 70 125 +3 931 4 932 +3 929 1767 928 +3 121 70 129 +3 1777 571 570 +3 549 92 967 +3 517 1769 1581 +3 1586 517 1581 +3 1769 517 1579 +3 1776 1777 570 +3 2658 784 2704 +3 2662 178 2707 +3 242 2768 1130 +3 496 521 1770 +3 1327 590 2269 +3 1353 569 527 +3 1773 1772 521 +3 1772 1773 240 +3 163 1894 19 +3 1774 525 1775 +3 1710 2747 1709 +3 530 239 526 +3 1786 518 501 +3 1208 1519 2738 +3 571 1777 1778 +3 2751 1710 2336 +3 1787 1788 1798 +3 2752 2749 2751 +3 1800 2752 2751 +3 571 2754 2755 +3 610 394 609 +3 502 500 1218 +3 938 502 1782 +3 1327 2269 1325 +3 2657 2658 466 +3 1776 1783 1777 +3 1505 2657 466 +3 1518 1208 2740 +3 1775 2517 523 +3 523 1799 1775 +3 382 383 361 +3 1211 2737 244 +3 1774 1775 1799 +3 1786 1787 519 +3 1789 2268 2267 +3 2336 2337 1708 +3 505 1790 498 +3 1580 2268 505 +3 501 498 1790 +3 502 520 1782 +3 521 496 1791 +3 1705 1706 2773 +3 1791 1792 518 +3 1791 496 1792 +3 2333 2520 2523 +3 2517 1775 2516 +3 2517 2516 1783 +3 2519 2332 1409 +3 2738 1519 244 +3 313 2371 2372 +3 2266 1709 2267 +3 1780 1795 1796 +3 2523 1410 2524 +3 1793 1794 1778 +3 1777 1793 1778 +3 1798 1774 519 +3 1787 1798 519 +3 1795 1784 1796 +3 56 1797 1788 +3 526 239 522 +3 525 1797 1796 +3 1796 1797 1780 +3 2752 2753 939 +3 1788 1797 1798 +3 525 1798 1797 +3 313 372 2371 +3 2262 2263 1272 +3 1272 1803 2262 +3 1274 1269 367 +3 372 2370 2371 +3 661 605 1804 +3 661 685 605 +3 2419 1188 763 +3 2611 1576 2601 +3 1804 605 633 +3 605 634 633 +3 633 1806 1805 +3 643 1805 1806 +3 643 1806 602 +3 1384 643 602 +3 688 962 1092 +3 1824 962 688 +3 1383 643 1384 +3 606 1808 1807 +3 1125 1824 656 +3 1809 862 1811 +3 708 2672 2630 +3 652 759 2665 +3 652 1925 757 +3 699 1640 2667 +3 980 1619 1810 +3 1810 1619 546 +3 104 2342 51 +3 218 923 1028 +3 219 1811 1812 +3 1816 972 979 +3 1054 1055 1053 +3 2327 2328 1407 +3 474 2182 2190 +3 1230 950 1817 +3 2289 1503 2288 +3 1508 559 1507 +3 1082 1823 687 +3 42 8 1825 +3 1080 95 1081 +3 689 1820 688 +3 1819 688 1820 +3 94 577 576 +3 634 605 697 +3 2656 634 697 +3 634 2656 2654 +3 664 1385 1386 +3 601 1821 788 +3 962 1824 1125 +3 1955 1952 1117 +3 1827 80 1599 +3 1979 941 1976 +3 80 57 40 +3 1827 57 80 +3 1831 1829 1832 +3 1831 62 2559 +3 1745 1834 1746 +3 1826 1827 28 +3 1827 1599 28 +3 292 1115 1957 +3 1827 1826 57 +3 1832 62 1831 +3 42 1828 1829 +3 1828 28 1829 +3 1828 1826 28 +3 1415 2621 1429 +3 2622 2621 1415 +3 1759 1745 340 +3 1745 1759 1834 +3 1888 1889 49 +3 1595 1975 1976 +3 57 107 40 +3 42 1829 1831 +3 100 2561 2560 +3 8 2561 100 +3 2550 100 2560 +3 102 29 103 +3 1832 1833 43 +3 78 203 1027 +3 2335 49 948 +3 2334 2335 948 +3 946 2335 2334 +3 1838 1020 1239 +3 1837 1838 1239 +3 535 1887 1888 +3 738 457 739 +3 1839 1840 1242 +3 458 1842 1022 +3 1844 1241 1845 +3 1844 1843 1241 +3 1841 1255 1023 +3 1229 423 985 +3 2494 1240 2493 +3 1240 1843 2493 +3 1836 1240 2494 +3 2494 2493 1837 +3 1849 1848 1244 +3 1847 1848 1251 +3 1245 1855 1260 +3 1247 1427 1869 +3 1844 1845 1840 +3 1843 1240 739 +3 1241 1843 739 +3 739 1846 1241 +3 1245 1252 1852 +3 78 552 203 +3 2020 2022 932 +3 347 423 181 +3 2139 2146 362 +3 2146 2138 362 +3 1849 1252 1251 +3 1851 1850 1244 +3 1851 1689 1850 +3 1254 1253 1851 +3 1253 1689 1851 +3 1847 1250 1848 +3 1260 1855 54 +3 1245 1853 1854 +3 1853 1245 1852 +3 1855 1245 1854 +3 1869 1876 1248 +3 333 334 1492 +3 1139 1140 1141 +3 330 1140 1139 +3 1253 1862 1261 +3 1862 1246 1261 +3 1857 1854 1853 +3 1856 1857 1853 +3 1852 1689 1853 +3 1261 1857 1856 +3 1246 1858 1261 +3 1858 1857 1261 +3 1266 1247 1868 +3 1253 1261 1856 +3 1864 1264 1863 +3 769 1909 895 +3 1858 1859 1873 +3 25 2053 2052 +3 1859 1246 1860 +3 1249 1862 456 +3 1249 1861 1862 +3 895 1907 1906 +3 436 1461 454 +3 1266 1868 1867 +3 1863 1859 1860 +3 1266 1863 1860 +3 1864 1863 1867 +3 1266 1867 1863 +3 1866 1264 1865 +3 1859 1863 1264 +3 349 139 908 +3 1868 1248 1870 +3 2051 2052 140 +3 1872 1396 443 +3 1872 1865 1265 +3 1865 1872 443 +3 1872 1265 1871 +3 1871 1396 1872 +3 1264 1866 1873 +3 1873 1859 1264 +3 1858 1262 1857 +3 1875 1876 1399 +3 1248 1874 1870 +3 1876 460 1399 +3 460 1876 1869 +3 2440 2441 1879 +3 1874 1877 1871 +3 1398 1877 1874 +3 1877 1396 1871 +3 318 1163 321 +3 1495 2055 143 +3 1398 1874 1875 +3 1874 1248 1875 +3 1879 2439 2440 +3 1875 1423 1882 +3 1398 1875 1882 +3 1879 1397 1880 +3 1878 1879 1880 +3 1869 1427 460 +3 442 1397 1879 +3 1878 1396 1877 +3 45 2447 1935 +3 2438 189 2437 +3 1881 1398 1882 +3 1883 365 752 +3 133 1884 1883 +3 1884 364 1883 +3 134 364 1884 +3 198 2043 2049 +3 1698 339 2050 +3 2498 2499 1042 +3 1128 877 2498 +3 877 2499 2498 +3 960 2677 1164 +3 2641 2640 1886 +3 1885 194 35 +3 2027 198 2048 +3 2040 2024 2039 +3 214 1722 910 +3 539 2730 533 +3 857 223 856 +3 1887 448 335 +3 948 49 1889 +3 333 948 1889 +3 335 1889 1888 +3 1890 333 1889 +3 334 333 1890 +3 335 90 1890 +3 1895 1897 19 +3 101 2549 2548 +3 532 2735 2730 +3 1006 2204 2203 +3 164 71 165 +3 121 71 164 +3 119 70 121 +3 121 129 71 +3 479 20 119 +3 134 1884 1896 +3 1884 468 1896 +3 468 1884 133 +3 19 1894 1895 +3 1423 2442 1882 +3 1423 2443 2442 +3 177 531 2721 +3 531 177 567 +3 160 19 1479 +3 134 132 364 +3 1488 1481 369 +3 1770 848 1899 +3 850 495 851 +3 1903 241 849 +3 241 1903 848 +3 1901 848 1903 +3 1900 1901 391 +3 1902 1904 433 +3 1902 1901 1904 +3 86 1985 2245 +3 86 1987 1985 +3 148 485 1902 +3 497 850 851 +3 495 488 851 +3 2648 2646 2647 +3 1903 1904 1901 +3 1904 1905 433 +3 793 1561 794 +3 849 1905 1904 +3 849 151 1905 +3 849 852 151 +3 1137 187 445 +3 883 894 893 +3 893 894 771 +3 894 1906 771 +3 769 895 1375 +3 894 895 1906 +3 1375 895 894 +3 1178 768 1908 +3 1908 768 1907 +3 1249 1247 1861 +3 1909 772 1178 +3 1488 2720 1477 +3 191 2716 461 +3 1929 650 1928 +3 1933 650 1929 +3 1394 1384 645 +3 2424 763 591 +3 2341 1708 2340 +3 649 630 1914 +3 630 649 1918 +3 758 1925 1928 +3 671 666 667 +3 2260 474 2191 +3 649 891 1921 +3 1924 1923 648 +3 630 1920 1917 +3 1921 1919 649 +3 474 2190 2191 +3 2262 1318 1696 +3 764 884 885 +3 884 881 882 +3 885 884 882 +3 762 1917 1920 +3 934 2018 2017 +3 1026 2577 2576 +3 1916 1917 1922 +3 1917 762 1922 +3 630 1917 1916 +3 814 815 409 +3 1188 1187 696 +3 1923 1922 762 +3 2019 116 2018 +3 1700 2622 1419 +3 1923 1924 758 +3 1913 1934 1912 +3 1916 1927 1930 +3 1927 1928 1930 +3 1931 1930 650 +3 1930 1928 650 +3 1390 1933 1391 +3 1916 1930 1931 +3 1915 1916 1931 +3 1407 1400 1408 +3 2528 2527 1400 +3 1933 1929 1391 +3 595 665 1071 +3 1931 1934 1915 +3 1932 1933 629 +3 1932 629 1912 +3 1913 1912 646 +3 112 45 1935 +3 1932 650 1933 +3 2621 1418 2620 +3 1913 1915 1934 +3 1936 13 1937 +3 1937 13 1938 +3 1967 2491 1443 +3 1473 1967 1443 +3 108 1941 1940 +3 1942 293 1941 +3 108 1942 1941 +3 1940 1939 108 +3 2247 2246 1985 +3 2278 1064 2503 +3 1527 983 982 +3 1944 1943 702 +3 1944 1945 1943 +3 2670 701 1948 +3 2503 2276 2278 +3 1335 289 959 +3 959 289 960 +3 2533 139 2532 +3 2222 2761 2225 +3 1625 2325 2323 +3 703 1097 1947 +3 1946 1947 1948 +3 2576 2577 1122 +3 1062 2511 1128 +3 1944 1946 1945 +3 1946 704 1945 +3 1172 2363 2546 +3 635 678 640 +3 701 704 1946 +3 449 2326 446 +3 1955 1953 1952 +3 1164 959 960 +3 1120 1949 1121 +3 1949 961 1121 +3 1117 1952 1120 +3 1115 1114 1958 +3 292 1956 1117 +3 2186 1004 2223 +3 2197 1005 2193 +3 1012 2199 1011 +3 1113 1964 1956 +3 2221 2188 2220 +3 1111 290 1954 +3 1953 1954 290 +3 2144 359 358 +3 359 2652 358 +3 1114 350 1959 +3 1111 1954 1112 +3 1962 1965 1960 +3 1965 1962 1959 +3 1956 292 1957 +3 2226 2227 2678 +3 1964 1113 1962 +3 1964 1962 1963 +3 1956 1964 1955 +3 1965 1959 350 +3 42 15 8 +3 1959 1113 1958 +3 1112 1960 1961 +3 2561 15 2558 +3 1960 350 1961 +3 166 2558 2557 +3 2561 2558 166 +3 8 15 2561 +3 1963 1118 1964 +3 388 1451 1452 +3 414 1446 1966 +3 1445 1966 1446 +3 1652 1276 1968 +3 1653 1652 1968 +3 1201 1199 2353 +3 1201 1202 1199 +3 1969 1276 1275 +3 373 1653 1969 +3 1653 373 1286 +3 1653 1968 1969 +3 1968 1276 1969 +3 2557 2554 2553 +3 1286 373 1274 +3 348 63 2556 +3 1971 348 2556 +3 31 200 2343 +3 2457 31 2343 +3 2596 1595 2597 +3 62 1832 43 +3 681 2150 639 +3 1977 940 1975 +3 1977 1974 1596 +3 1977 1975 1974 +3 1596 43 1833 +3 2640 2641 18 +3 1596 1974 1973 +3 1975 1595 1974 +3 1596 1973 43 +3 1980 941 1979 +3 1982 1981 942 +3 1981 1982 1980 +3 1978 940 1977 +3 1597 1978 1977 +3 1833 1597 1596 +3 1830 1597 1833 +3 2247 85 2246 +3 942 2246 1982 +3 2245 2246 942 +3 2648 195 995 +3 18 1885 2640 +3 1885 18 2645 +3 169 1986 1984 +3 1983 169 1984 +3 420 2251 2252 +3 685 680 605 +3 1991 904 322 +3 1194 1193 322 +3 1193 1989 322 +3 80 81 1981 +3 80 1981 27 +3 1981 1980 27 +3 1982 941 1980 +3 2247 128 965 +3 85 941 1982 +3 1988 65 258 +3 2697 2698 301 +3 897 2698 2697 +3 1988 258 128 +3 1981 1983 942 +3 1981 81 1983 +3 965 85 2247 +3 1984 942 1983 +3 2233 795 2254 +3 169 81 168 +3 81 169 1983 +3 265 1502 86 +3 1502 1987 86 +3 169 170 1986 +3 1988 128 1987 +3 197 1728 1684 +3 1750 65 1988 +3 267 1750 1988 +3 87 1750 267 +3 267 1988 1987 +3 796 2250 2249 +3 799 2249 2250 +3 1992 1379 886 +3 588 1329 2273 +3 2270 587 1326 +3 1573 2608 2609 +3 1328 1327 1325 +3 1992 892 1379 +3 2611 2615 1994 +3 887 403 1993 +3 892 1992 403 +3 1992 1993 403 +3 2298 2619 290 +3 2619 2298 1951 +3 218 1997 1995 +3 1106 2453 5 +3 1996 1997 924 +3 1766 1767 927 +3 2454 1215 1692 +3 2454 1216 1225 +3 1215 2454 1225 +3 524 2454 1692 +3 2454 524 1216 +3 963 251 252 +3 964 907 963 +3 348 1998 2000 +3 247 348 2001 +3 63 348 247 +3 348 2000 2001 +3 2001 2000 41 +3 2001 2003 247 +3 1619 92 547 +3 2006 517 1586 +3 2005 2004 60 +3 247 2004 2005 +3 2004 248 60 +3 122 70 119 +3 248 2004 2003 +3 517 2006 1706 +3 2772 1585 2773 +3 2033 2017 935 +3 1367 1366 888 +3 2528 1416 2527 +3 2019 2018 934 +3 243 820 821 +3 1807 1806 633 +3 2345 2346 1202 +3 2631 2628 1638 +3 2016 2033 2034 +3 877 2500 2499 +3 923 2453 1106 +3 1040 2508 2506 +3 196 2027 2048 +3 1885 2027 196 +3 2048 198 2049 +3 2026 115 196 +3 35 2027 1885 +3 2044 2045 2026 +3 2045 2044 2025 +3 199 2047 201 +3 2016 934 2017 +3 2034 2033 2015 +3 2043 2038 2025 +3 2043 2039 2038 +3 96 987 986 +3 96 992 988 +3 1081 662 606 +3 933 2019 934 +3 2021 932 937 +3 2020 116 2030 +3 116 2019 2030 +3 2041 198 2028 +3 1679 2343 201 +3 1679 2457 2343 +3 2040 2039 2041 +3 61 993 994 +3 2042 2036 32 +3 202 1685 2455 +3 1699 2278 1063 +3 1998 1971 1972 +3 2044 2049 2043 +3 2041 2039 198 +3 1042 2500 1041 +3 2048 2026 196 +3 2029 2022 2020 +3 2022 2029 933 +3 2029 2019 933 +3 1503 1504 686 +3 2279 1503 686 +3 933 928 2022 +3 2014 2031 935 +3 2031 2033 935 +3 2035 2016 2034 +3 2035 988 2016 +3 2513 2507 1031 +3 2161 2160 2164 +3 2013 936 2014 +3 988 992 2016 +3 2511 877 1128 +3 1110 2296 875 +3 2512 1110 875 +3 2040 2042 32 +3 2015 2032 2024 +3 2032 2037 2024 +3 2032 936 2037 +3 2502 1944 702 +3 1946 1944 2530 +3 2451 920 2450 +3 994 993 2036 +3 2015 2040 32 +3 32 2034 2015 +3 2040 2015 2024 +3 993 61 1001 +3 2037 936 2025 +3 2046 115 2045 +3 198 2039 2043 +3 868 1110 2512 +3 2042 2040 2041 +3 936 2045 2025 +3 1039 1063 1062 +3 1039 1062 870 +3 1669 1063 1039 +3 1601 1157 2409 +3 1045 1671 2166 +3 4 201 2047 +3 937 2047 2046 +3 2046 2047 115 +3 287 2758 2759 +3 878 2161 2164 +3 199 115 2047 +3 932 2047 937 +3 4 2047 932 +3 2309 2313 1500 +3 428 2313 2309 +3 2310 1500 2313 +3 26 1940 2058 +3 1940 294 2058 +3 2308 23 2311 +3 791 1531 1535 +3 113 2060 298 +3 2060 26 2059 +3 26 2061 1940 +3 1940 2061 1939 +3 2061 112 1939 +3 2062 112 2061 +3 427 112 2062 +3 112 427 45 +3 113 1500 2310 +3 2310 2062 113 +3 307 152 320 +3 2069 22 299 +3 299 295 2065 +3 2068 2069 2067 +3 2069 299 2067 +3 2068 2067 110 +3 343 215 344 +3 975 91 977 +3 2085 91 975 +3 205 204 2071 +3 479 157 20 +3 59 208 214 +3 208 59 2071 +3 22 1501 298 +3 1501 113 298 +3 152 303 2070 +3 2082 210 2078 +3 210 2082 2086 +3 2083 2079 919 +3 203 2074 1027 +3 204 2074 2073 +3 2075 2074 204 +3 1027 2074 2075 +3 2446 2445 1162 +3 2071 59 205 +3 2075 204 205 +3 7 2075 205 +3 24 1719 1721 +3 1422 1421 2449 +3 1421 1422 1399 +3 2080 2079 210 +3 214 2081 38 +3 549 211 548 +3 2081 209 38 +3 220 922 2080 +3 2078 2079 2083 +3 208 2077 2081 +3 2076 2077 208 +3 220 2091 970 +3 2078 2083 209 +3 2077 2078 209 +3 203 976 977 +3 157 156 20 +3 156 157 2100 +3 204 2072 2071 +3 2085 2082 91 +3 1317 1280 1156 +3 210 2086 2087 +3 2087 2088 2080 +3 2088 2087 968 +3 2087 2080 210 +3 549 967 2089 +3 968 549 2089 +3 968 2089 2088 +3 969 2090 967 +3 969 2091 2090 +3 2091 220 2090 +3 970 2093 971 +3 2072 208 2071 +3 206 59 207 +3 2095 92 981 +3 2097 221 979 +3 967 92 2095 +3 969 2094 2092 +3 11 58 206 +3 2095 981 221 +3 980 981 1619 +3 221 2094 2095 +3 969 2095 2094 +3 2686 2294 865 +3 2085 2099 2082 +3 2086 2099 974 +3 2082 2099 2086 +3 1317 225 2105 +3 1293 2103 1294 +3 2102 158 51 +3 2103 1293 1280 +3 2104 2103 1280 +3 1280 1317 2104 +3 1317 2105 2104 +3 1296 231 1295 +3 1297 2109 1313 +3 2108 229 2109 +3 1296 2108 2109 +3 2113 2112 1299 +3 2124 2125 224 +3 2110 1298 2106 +3 2105 2110 2106 +3 2108 2113 229 +3 1298 2112 2113 +3 2111 2112 1298 +3 1297 1296 2109 +3 231 1296 1297 +3 2106 2104 2105 +3 2105 1301 2110 +3 2123 2115 2116 +3 232 1312 285 +3 1298 2113 2108 +3 2124 2118 1304 +3 2118 2124 1306 +3 84 51 168 +3 227 2117 2118 +3 1301 2115 2114 +3 226 1073 2121 +3 1303 2119 2117 +3 2119 2118 2117 +3 2119 1304 2118 +3 1156 1280 1660 +3 1303 226 2119 +3 1303 1763 226 +3 2105 225 2116 +3 2105 2116 1301 +3 225 1613 2116 +3 1073 289 2121 +3 1336 289 1335 +3 2117 2115 1303 +3 297 2120 2121 +3 297 2122 2120 +3 2126 1715 171 +3 224 1306 2124 +3 82 169 168 +3 2125 1715 2126 +3 1714 171 1715 +3 171 224 2126 +3 2682 489 2681 +3 828 2682 826 +3 395 828 826 +3 826 2682 2127 +3 487 845 833 +3 1467 2148 481 +3 2148 2147 481 +3 2143 2139 362 +3 2135 2134 142 +3 787 2653 2656 +3 2502 2530 1944 +3 2502 703 2530 +3 302 359 896 +3 2700 302 896 +3 2537 1173 2362 +3 1891 2132 354 +3 1891 356 2132 +3 352 2134 2135 +3 354 2132 2133 +3 1508 1507 179 +3 2650 2651 385 +3 2133 2134 352 +3 2524 1411 2523 +3 2320 691 2315 +3 357 2129 2138 +3 1499 1498 142 +3 147 2306 429 +3 353 352 2135 +3 357 2138 2137 +3 2129 114 2138 +3 898 145 363 +3 2147 2130 2140 +3 155 2149 1720 +3 2149 268 1720 +3 300 2691 2693 +3 2149 155 1715 +3 2142 2133 144 +3 385 44 384 +3 2688 904 2697 +3 411 621 955 +3 2143 363 2139 +3 363 145 2139 +3 114 801 362 +3 242 825 2768 +3 2143 2304 146 +3 626 606 1807 +3 2689 905 2688 +3 301 2689 2688 +3 1528 1529 792 +3 2140 481 2147 +3 1715 269 2149 +3 268 269 97 +3 1132 2150 2151 +3 2150 681 2151 +3 659 1132 2151 +3 2152 1504 684 +3 2153 2152 684 +3 691 2317 2316 +3 2151 681 682 +3 2152 2151 682 +3 2283 2285 3 +3 1161 2285 2283 +3 714 2284 3 +3 659 2152 2153 +3 659 2151 2152 +3 1621 1623 1624 +3 1019 716 1131 +3 985 989 2154 +3 96 2154 989 +3 182 985 986 +3 2157 2156 876 +3 1060 870 1129 +3 293 109 2063 +3 1058 870 2155 +3 867 2685 2686 +3 2215 2216 2217 +3 287 1011 2194 +3 1059 2156 2155 +3 878 1671 2162 +3 2158 876 1049 +3 2166 1671 878 +3 872 1047 1048 +3 2160 1057 2159 +3 1110 865 2296 +3 2162 870 1058 +3 2169 2171 879 +3 2168 1048 1047 +3 2175 2169 879 +3 2175 2170 2169 +3 2176 1676 1677 +3 2170 1046 2169 +3 2279 2293 2282 +3 2293 1161 2282 +3 1044 2173 1675 +3 2173 1050 1675 +3 1201 2345 1202 +3 1204 1203 2351 +3 1201 2344 2345 +3 1318 2262 1803 +3 1678 1676 2178 +3 1676 1678 869 +3 2179 286 959 +3 286 1335 959 +3 2181 958 2180 +3 2180 958 2179 +3 959 2180 2179 +3 2222 1004 2760 +3 1898 19 1897 +3 2220 2188 2228 +3 2759 1961 287 +3 2266 2267 508 +3 2181 2182 958 +3 958 2183 471 +3 958 2182 2183 +3 2182 474 2183 +3 2698 898 301 +3 1420 2449 1400 +3 2449 2528 1400 +3 894 883 770 +3 2186 1005 1003 +3 2185 2186 1003 +3 2202 1009 2205 +3 966 1604 1605 +3 1008 1005 2197 +3 2188 1004 2187 +3 2184 2190 2182 +3 711 1094 2562 +3 711 1095 1094 +3 2181 2180 288 +3 2187 2185 288 +3 2195 2220 2229 +3 2198 1008 2197 +3 2230 792 1525 +3 2407 2406 2198 +3 1112 2759 1007 +3 2579 831 2679 +3 830 2579 2679 +3 1009 1013 2205 +3 2208 2207 2206 +3 2211 2213 2212 +3 2213 1114 2208 +3 2550 2560 2549 +3 2200 2212 2204 +3 2200 2211 2212 +3 2548 2549 245 +3 1316 2414 1604 +3 2412 1153 1308 +3 2549 166 245 +3 291 1119 2207 +3 2416 2427 1190 +3 1013 1009 2207 +3 291 2208 1114 +3 2208 291 2207 +3 1655 1159 1292 +3 2002 2003 2001 +3 1654 1159 1655 +3 2210 2209 2199 +3 1012 2210 2199 +3 1010 2204 2212 +3 2213 1010 2212 +3 8 100 102 +3 1012 1961 2211 +3 2298 2297 1951 +3 2298 1950 2297 +3 2215 2217 1950 +3 843 2577 1026 +3 296 270 2401 +3 1111 2195 2214 +3 2194 2193 2227 +3 1111 2214 2215 +3 2183 474 2260 +3 353 2135 75 +3 2757 2758 2189 +3 1111 1112 1007 +3 2195 1111 1007 +3 2214 2216 2215 +3 1336 1335 270 +3 2218 2217 1949 +3 1830 1832 1829 +3 2641 1886 199 +3 2232 2231 1558 +3 2222 2225 2223 +3 97 269 271 +3 18 2641 2642 +3 1335 286 2404 +3 961 2228 2188 +3 1520 799 1522 +3 2583 1179 774 +3 2232 2233 150 +3 795 2582 2234 +3 2581 2582 795 +3 2253 2254 2234 +3 1465 432 1466 +3 1465 1466 1464 +3 2243 806 407 +3 2583 1174 1179 +3 2679 2680 830 +3 148 1902 433 +3 2237 795 2233 +3 2233 2254 150 +3 2234 2235 796 +3 2249 2234 796 +3 1175 2583 774 +3 393 1145 589 +3 2467 2469 596 +3 2579 2581 2580 +3 2579 2236 2581 +3 1473 414 1967 +3 148 433 1465 +3 2581 795 2580 +3 392 2239 487 +3 828 829 489 +3 2239 488 495 +3 487 2239 495 +3 846 487 495 +3 2241 2242 808 +3 817 808 2242 +3 2243 407 2242 +3 2240 807 2241 +3 2241 408 2240 +3 2242 2244 817 +3 807 2240 1145 +3 797 2252 2235 +3 266 87 267 +3 2245 1984 86 +3 1524 799 2250 +3 2648 995 35 +3 194 2648 35 +3 2245 1985 2246 +3 1520 2248 799 +3 118 119 20 +3 2254 2253 150 +3 150 2231 2232 +3 1821 2467 596 +3 2579 392 831 +3 2576 1943 2578 +3 2237 2233 2232 +3 797 420 2252 +3 2249 2253 2234 +3 2255 1474 1444 +3 492 1474 2255 +3 2220 2228 2256 +3 2229 2220 2256 +3 2219 2256 2228 +3 2229 2256 2219 +3 2155 2156 1058 +3 2157 1058 2156 +3 272 6 1168 +3 285 98 2403 +3 2402 2404 2403 +3 2404 2402 270 +3 2198 2406 2405 +3 1006 2198 2405 +3 2535 1526 1522 +3 284 2402 2403 +3 2163 1058 2157 +3 1272 2263 2264 +3 2263 1287 2264 +3 572 1583 1781 +3 2340 2339 1584 +3 2340 2338 2339 +3 1708 2338 2340 +3 1584 2266 1705 +3 2266 508 1705 +3 533 2735 535 +3 2735 1887 535 +3 1993 1992 886 +3 2270 1326 2272 +3 405 2299 782 +3 704 2563 842 +3 2273 1328 1325 +3 1329 1328 2273 +3 761 1328 1329 +3 1063 2276 1062 +3 2507 1040 2506 +3 2507 2513 1040 +3 2500 877 2501 +3 2277 877 2511 +3 2510 2277 2511 +3 2503 1064 2504 +3 2365 718 2286 +3 2278 1600 1064 +3 2278 1699 1600 +3 718 2362 2286 +3 2366 2014 935 +3 2322 715 2323 +3 2284 2288 2287 +3 684 2290 2153 +3 1403 2328 2327 +3 2290 2288 2284 +3 382 361 1165 +3 1504 2289 684 +3 719 1160 686 +3 684 2288 2290 +3 1504 1503 2289 +3 1154 1606 2687 +3 1606 1607 2687 +3 2319 1621 1624 +3 2315 1620 2320 +3 2280 1160 2292 +3 2279 1160 2280 +3 686 1160 2279 +3 2279 2280 2293 +3 2011 579 2010 +3 2012 2011 2010 +3 2671 1640 2674 +3 1725 698 2012 +3 698 2011 2012 +3 698 1097 1096 +3 500 514 825 +3 2291 2292 2281 +3 2292 1160 2281 +3 2430 2431 2293 +3 2431 1161 2293 +3 2300 1327 782 +3 2300 590 1327 +3 2411 2410 1290 +3 2411 2409 2410 +3 1290 2413 1159 +3 1603 1156 2301 +3 1521 1525 791 +3 801 2303 2304 +3 801 429 2303 +3 146 2304 2303 +3 2304 2143 362 +3 801 2304 362 +3 2434 496 2436 +3 2062 2310 427 +3 2314 2310 2313 +3 2314 427 2310 +3 1500 1501 2302 +3 2311 23 2312 +3 427 2311 2312 +3 429 2306 2305 +3 428 2307 2308 +3 428 2314 2313 +3 2311 427 2314 +3 1496 75 1495 +3 45 427 2312 +3 2446 2447 45 +3 1027 2446 1162 +3 2449 1420 1422 +3 1420 1401 1422 +3 2529 1410 1428 +3 870 1062 1128 +3 2317 716 1019 +3 1624 716 2317 +3 2322 1622 1621 +3 2318 2153 2290 +3 2319 1624 2317 +3 1410 2523 2520 +3 1578 2613 2603 +3 513 1564 1537 +3 1173 2363 2362 +3 386 1457 2326 +3 2002 2001 41 +3 2763 2002 41 +3 2366 2013 2014 +3 2541 2542 717 +3 2544 2541 717 +3 2434 1792 496 +3 850 1792 2434 +3 2303 429 2433 +3 626 633 2655 +3 2324 2325 723 +3 1625 1627 2325 +3 2327 1407 1408 +3 386 449 1345 +3 386 2326 449 +3 2329 1406 2330 +3 2445 2312 1162 +3 2312 2445 45 +3 136 382 379 +3 136 381 382 +3 1836 2494 2495 +3 2496 1836 2495 +3 1226 946 2334 +3 2496 2495 1239 +3 136 376 381 +3 572 2336 1708 +3 2335 947 49 +3 506 1592 514 +3 514 500 506 +3 2195 2196 2220 +3 2344 1200 2345 +3 572 1800 2336 +3 287 2194 2758 +3 531 2729 257 +3 2750 56 2747 +3 2337 2338 1708 +3 2337 2265 2338 +3 2725 2728 538 +3 447 446 187 +3 1667 862 222 +3 156 2342 105 +3 51 84 104 +3 2607 2605 1572 +3 2342 104 105 +3 2462 2463 1100 +3 1971 43 1973 +3 2641 200 2642 +3 2752 939 2749 +3 1795 2746 2745 +3 2745 2744 1795 +3 2344 1224 1200 +3 2344 2352 1224 +3 1209 2347 1200 +3 2347 2346 1200 +3 615 400 1210 +3 2347 1209 2351 +3 2745 2746 939 +3 1778 2745 939 +3 2545 1625 1626 +3 2352 1201 2353 +3 617 615 2359 +3 617 419 615 +3 2356 2355 2354 +3 426 2355 2356 +3 2354 2353 1199 +3 777 779 2488 +3 779 777 776 +3 426 617 2355 +3 1197 426 2356 +3 426 1197 1198 +3 2355 617 2359 +3 2359 2358 614 +3 2357 614 2358 +3 2355 2359 614 +3 2354 2355 614 +3 718 2364 2536 +3 2537 718 2536 +3 2360 2539 2538 +3 2360 719 2539 +3 2360 2538 2537 +3 2536 2360 2537 +3 718 2537 2362 +3 717 2545 2544 +3 719 2360 2361 +3 719 2361 1160 +3 2364 2281 1160 +3 2361 2364 1160 +3 1313 2369 372 +3 2109 229 1313 +3 229 2369 1313 +3 1300 2369 229 +3 315 316 236 +3 2370 230 2371 +3 2367 1475 2373 +3 312 313 2372 +3 1284 2367 2373 +3 315 233 316 +3 2381 2373 1476 +3 2382 1285 2383 +3 2374 2375 1380 +3 1284 2375 2374 +3 2378 1802 367 +3 2378 1271 1802 +3 2381 2380 1284 +3 1284 2373 2381 +3 1803 2376 1318 +3 2379 2372 230 +3 2371 230 2372 +3 2375 1284 2380 +3 310 1267 374 +3 2392 310 374 +3 2389 468 469 +3 468 2389 1898 +3 2378 2377 1271 +3 2380 368 2376 +3 1479 2388 2387 +3 2380 2382 368 +3 2381 2382 2380 +3 1283 2385 2386 +3 162 1480 1477 +3 2388 1898 2389 +3 2381 1285 2382 +3 2382 2385 368 +3 2384 2387 2391 +3 19 160 163 +3 163 160 159 +3 1478 1481 1480 +3 2392 2391 2395 +3 310 2392 2393 +3 368 2390 1318 +3 2376 368 1318 +3 2390 368 2385 +3 2385 1283 2390 +3 1480 162 1482 +3 1478 1480 1482 +3 1483 162 1319 +3 1283 2684 53 +3 2397 646 607 +3 646 2397 1913 +3 375 2390 2394 +3 375 1318 2390 +3 371 2391 2392 +3 310 2393 1018 +3 375 2394 1282 +3 2391 161 2395 +3 79 2736 2733 +3 1925 652 1929 +3 1665 890 2426 +3 2399 272 2398 +3 98 284 2403 +3 271 2401 2400 +3 2405 2199 2209 +3 1006 2405 2209 +3 2403 286 285 +3 1011 2406 2407 +3 2406 1011 2199 +3 2406 2199 2405 +3 2193 1011 2408 +3 2408 2197 2193 +3 1153 2411 1290 +3 1308 1605 2414 +3 1308 2414 2412 +3 2412 2414 1316 +3 1605 1604 2414 +3 1009 2202 2203 +3 1316 1601 2409 +3 1604 1601 1316 +3 1157 2410 2409 +3 2411 2412 1316 +3 1157 2415 2410 +3 2415 1157 2301 +3 2427 2396 1190 +3 2426 2421 1665 +3 2421 889 1665 +3 2422 404 759 +3 2424 591 1330 +3 1665 889 1664 +3 761 2420 2424 +3 2420 2418 2424 +3 761 1329 2420 +3 652 2425 759 +3 652 757 2425 +3 1189 1188 2419 +3 2418 2420 404 +3 760 759 2420 +3 759 404 2420 +3 760 588 1083 +3 1329 760 2420 +3 2424 1330 761 +3 1914 2428 649 +3 2423 884 889 +3 2418 763 2424 +3 890 2427 2416 +3 2427 2428 2396 +3 2427 890 2428 +3 2428 647 2396 +3 1914 647 2428 +3 1924 2423 757 +3 890 649 2428 +3 648 2423 1924 +3 862 2429 1813 +3 2291 2430 2292 +3 429 2305 2433 +3 2433 2302 2303 +3 2439 1439 1402 +3 2435 847 495 +3 847 846 495 +3 850 2435 495 +3 2482 2483 845 +3 486 845 2483 +3 2436 1900 847 +3 2434 2436 847 +3 1130 2767 396 +3 2767 2766 396 +3 850 2434 2435 +3 1899 1900 2436 +3 496 1899 2436 +3 391 2483 2482 +3 440 2440 1402 +3 440 2441 2440 +3 440 1414 2441 +3 189 2438 2439 +3 2438 1439 2439 +3 1414 442 2441 +3 1401 2444 2443 +3 1439 2438 2442 +3 2438 2437 2442 +3 2447 7 13 +3 1935 2447 13 +3 2566 342 2567 +3 425 973 2450 +3 996 61 995 +3 921 2451 2450 +3 2453 923 1995 +3 2453 1995 921 +3 2452 2453 921 +3 2452 5 2453 +3 973 5 2452 +3 978 5 973 +3 1103 1122 2577 +3 1972 253 1998 +3 2456 2457 1679 +3 2456 31 2457 +3 2455 2456 1679 +3 250 85 252 +3 907 68 963 +3 1026 2578 1945 +3 843 1074 2460 +3 2542 720 1628 +3 2461 1101 841 +3 1101 1124 841 +3 1100 2463 2464 +3 690 2464 2463 +3 2458 1101 2461 +3 2458 2462 1101 +3 2464 1092 1100 +3 2470 2654 596 +3 2469 2470 596 +3 626 2655 2470 +3 690 2465 2464 +3 2465 1092 2464 +3 1821 689 2467 +3 1222 575 94 +3 2470 1090 1089 +3 799 2248 2249 +3 2361 2536 2364 +3 2471 1637 582 +3 1127 913 2475 +3 952 1183 416 +3 2476 913 2477 +3 1057 2161 2163 +3 952 416 953 +3 2481 952 953 +3 520 502 1218 +3 1637 1640 1639 +3 577 1637 2471 +3 1638 1637 577 +3 1727 2473 582 +3 2477 174 2476 +3 810 409 827 +3 2540 2762 1173 +3 2538 2540 1173 +3 1173 2762 2543 +3 2762 2541 2543 +3 1781 1779 572 +3 952 2481 783 +3 809 409 810 +3 815 2479 409 +3 1360 695 2477 +3 695 1360 781 +3 2478 2476 827 +3 2479 2478 827 +3 2478 2479 783 +3 2767 824 2766 +3 2480 1127 2475 +3 847 391 2482 +3 1900 391 847 +3 2482 846 847 +3 1320 2488 610 +3 2710 418 2709 +3 957 2710 2709 +3 785 2712 2706 +3 2712 2709 2706 +3 2709 2712 2705 +3 610 2488 1198 +3 1813 2429 2489 +3 1035 863 2489 +3 1198 2487 2486 +3 863 1813 2489 +3 1813 863 1812 +3 2488 2487 1198 +3 2488 779 2487 +3 2429 1036 2489 +3 2609 2608 16 +3 7 2490 13 +3 13 2490 1938 +3 2493 1839 1837 +3 1974 1595 2596 +3 252 85 965 +3 2596 1973 1974 +3 2493 1843 1839 +3 2495 2494 1837 +3 1237 1835 1239 +3 948 181 1226 +3 2495 1837 1239 +3 2497 1238 740 +3 2646 2645 9 +3 2497 740 1836 +3 1128 2498 1129 +3 2770 2296 1059 +3 2769 2770 1060 +3 877 2277 2501 +3 2504 1064 2505 +3 868 2512 2509 +3 2499 2500 1042 +3 1105 864 1106 +3 2506 2505 871 +3 2507 871 1037 +3 2506 871 2507 +3 1031 2507 1037 +3 1105 2509 1040 +3 2509 1105 868 +3 2276 1063 2278 +3 2510 2276 2503 +3 2504 2510 2503 +3 2504 2277 2510 +3 875 1042 1041 +3 2276 2510 1062 +3 864 2513 2514 +3 2513 864 1105 +3 864 2514 1030 +3 1775 1893 2516 +3 2738 2739 1208 +3 1778 2753 2754 +3 2518 1893 1784 +3 2518 2516 1893 +3 1793 2518 1784 +3 1793 1783 2518 +3 1783 2516 2518 +3 1167 383 44 +3 1990 302 899 +3 901 302 1990 +3 360 302 901 +3 1409 2522 2521 +3 2521 2522 1404 +3 1989 1990 899 +3 2327 2522 1409 +3 440 1411 2524 +3 1424 1405 2528 +3 2528 1405 1416 +3 1421 1424 2528 +3 2522 1408 2526 +3 2522 2526 1404 +3 2526 1416 1404 +3 2526 2527 1416 +3 2526 1408 2527 +3 1678 2701 869 +3 376 377 349 +3 377 2531 349 +3 165 131 134 +3 377 135 2531 +3 135 2532 2531 +3 2532 349 2531 +3 139 349 2532 +3 73 139 2533 +3 74 349 908 +3 270 1335 2404 +3 2552 2551 245 +3 2360 2536 2361 +3 720 2542 1631 +3 251 254 2763 +3 841 1123 1122 +3 251 2763 41 +3 41 1999 251 +3 1631 2540 2539 +3 2540 2538 2539 +3 963 254 251 +3 2541 2544 2543 +3 2543 2544 2363 +3 2547 1627 717 +3 723 1627 1628 +3 1627 1625 2545 +3 1172 2546 3 +3 719 683 720 +3 2542 2547 717 +3 1892 101 2548 +3 29 100 2550 +3 100 29 102 +3 345 2564 1745 +3 256 2550 101 +3 256 29 2550 +3 60 1892 2551 +3 245 2553 2552 +3 2553 246 2552 +3 245 2551 2548 +3 2551 1892 2548 +3 167 2557 2558 +3 167 2554 2557 +3 67 255 248 +3 2556 63 2555 +3 2554 246 2553 +3 167 62 2555 +3 167 2555 2554 +3 2555 63 2554 +3 255 256 101 +3 67 256 255 +3 2557 2553 245 +3 166 2557 245 +3 2556 62 43 +3 1971 2556 43 +3 1680 31 2456 +3 62 2556 2555 +3 2558 2559 167 +3 2559 2558 15 +3 15 42 2559 +3 2562 1094 712 +3 842 2562 712 +3 2574 2231 150 +3 587 1651 1147 +3 2563 704 581 +3 2565 345 1747 +3 1735 324 1742 +3 2570 2571 1734 +3 2568 2571 88 +3 2571 2568 2572 +3 1735 2564 2573 +3 341 1747 1746 +3 88 2567 2568 +3 343 344 2568 +3 2569 1735 2573 +3 2569 2570 1735 +3 1734 2571 2572 +3 1333 213 1332 +3 432 147 801 +3 1731 1733 325 +3 1333 1734 2572 +3 2572 1334 1333 +3 1334 2572 344 +3 344 2572 2568 +3 432 801 114 +3 432 114 1467 +3 1467 114 2148 +3 2575 509 490 +3 1464 1463 148 +3 2235 2582 2236 +3 1103 2577 2460 +3 243 2682 2681 +3 844 243 2681 +3 2582 2235 2234 +3 2236 797 2235 +3 2237 2580 795 +3 2244 407 818 +3 1942 1937 12 +3 1549 1547 2586 +3 2586 1547 2585 +3 2585 1547 1567 +3 1547 1564 1567 +3 2586 1551 1549 +3 2588 842 712 +3 2590 1436 1135 +3 2590 2591 1441 +3 1472 1441 2591 +3 1472 1442 1441 +3 2593 2592 1440 +3 2590 1135 2591 +3 1701 2592 1135 +3 2591 1135 2592 +3 1437 2590 1441 +3 1472 2591 2592 +3 308 306 307 +3 2595 1434 1435 +3 2492 434 1471 +3 2595 2594 1434 +3 2600 251 1999 +3 2597 1973 2596 +3 2598 1595 1976 +3 251 250 252 +3 2600 250 251 +3 2598 1976 250 +3 1972 2599 253 +3 2599 2598 253 +3 550 548 976 +3 2617 1588 1593 +3 1591 506 2610 +3 2602 2604 1573 +3 974 549 968 +3 1572 2605 1574 +3 2602 1573 2603 +3 2612 2613 2614 +3 2613 1578 2614 +3 79 552 234 +3 852 79 234 +3 2605 515 2606 +3 2609 2603 1573 +3 2609 2610 2603 +3 515 498 2606 +3 2603 2610 503 +3 2616 1593 2608 +3 2612 2611 504 +3 2612 2615 2611 +3 1952 2619 1951 +3 2607 1572 2616 +3 1576 515 1575 +3 1576 1575 2601 +3 2613 2612 504 +3 2612 1577 2615 +3 1577 1994 2615 +3 1577 1579 1994 +3 1769 1579 1577 +3 1573 2607 2618 +3 2619 1953 290 +3 2616 2617 1593 +3 1572 2617 2616 +3 2617 1572 1588 +3 2620 1413 10 +3 2621 2620 10 +3 1429 2621 10 +3 10 2529 1429 +3 2529 1428 1429 +3 441 1413 2623 +3 585 2626 2625 +3 1642 1641 2624 +3 1648 1642 2624 +3 585 2625 2627 +3 608 1644 1643 +3 2625 1649 1648 +3 708 709 581 +3 398 2634 2631 +3 2635 2631 1638 +3 2629 2627 709 +3 2630 2628 2629 +3 2627 2624 709 +3 2627 2625 2624 +3 1648 2624 2625 +3 2629 708 2630 +3 2635 1638 577 +3 2628 2630 580 +3 398 803 802 +3 2633 2634 585 +3 2633 585 2632 +3 398 2631 2635 +3 2632 2629 2628 +3 2633 2632 2628 +3 398 802 2634 +3 1151 399 1150 +3 1195 1150 612 +3 2636 94 804 +3 845 486 2676 +3 2639 1473 1443 +3 215 1723 1722 +3 2643 2644 2642 +3 2145 2650 385 +3 200 31 2643 +3 200 2643 2642 +3 2645 18 2644 +3 1886 2649 196 +3 2647 2646 9 +3 1684 1728 2647 +3 1728 195 2647 +3 2645 194 1885 +3 1684 2647 9 +3 995 994 35 +3 2646 2648 194 +3 2645 2646 194 +3 1728 1729 195 +3 2649 1885 196 +3 2136 2137 358 +3 2651 2652 385 +3 144 2136 2651 +3 359 44 2652 +3 360 44 359 +3 604 787 635 +3 2655 2654 2470 +3 2655 634 2654 +3 2655 633 634 +3 1526 1528 1522 +3 785 2703 2704 +3 785 2659 2703 +3 559 2657 1505 +3 1506 2657 559 +3 2707 2706 418 +3 1433 467 2715 +3 2706 2661 785 +3 466 2660 561 +3 561 2660 562 +3 558 784 1506 +3 1835 1237 2663 +3 2663 1237 725 +3 725 1238 2663 +3 1835 1238 2497 +3 1835 2663 1238 +3 2664 687 1822 +3 687 1823 1822 +3 692 1819 1818 +3 692 1392 2666 +3 1389 598 2666 +3 2630 2672 580 +3 1191 607 1192 +3 653 2665 759 +3 512 1592 1566 +3 797 829 798 +3 1592 512 514 +3 397 803 804 +3 2012 2010 699 +3 2668 578 2673 +3 1640 2671 2667 +3 2012 699 2673 +3 578 1725 2673 +3 2760 2756 2222 +3 1638 2628 2675 +3 2675 2628 580 +3 580 2674 2675 +3 398 2636 804 +3 398 2635 2636 +3 1637 2675 2674 +3 2674 1640 1637 +3 1645 583 579 +3 1120 2677 1117 +3 2756 2760 2221 +3 1957 1115 1958 +3 1117 2677 960 +3 2682 243 2127 +3 832 2680 2679 +3 2392 374 2683 +3 371 2392 2683 +3 53 2683 1269 +3 367 1269 1268 +3 1269 374 1268 +3 374 1269 2683 +3 867 978 2685 +3 1054 2686 866 +3 1054 2294 2686 +3 905 904 2688 +3 905 322 904 +3 146 2696 363 +3 2691 111 905 +3 2690 2693 2694 +3 896 145 2699 +3 2690 300 2693 +3 2690 22 300 +3 363 2695 898 +3 2690 2696 22 +3 2692 304 111 +3 2699 898 2698 +3 2698 897 2699 +3 1501 22 2696 +3 359 145 896 +3 2700 2699 897 +3 899 2700 897 +3 302 2700 899 +3 2702 1774 1773 +3 1785 2702 1773 +3 2702 1785 519 +3 435 444 436 +3 2713 1440 437 +3 521 1771 1770 +3 527 1355 1354 +3 2715 467 2716 +3 2710 839 2711 +3 1800 2751 2336 +3 957 2705 411 +3 2707 2661 2706 +3 417 957 955 +3 2705 2712 785 +3 2708 415 1435 +3 415 838 1435 +3 1795 1780 2746 +3 2711 2708 418 +3 2710 2711 418 +3 492 1449 1661 +3 839 415 2711 +3 191 1435 2715 +3 2715 1435 2714 +3 1431 2719 1430 +3 1430 2719 1419 +3 1431 2718 2719 +3 2718 1431 1432 +3 2718 437 2719 +3 1701 1419 2719 +3 753 755 309 +3 14 306 308 +3 1017 2395 161 +3 308 307 153 +3 539 2729 2730 +3 2732 2731 537 +3 239 2731 2732 +3 2735 185 1887 +3 532 185 2735 +3 2733 522 239 +3 2733 239 2732 +3 97 2742 274 +3 2742 97 1168 +3 2741 573 1206 +3 1207 2737 2741 +3 939 2748 2749 +3 2753 1778 939 +3 2749 2747 1710 +3 1782 571 2755 +3 1779 2755 2754 +3 2541 2762 2540 +3 2196 2758 2757 +3 1007 2758 2196 +3 2758 1007 2759 +3 2759 1112 1961 +3 2225 2761 2757 +3 2756 2757 2761 +3 387 2764 1470 +3 2766 824 826 +3 825 824 2768 +3 1703 1585 2771 +3 1042 875 2769 + diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/loop-squared.moka b/Surface_mesh_topology/test/Surface_mesh_topology/data/loop-squared.moka new file mode 100644 index 00000000000..2ad82ecf096 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/loop-squared.moka @@ -0,0 +1,338 @@ +Moka file [ascii] +56 7 0 0 0 0 0 0 +5 23 1 0 56 0 0 0 0 +6 2 0 1 56 0 0 0 0 +3 1 159 2 56 0 0 0 0 +2 4 160 3 56 0 0 0 0 +9 3 24 4 56 0 0 0 0 +0 10 6 5 56 0 0 0 0 +1 7 5 6 56 0 0 0 0 +8 6 12 7 56 0 0 0 0 +7 9 13 8 56 0 0 0 0 +4 8 25 9 56 0 0 0 0 +15 5 11 10 56 0 0 0 1 -2.22238 0.212597 1.47 +16 12 10 11 56 0 0 0 0 +13 11 7 12 56 0 0 0 0 +12 14 8 13 56 0 0 0 0 +19 13 26 14 56 0 0 0 0 +10 20 16 15 56 0 0 0 0 +11 17 15 16 56 0 0 0 0 +18 16 36 17 56 0 0 0 0 +17 19 37 18 56 0 0 0 0 +14 18 27 19 56 0 0 0 0 +21 15 33 20 56 0 0 0 0 +20 22 32 21 56 0 0 0 0 +23 21 163 22 56 0 0 0 0 +22 0 162 23 56 0 0 0 0 +25 31 4 24 56 0 0 0 1 -2.27867 -1.36339 -0.03 +24 26 9 25 56 0 0 0 1 -2.22238 0.212597 -0.03 +27 25 14 26 56 0 0 0 0 +26 28 19 27 56 0 0 0 1 -0.646397 0.156312 -0.03 +29 27 49 28 56 0 0 0 0 +28 30 48 29 56 0 0 0 1 -0.702682 -1.41967 -0.03 +31 29 171 30 56 0 0 0 0 +30 24 170 31 56 0 0 0 0 +33 47 21 32 56 0 0 0 0 +32 34 20 33 56 0 0 0 0 +39 33 35 34 56 0 0 0 1 -0.646397 0.156312 1.47 +40 36 34 35 56 0 0 0 0 +37 35 17 36 56 0 0 0 0 +36 38 18 37 56 0 0 0 0 +43 37 50 38 56 0 0 0 0 +34 44 40 39 56 0 0 0 0 +35 41 39 40 56 0 0 0 0 +42 40 60 41 56 0 0 0 0 +41 43 61 42 56 0 0 0 0 +38 42 51 43 56 0 0 0 0 +45 39 57 44 56 0 0 0 0 +44 46 56 45 56 0 0 0 0 +47 45 275 46 56 0 0 0 0 +46 32 274 47 56 0 0 0 0 +49 55 29 48 56 0 0 0 0 +48 50 28 49 56 0 0 0 0 +51 49 38 50 56 0 0 0 0 +50 52 43 51 56 0 0 0 1 1.12623 0.0678082 -0.03 +53 51 73 52 56 0 0 0 0 +52 54 72 53 56 0 0 0 1 0.676657 -1.44374 -0.03 +55 53 283 54 56 0 0 0 0 +54 48 282 55 56 0 0 0 0 +57 71 45 56 56 0 0 0 0 +56 58 44 57 56 0 0 0 0 +63 57 59 58 56 0 0 0 1 1.12623 0.0678082 1.47 +64 60 58 59 56 0 0 0 0 +61 59 41 60 56 0 0 0 0 +60 62 42 61 56 0 0 0 0 +67 61 74 62 56 0 0 0 0 +58 68 64 63 56 0 0 0 0 +59 65 63 64 56 0 0 0 0 +66 64 84 65 56 0 0 0 0 +65 67 85 66 56 0 0 0 0 +62 66 75 67 56 0 0 0 0 +69 63 81 68 56 0 0 0 0 +68 70 80 69 56 0 0 0 0 +71 69 277 70 56 0 0 0 0 +70 56 276 71 56 0 0 0 0 +73 79 53 72 56 0 0 0 0 +72 74 52 73 56 0 0 0 0 +75 73 62 74 56 0 0 0 0 +74 76 67 75 56 0 0 0 1 2.73071 -1.8981 -0.03 +77 75 97 76 56 0 0 0 0 +76 78 96 77 56 0 0 0 1 1.52058 -2.71423 -0.03 +79 77 285 78 56 0 0 0 0 +78 72 284 79 56 0 0 0 0 +81 95 69 80 56 0 0 0 0 +80 82 68 81 56 0 0 0 0 +87 81 83 82 56 0 0 0 1 2.73071 -1.8981 1.47 +88 84 82 83 56 0 0 0 0 +85 83 65 84 56 0 0 0 0 +84 86 66 85 56 0 0 0 0 +91 85 98 86 56 0 0 0 0 +82 92 88 87 56 0 0 0 0 +83 89 87 88 56 0 0 0 0 +90 88 110 89 56 0 0 0 0 +89 91 111 90 56 0 0 0 0 +86 90 99 91 56 0 0 0 0 +93 87 107 92 56 0 0 0 0 +92 94 106 93 56 0 0 0 0 +95 93 293 94 56 0 0 0 0 +94 80 292 95 56 0 0 0 0 +97 103 77 96 56 0 0 0 0 +96 98 76 97 56 0 0 0 0 +99 97 86 98 56 0 0 0 0 +98 100 91 99 56 0 0 0 1 3.12471 -4.43093 -0.03 +101 99 123 100 56 0 0 0 0 +100 102 122 101 56 0 0 0 1 1.54873 -4.48721 -0.03 +103 101 301 102 56 0 0 0 0 +102 96 300 103 56 0 0 0 0 +105 119 309 104 56 0 0 0 0 +104 106 308 105 56 0 0 0 0 +107 105 93 106 56 0 0 0 0 +106 108 92 107 56 0 0 0 0 +113 107 109 108 56 0 0 0 1 3.12471 -4.43093 1.47 +114 110 108 109 56 0 0 0 0 +111 109 89 110 56 0 0 0 0 +110 112 90 111 56 0 0 0 0 +117 111 124 112 56 0 0 0 0 +108 118 114 113 56 0 0 0 0 +109 115 113 114 56 0 0 0 0 +116 114 132 115 56 0 0 0 0 +115 117 133 116 56 0 0 0 0 +112 116 125 117 56 0 0 0 0 +119 113 129 118 56 0 0 0 0 +118 104 128 119 56 0 0 0 0 +121 127 317 120 56 0 0 0 1 1.02186 -5.53222 -0.03 +120 122 316 121 56 0 0 0 0 +123 121 101 122 56 0 0 0 0 +122 124 100 123 56 0 0 0 0 +125 123 112 124 56 0 0 0 0 +124 126 117 125 56 0 0 0 1 1.90674 -6.20019 -0.03 +127 125 145 126 56 0 0 0 0 +126 120 144 127 56 0 0 0 0 +129 143 119 128 56 0 0 0 0 +128 130 118 129 56 0 0 0 0 +135 129 131 130 56 0 0 0 1 1.90674 -6.20019 1.47 +136 132 130 131 56 0 0 0 0 +133 131 115 132 56 0 0 0 0 +132 134 116 133 56 0 0 0 0 +139 133 146 134 56 0 0 0 0 +130 140 136 135 56 0 0 0 0 +131 137 135 136 56 0 0 0 0 +138 136 250 137 56 0 0 0 0 +137 139 251 138 56 0 0 0 0 +134 138 147 139 56 0 0 0 0 +141 135 263 140 56 0 0 0 0 +140 142 262 141 56 0 0 0 0 +143 141 325 142 56 0 0 0 0 +142 128 324 143 56 0 0 0 0 +145 151 127 144 56 0 0 0 0 +144 146 126 145 56 0 0 0 0 +147 145 134 146 56 0 0 0 0 +146 148 139 147 56 0 0 0 1 0.345439 -6.51282 -0.03 +149 147 271 148 56 0 0 0 0 +148 150 270 149 56 0 0 0 1 0.463577 -5.7533 -0.03 +151 149 333 150 56 0 0 0 0 +150 144 332 151 56 0 0 0 0 +157 167 153 152 56 0 0 0 0 +158 154 152 153 56 0 0 0 0 +155 153 183 154 56 0 0 0 0 +154 156 184 155 56 0 0 0 0 +161 155 168 156 56 0 0 0 0 +152 162 158 157 56 0 0 0 0 +153 159 157 158 56 0 0 0 0 +160 158 2 159 56 0 0 0 0 +159 161 3 160 56 0 0 0 0 +156 160 169 161 56 0 0 0 0 +163 157 23 162 56 0 0 0 1 -2.27867 -1.36339 1.47 +162 164 22 163 56 0 0 0 0 +165 163 273 164 56 0 0 0 0 +164 166 272 165 56 0 0 0 0 +167 165 187 166 56 0 0 0 0 +166 152 186 167 56 0 0 0 0 +169 175 156 168 56 0 0 0 1 -2.02538 -3.0238 -0.03 +168 170 161 169 56 0 0 0 0 +171 169 31 170 56 0 0 0 0 +170 172 30 171 56 0 0 0 0 +173 171 281 172 56 0 0 0 0 +172 174 280 173 56 0 0 0 1 -0.927822 -3.05194 -0.03 +175 173 195 174 56 0 0 0 0 +174 168 194 175 56 0 0 0 0 +181 191 177 176 56 0 0 0 0 +182 178 176 177 56 0 0 0 0 +179 177 207 178 56 0 0 0 0 +178 180 208 179 56 0 0 0 0 +185 179 192 180 56 0 0 0 0 +176 186 182 181 56 0 0 0 0 +177 183 181 182 56 0 0 0 0 +184 182 154 183 56 0 0 0 0 +183 185 155 184 56 0 0 0 0 +180 184 193 185 56 0 0 0 0 +187 181 167 186 56 0 0 0 1 -2.02538 -3.0238 1.47 +186 188 166 187 56 0 0 0 0 +189 187 289 188 56 0 0 0 0 +188 190 288 189 56 0 0 0 0 +191 189 211 190 56 0 0 0 0 +190 176 210 191 56 0 0 0 0 +193 199 180 192 56 0 0 0 1 -1.88467 -4.29022 -0.03 +192 194 185 193 56 0 0 0 0 +195 193 175 194 56 0 0 0 0 +194 196 174 195 56 0 0 0 0 +197 195 297 196 56 0 0 0 0 +196 198 296 197 56 0 0 0 1 -1.04039 -4.06508 -0.03 +199 197 219 198 56 0 0 0 0 +198 192 218 199 56 0 0 0 0 +205 215 201 200 56 0 0 0 0 +206 202 200 201 56 0 0 0 0 +203 201 231 202 56 0 0 0 0 +202 204 232 203 56 0 0 0 0 +209 203 216 204 56 0 0 0 0 +200 210 206 205 56 0 0 0 0 +201 207 205 206 56 0 0 0 0 +208 206 178 207 56 0 0 0 0 +207 209 179 208 56 0 0 0 0 +204 208 217 209 56 0 0 0 0 +211 205 191 210 56 0 0 0 1 -1.88467 -4.29022 1.47 +210 212 190 211 56 0 0 0 0 +213 211 305 212 56 0 0 0 0 +212 214 304 213 56 0 0 0 0 +215 213 235 214 56 0 0 0 0 +214 200 234 215 56 0 0 0 0 +217 223 204 216 56 0 0 0 1 -1.3989 -5.36775 -0.03 +216 218 209 217 56 0 0 0 0 +219 217 199 218 56 0 0 0 0 +218 220 198 219 56 0 0 0 0 +221 219 313 220 56 0 0 0 0 +220 222 312 221 56 0 0 0 1 -0.505684 -4.9375 -0.03 +223 221 243 222 56 0 0 0 0 +222 216 242 223 56 0 0 0 0 +229 239 225 224 56 0 0 0 0 +230 226 224 225 56 0 0 0 0 +227 225 255 226 56 0 0 0 0 +226 228 256 227 56 0 0 0 0 +233 227 240 228 56 0 0 0 0 +224 234 230 229 56 0 0 0 0 +225 231 229 230 56 0 0 0 0 +232 230 202 231 56 0 0 0 0 +231 233 203 232 56 0 0 0 0 +228 232 241 233 56 0 0 0 0 +235 229 215 234 56 0 0 0 1 -1.3989 -5.36775 1.47 +234 236 214 235 56 0 0 0 0 +237 235 321 236 56 0 0 0 0 +236 238 320 237 56 0 0 0 0 +239 237 259 238 56 0 0 0 0 +238 224 258 239 56 0 0 0 0 +241 247 228 240 56 0 0 0 1 -0.719426 -6.08333 -0.03 +240 242 233 241 56 0 0 0 0 +243 241 223 242 56 0 0 0 0 +242 244 222 243 56 0 0 0 0 +245 243 329 244 56 0 0 0 0 +244 246 328 245 56 0 0 0 1 -0.112832 -5.52131 -0.03 +247 245 267 246 56 0 0 0 0 +246 240 266 247 56 0 0 0 0 +253 263 249 248 56 0 0 0 0 +254 250 248 249 56 0 0 0 0 +251 249 137 250 56 0 0 0 0 +250 252 138 251 56 0 0 0 0 +257 251 264 252 56 0 0 0 0 +248 258 254 253 56 0 0 0 0 +249 255 253 254 56 0 0 0 0 +256 254 226 255 56 0 0 0 0 +255 257 227 256 56 0 0 0 0 +252 256 265 257 56 0 0 0 0 +259 253 239 258 56 0 0 0 1 -0.719426 -6.08333 1.47 +258 260 238 259 56 0 0 0 0 +261 259 327 260 56 0 0 0 0 +260 262 326 261 56 0 0 0 0 +263 261 141 262 56 0 0 0 0 +262 248 140 263 56 0 0 0 1 0.345439 -6.51282 1.47 +265 271 252 264 56 0 0 0 0 +264 266 257 265 56 0 0 0 0 +267 265 247 266 56 0 0 0 0 +266 268 246 267 56 0 0 0 0 +269 267 335 268 56 0 0 0 0 +268 270 334 269 56 0 0 0 0 +271 269 149 270 56 0 0 0 0 +270 264 148 271 56 0 0 0 0 +273 279 165 272 56 0 0 0 0 +272 274 164 273 56 0 0 0 0 +275 273 47 274 56 0 0 0 1 -0.702682 -1.41967 1.47 +274 276 46 275 56 0 0 0 0 +277 275 71 276 56 0 0 0 1 0.676657 -1.44374 1.47 +276 278 70 277 56 0 0 0 0 +279 277 291 278 56 0 0 0 0 +278 272 290 279 56 0 0 0 0 +281 287 173 280 56 0 0 0 0 +280 282 172 281 56 0 0 0 0 +283 281 55 282 56 0 0 0 0 +282 284 54 283 56 0 0 0 0 +285 283 79 284 56 0 0 0 0 +284 286 78 285 56 0 0 0 0 +287 285 299 286 56 0 0 0 0 +286 280 298 287 56 0 0 0 0 +289 295 189 288 56 0 0 0 0 +288 290 188 289 56 0 0 0 0 +291 289 279 290 56 0 0 0 1 -0.927822 -3.05194 1.47 +290 292 278 291 56 0 0 0 0 +293 291 95 292 56 0 0 0 1 1.52058 -2.71423 1.47 +292 294 94 293 56 0 0 0 0 +295 293 307 294 56 0 0 0 0 +294 288 306 295 56 0 0 0 0 +297 303 197 296 56 0 0 0 0 +296 298 196 297 56 0 0 0 0 +299 297 287 298 56 0 0 0 0 +298 300 286 299 56 0 0 0 0 +301 299 103 300 56 0 0 0 0 +300 302 102 301 56 0 0 0 0 +303 301 315 302 56 0 0 0 0 +302 296 314 303 56 0 0 0 0 +305 311 213 304 56 0 0 0 0 +304 306 212 305 56 0 0 0 0 +307 305 295 306 56 0 0 0 1 -1.04039 -4.06508 1.47 +306 308 294 307 56 0 0 0 0 +309 307 105 308 56 0 0 0 1 1.54873 -4.48721 1.47 +308 310 104 309 56 0 0 0 0 +311 309 323 310 56 0 0 0 0 +310 304 322 311 56 0 0 0 0 +313 319 221 312 56 0 0 0 0 +312 314 220 313 56 0 0 0 0 +315 313 303 314 56 0 0 0 0 +314 316 302 315 56 0 0 0 0 +317 315 121 316 56 0 0 0 0 +316 318 120 317 56 0 0 0 0 +319 317 331 318 56 0 0 0 0 +318 312 330 319 56 0 0 0 0 +321 327 237 320 56 0 0 0 0 +320 322 236 321 56 0 0 0 0 +323 321 311 322 56 0 0 0 1 -0.505684 -4.9375 1.47 +322 324 310 323 56 0 0 0 0 +325 323 143 324 56 0 0 0 1 1.02186 -5.53222 1.47 +324 326 142 325 56 0 0 0 0 +327 325 261 326 56 0 0 0 1 0.463577 -5.7533 1.47 +326 320 260 327 56 0 0 0 1 -0.112832 -5.52131 1.47 +329 335 245 328 56 0 0 0 0 +328 330 244 329 56 0 0 0 0 +331 329 319 330 56 0 0 0 0 +330 332 318 331 56 0 0 0 0 +333 331 151 332 56 0 0 0 0 +332 334 150 333 56 0 0 0 0 +335 333 269 334 56 0 0 0 0 +334 328 268 335 56 0 0 0 0 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/loop-squared.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/loop-squared.off new file mode 100644 index 00000000000..ea1bb924ed9 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/loop-squared.off @@ -0,0 +1,88 @@ +OFF +44 42 0 +-2.27867 -1.36339 1.47 +-2.27867 -1.36339 -0.03 +-2.22238 0.212597 1.47 +-2.22238 0.212597 -0.03 +-0.646397 0.156312 1.47 +-0.646397 0.156312 -0.03 +-0.702682 -1.41967 1.47 +-0.702682 -1.41967 -0.03 +1.12623 0.0678082 1.47 +1.12623 0.0678082 -0.03 +0.676657 -1.44374 1.47 +0.676657 -1.44374 -0.03 +2.73071 -1.8981 1.47 +2.73071 -1.8981 -0.03 +1.52058 -2.71423 1.47 +1.52058 -2.71423 -0.03 +3.12471 -4.43093 1.47 +3.12471 -4.43093 -0.03 +1.54873 -4.48721 1.47 +1.54873 -4.48721 -0.03 +1.02186 -5.53222 1.47 +1.90674 -6.20019 1.47 +1.90674 -6.20019 -0.03 +1.02186 -5.53222 -0.03 +0.345439 -6.51282 1.47 +0.345439 -6.51282 -0.03 +0.463577 -5.7533 1.47 +0.463577 -5.7533 -0.03 +-2.02538 -3.0238 1.47 +-2.02538 -3.0238 -0.03 +-0.927822 -3.05194 1.47 +-0.927822 -3.05194 -0.03 +-1.88467 -4.29022 1.47 +-1.88467 -4.29022 -0.03 +-1.04039 -4.06508 1.47 +-1.04039 -4.06508 -0.03 +-1.3989 -5.36775 1.47 +-1.3989 -5.36775 -0.03 +-0.505684 -4.9375 1.47 +-0.505684 -4.9375 -0.03 +-0.719426 -6.08333 1.47 +-0.719426 -6.08333 -0.03 +-0.112832 -5.52131 1.47 +-0.112832 -5.52131 -0.03 +4 0 2 4 6 +4 0 1 3 2 +4 2 3 5 4 +4 3 1 7 5 +4 6 4 8 10 +4 4 5 9 8 +4 5 7 11 9 +4 10 8 12 14 +4 8 9 13 12 +4 9 11 15 13 +4 14 12 16 18 +4 12 13 17 16 +4 13 15 19 17 +4 20 18 16 21 +4 16 17 22 21 +4 19 23 22 17 +4 20 21 24 26 +4 21 22 25 24 +4 22 23 27 25 +4 28 0 6 30 +4 28 29 1 0 +4 1 29 31 7 +4 32 28 30 34 +4 32 33 29 28 +4 29 33 35 31 +4 36 32 34 38 +4 36 37 33 32 +4 33 37 39 35 +4 40 36 38 42 +4 40 41 37 36 +4 37 41 43 39 +4 24 40 42 26 +4 24 25 41 40 +4 41 25 27 43 +4 30 6 10 14 +4 7 31 15 11 +4 34 30 14 18 +4 31 35 19 15 +4 38 34 18 20 +4 35 39 23 19 +4 42 38 20 26 +4 39 43 27 23 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/rond_point_saucisse.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/rond_point_saucisse.off new file mode 100644 index 00000000000..948a45e2473 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/rond_point_saucisse.off @@ -0,0 +1,229 @@ +OFF +121 106 0 +-2.50375 -0.516139 0.198797 +-1.98291 -0.671813 0.587027 +-2.03657 -1.18334 1.01329 +-2.43631 -0.894717 1.479 +-2.54009 -0.892193 1.54059 +-2.68868 -0.382614 0.414246 +-3.00727 -0.224994 0.726096 +-2.91945 -0.290888 1.43624 +-1.72271 -2.2432 -0.0349185 +-1.65932 -2.07675 0.0650672 +-2.22151 -1.04981 1.22875 +-1.71823 -1.10996 0.0763082 +-1.74768 -1.68395 0.43751 +-2.21485 -1.01676 -0.376989 +-2.12649 -1.40955 -0.749431 +-2.18988 -1.576 -0.849417 +-1.7923 -2.21079 -0.782954 +-2.90349 -0.227519 0.664501 +-1.02163 1.01362 1.41629 +-0.849079 0.410871 1.63807 +-0.97116 -0.127437 1.26714 +-1.63434 0.150423 1.87513 +-1.44232 -0.283706 1.40938 +-1.26579 -0.0629923 0.674424 +-1.57989 -0.167172 0.769248 +-1.83629 -0.614462 1.36441 +-1.84254 -0.387675 0.739273 +-1.90949 0.383492 0.594878 +-2.30347 0.052736 0.549915 +-1.98337 -0.66542 0.59253 +-2.5147 -0.363881 0.329801 +-2.75814 0.266361 0.985697 +-1.75411 -2.21623 -0.809311 +-1.45948 -2.28067 -0.216595 +-1.3374 -1.74236 0.154339 +-0.674221 -2.02022 -0.453655 +-0.866245 -1.58609 0.0121028 +-1.50995 -1.13961 -0.0674434 +-1.19585 -1.03543 -0.162267 +-1.33342 -0.918895 -0.802395 +-1.31626 1.07807 0.823576 +-1.43834 0.539761 0.452642 +-2.10152 0.817621 1.06064 +-1.96394 0.701086 1.70076 +-2.75189 0.0395748 1.61084 +-2.29097 -0.400837 1.8002 +-2.04753 -1.03108 1.1443 +-1.80458 -1.07516 -0.660159 +-1.92666 -1.61347 -1.03109 +-1.1414 -1.35302 -1.26815 +-0.811798 -1.90369 -1.09378 +-2.21723 -1.36385 -0.797718 +-2.52949 -2.18379 -1.29026 +-1.96477 -2.66366 -1.055 +-2.37933 -0.643249 -0.114454 +-1.78458 -0.81501 0.355971 +-1.67103 -2.1439 0.154541 +-1.83314 -1.42329 0.837806 +-2.42618 -0.995104 1.52871 +-2.47645 -1.85982 0.849216 +-2.83227 -1.6029 1.26376 +-3.29125 -0.974062 2.04214 +-3.35132 -1.59028 1.57181 +-3.30842 -1.51678 0.655154 +-3.65445 -1.50836 0.860524 +-3.8945 -1.82532 1.69083 +-4.01657 -1.66506 0.93987 +-3.89751 -0.810232 0.619555 +-4.4407 -1.04528 0.738575 +-4.29776 -1.94489 0.871934 +-4.86248 -1.46502 0.63667 +-4.74276 -0.585761 1.28824 +-5.44573 -1.28532 1.1184 +-5.04984 -1.95698 0.341146 +-5.75799 -2.10526 0.625862 +-5.46425 -1.5855 1.8354 +-5.83897 -2.56942 1.24435 +-5.59589 -2.82586 -0.0574029 +-5.64445 -3.43415 0.424432 +-5.2118 -2.8853 1.57812 +-5.0497 -3.60591 0.894857 +-4.9328 -3.94797 -0.404657 +-4.45665 -4.0341 0.203949 +-4.40638 -3.16938 0.883446 +-4.05056 -3.4263 0.468902 +-3.59158 -4.05514 -0.309474 +-3.53151 -3.43892 0.160848 +-4.12061 -2.73238 0.125249 +-3.77458 -2.74079 -0.0801206 +-2.98833 -3.20388 0.041828 +-3.41245 -2.5841 -0.159467 +-4.07771 -2.65888 -0.791411 +-3.53452 -2.42383 -0.910432 +-3.13127 -2.30427 -0.0915308 +-3.11274 -2.00409 -0.808527 +-3.23246 -2.88335 -1.4601 +-2.92538 -1.51213 -0.513002 +-3.02264 -1.07977 -0.103043 +-2.97237 -0.215059 0.576454 +-3.37847 -0.822858 0.311501 +-3.0712 -1.68806 0.378791 +-3.83745 -0.194017 1.08988 +-3.53432 -0.275932 1.80117 +-4.62069 -0.746025 2.03921 +-4.19656 -1.36581 2.2405 +-4.89953 -2.06537 2.07066 +-4.31629 -2.24506 1.58893 +-4.50365 -2.73702 1.29341 +-4.42267 -2.27286 0.674917 +-4.35782 -2.5611 0.401612 +-4.95258 -2.38934 -0.068813 +-4.59675 -2.64625 -0.483358 +-5.00285 -3.25405 -0.748311 +-4.13777 -3.27509 -1.26173 +-3.89471 -3.97322 -1.02076 +-2.80834 -3.50313 -1.25881 +-2.68627 -3.6634 -0.507841 +-1.9833 -2.96383 -0.337999 +-2.56655 -2.78414 0.143733 +-2.37919 -2.29218 0.439257 +-3.00636 -1.9763 0.105486 +4 0 1 29 30 +7 1 0 5 17 98 54 55 +4 1 2 46 29 +7 2 1 55 57 58 3 10 +6 3 4 45 25 46 10 +6 4 3 58 61 102 7 +3 5 0 30 +4 7 6 31 44 +6 6 7 102 101 98 17 +5 8 9 12 34 33 +6 9 8 16 53 117 56 +3 2 10 46 +4 12 11 37 34 +6 11 12 9 56 57 55 +5 13 14 15 48 47 +6 14 13 11 55 54 51 +4 15 16 32 48 +6 16 15 14 51 52 53 +4 4 7 44 45 +6 17 5 30 28 31 6 +4 16 8 33 32 +4 11 13 47 37 +4 18 19 21 43 +4 20 22 21 19 +4 21 22 25 45 +4 24 23 41 27 +4 24 26 25 22 +4 25 26 29 46 +4 28 27 42 31 +4 28 30 29 26 +4 32 33 35 50 +4 34 36 35 33 +4 38 37 47 39 +4 41 40 42 27 +4 42 40 18 43 +4 44 43 21 45 +4 49 48 32 50 +4 48 49 39 47 +4 43 44 31 42 +4 38 36 34 37 +4 28 26 24 27 +4 24 22 20 23 +4 52 51 96 94 +4 53 52 95 115 +4 51 54 97 96 +4 57 56 119 59 +4 60 59 100 63 +4 60 62 61 58 +4 61 62 65 104 +4 64 63 99 67 +4 64 66 65 62 +4 65 66 69 106 +4 68 67 101 71 +4 68 70 69 66 +4 69 70 73 108 +4 72 71 103 75 +4 72 74 73 70 +4 73 74 77 110 +4 76 75 105 79 +4 76 78 77 74 +4 77 78 81 112 +4 80 79 107 83 +4 80 82 81 78 +4 81 82 85 114 +4 84 83 109 87 +4 84 86 85 82 +4 85 86 89 116 +4 88 87 111 91 +4 88 90 89 86 +4 89 90 93 118 +4 92 91 113 95 +4 92 94 93 90 +4 93 94 96 120 +4 96 97 100 120 +4 97 54 98 99 +4 99 98 101 67 +4 103 102 61 104 +4 105 104 65 106 +4 107 106 69 108 +4 109 108 73 110 +4 111 110 77 112 +4 113 112 81 114 +4 115 114 85 116 +4 117 116 89 118 +4 119 118 93 120 +4 120 100 59 119 +4 118 119 56 117 +4 116 117 53 115 +4 114 115 95 113 +4 112 113 91 111 +4 110 111 87 109 +4 108 109 83 107 +4 106 107 79 105 +4 104 105 75 103 +4 102 103 71 101 +4 99 63 100 97 +4 52 94 92 95 +4 92 90 88 91 +4 88 86 84 87 +4 84 82 80 83 +4 80 78 76 79 +4 76 74 72 75 +4 72 70 68 71 +4 68 66 64 67 +4 64 62 60 63 +4 60 58 57 59 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/small-cylinder-two-borders.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/small-cylinder-two-borders.off new file mode 100644 index 00000000000..39483f396df --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/small-cylinder-two-borders.off @@ -0,0 +1,17 @@ +OFF +9 6 0 +-6.52772 2.40244 3.29512 +-3.65721 4.25361 3.16505 +-0.509359 -0.519711 4.70039 +-3.37987 -2.37088 4.83046 +-9.39823 0.551268 3.42519 +-6.25039 -4.22205 4.96052 +-4.391 -1.20458 -0.885151 +-1.52048 0.646594 -1.01522 +-7.26151 -3.05575 -0.755083 +4 0 1 2 3 +4 4 0 3 5 +4 6 7 1 0 +4 8 6 0 4 +4 3 2 7 6 +4 5 3 6 8 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/sphere.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/sphere.off new file mode 100644 index 00000000000..45e5dc101be --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/sphere.off @@ -0,0 +1,222 @@ +OFF +74 144 0 + +0.39069100000000001 0.456926 5.4902199999999999 +-1.7705500000000001 1.8378099999999999 5.0874499999999996 +-1.3979200000000001 -0.27602300000000002 5.2003000000000004 +1.47278 -1.2599100000000001 4.7820799999999997 +0.0236338 -3.47987 2.9026700000000001 +0.79099600000000003 -3.9353199999999999 0.94726900000000003 +2.2539899999999999 -2.56589 3.2642000000000002 +2.3851200000000001 -3.0432700000000001 -0.89746499999999996 +-2.72492 1.86527 4.5726300000000002 +-2.9020199999999998 -2.1121699999999999 3.2637800000000001 +-0.75758000000000003 -2.17388 4.42056 +-2.1208 -3.4181599999999999 1.7459 +0.43815500000000002 -3.4225599999999998 -1.57317 +-3.1176200000000001 -0.22653599999999999 4.2726300000000004 +-3.3853200000000001 2.3195999999999999 3.8418399999999999 +-4.3076299999999996 0.59212699999999996 2.9558 +-4.3859300000000001 -1.09131 1.62171 +-2.1187200000000002 -3.06717 -1.2972300000000001 +-0.222249 -2.9682400000000002 -2.30396 +-0.92870900000000001 -3.8858299999999999 0.019606999999999999 +-3.5748099999999998 3.0790500000000001 3.0908899999999999 +-4.6490799999999997 1.96061 1.60263 +-4.0305 -0.69083499999999998 -1.58355 +-2.4601600000000001 -1.69869 -2.6503999999999999 +-3.6047199999999999 -2.3973 0.103825 +-4.0504699999999998 3.5122200000000001 0.57570600000000005 +-4.0652600000000003 2.5499800000000001 -1.3462099999999999 +-3.2840500000000001 1.2439899999999999 -2.8641000000000001 +-4.8117099999999997 0.61515200000000003 -0.065661999999999998 +-0.079538200000000003 -1.34771 -3.6248100000000001 +-2.4777300000000002 4.67211 2.28485 +-2.6722199999999998 4.8312099999999996 0.150199 +-2.3466100000000001 4.1947400000000004 -1.8768100000000001 +-0.48330299999999998 1.1719200000000001 -4.10283 +-0.88360799999999995 5.5641600000000002 0.44011800000000001 +0.66496900000000003 3.8027199999999999 -3.0331700000000001 +1.30531 1.9048700000000001 -3.81291 +-1.5653900000000001 2.8887499999999999 -3.3946999999999998 +0.68533699999999997 -0.61572199999999999 -3.8609499999999999 +-0.53076699999999999 5.0514000000000001 2.9605600000000001 +2.0281899999999999 5.0469999999999997 -0.35850900000000002 +3.02501 1.85538 -2.8852500000000001 +1.67794 -0.20896600000000001 -3.7000600000000001 +2.0261 4.6960100000000002 2.6846199999999998 +4.2933199999999996 2.7201599999999999 -0.23432600000000001 +4.21502 1.0367200000000001 -1.5684100000000001 +2.8094100000000002 3.7410100000000002 -1.8764000000000001 +2.6322999999999999 -0.236429 -3.1852399999999998 +0.129637 4.5970800000000001 3.6913499999999999 +2.36755 3.3275299999999999 4.0377900000000002 +3.5121099999999998 4.0261500000000003 1.28356 +4.7191000000000001 1.01369 1.45305 +4.55647 -0.33176299999999997 -0.21523800000000001 +3.29271 -0.69075299999999995 -2.45445 +0.31912600000000002 3.8376299999999999 4.4423000000000004 +1.76895 1.7759199999999999 5.0647099999999998 +3.9378799999999998 2.31968 2.9709400000000001 +3.1914400000000001 0.384849 4.2514900000000004 +3.9578600000000002 -1.8833800000000001 0.81168099999999999 +3.4822000000000002 -1.4501999999999999 -1.7035 +-0.013073700000000001 2.97655 5.0122 +3.9726499999999998 -0.92113800000000001 2.7336 +3.1499999999999999 -2.31128 -1.1335999999999999 +2.5796100000000002 -3.2023700000000002 1.23719 +-0.777949 2.24457 5.2483399999999998 +0.83609699999999998 5.5146699999999997 1.36778 +-0.116246 5.1087100000000003 -1.51529 +-1.4851300000000001 5.0788700000000002 2.4457499999999999 +-1.8615600000000001 -0.14707400000000001 -3.6773199999999999 +-3.24261 3.9401299999999999 2.5209899999999998 +-0.41173799999999999 -2.20879 -3.05491 +1.39252 -3.4500199999999999 -1.05836 +1.7090700000000001 -2.1200999999999999 -2.7169699999999999 +-1.8016799999999999 3.7489499999999998 4.1043599999999998 +3 64 1 0 +3 0 1 2 +3 10 3 2 +3 2 3 0 +3 10 4 3 +3 3 4 6 +3 63 6 5 +3 5 6 4 +3 71 7 5 +3 5 7 63 +3 13 2 8 +3 8 2 1 +3 13 9 2 +3 2 9 10 +3 9 11 10 +3 10 11 4 +3 19 5 11 +3 11 5 4 +3 71 5 12 +3 12 5 19 +3 8 14 13 +3 13 14 15 +3 13 15 9 +3 9 15 16 +3 24 11 16 +3 16 11 9 +3 19 11 17 +3 17 11 24 +3 12 19 18 +3 18 19 17 +3 14 20 15 +3 15 20 21 +3 28 16 21 +3 21 16 15 +3 28 22 16 +3 16 22 24 +3 17 24 23 +3 23 24 22 +3 17 23 18 +3 18 23 70 +3 69 25 20 +3 20 25 21 +3 25 26 21 +3 21 26 28 +3 22 28 27 +3 27 28 26 +3 68 23 27 +3 27 23 22 +3 70 23 29 +3 29 23 68 +3 69 30 25 +3 25 30 31 +3 32 26 31 +3 31 26 25 +3 26 32 27 +3 27 32 37 +3 68 27 33 +3 33 27 37 +3 68 33 29 +3 29 33 38 +3 67 34 30 +3 30 34 31 +3 31 34 32 +3 32 34 66 +3 66 35 32 +3 32 35 37 +3 33 37 36 +3 36 37 35 +3 42 38 36 +3 36 38 33 +3 67 39 34 +3 34 39 65 +3 65 40 34 +3 34 40 66 +3 46 35 40 +3 40 35 66 +3 36 35 41 +3 41 35 46 +3 47 42 41 +3 41 42 36 +3 48 43 39 +3 39 43 65 +3 65 43 40 +3 40 43 50 +3 50 44 40 +3 40 44 46 +3 41 46 45 +3 45 46 44 +3 41 45 47 +3 47 45 53 +3 54 49 48 +3 48 49 43 +3 43 49 50 +3 50 49 56 +3 56 51 50 +3 50 51 44 +3 44 51 45 +3 45 51 52 +3 59 53 52 +3 52 53 45 +3 60 55 54 +3 54 55 49 +3 57 56 55 +3 55 56 49 +3 61 51 57 +3 57 51 56 +3 52 51 58 +3 58 51 61 +3 62 59 58 +3 58 59 52 +3 64 0 60 +3 60 0 55 +3 0 3 55 +3 55 3 57 +3 57 3 61 +3 61 3 6 +3 61 6 58 +3 58 6 63 +3 62 58 7 +3 7 58 63 +3 62 7 72 +3 59 62 72 +3 53 59 72 +3 47 53 72 +3 42 47 72 +3 38 42 72 +3 29 38 72 +3 70 29 72 +3 18 70 72 +3 12 18 72 +3 71 12 72 +3 7 71 72 +3 73 64 60 +3 73 60 54 +3 73 54 48 +3 73 48 39 +3 73 39 67 +3 73 67 30 +3 73 30 69 +3 73 69 20 +3 73 20 14 +3 73 14 8 +3 73 8 1 +3 73 1 64 + diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/spiral-squared.moka b/Surface_mesh_topology/test/Surface_mesh_topology/data/spiral-squared.moka new file mode 100644 index 00000000000..07a4b4527c1 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/spiral-squared.moka @@ -0,0 +1,354 @@ +Moka file [ascii] +168 7 0 0 0 0 0 0 +1 7 35 0 169 0 0 0 0 +0 2 34 1 169 0 0 0 0 +3 1 33 2 169 0 0 0 0 +2 4 32 3 169 0 0 0 0 +5 3 149 4 169 0 0 0 0 +4 6 148 5 169 0 0 0 0 +7 5 115 6 169 0 0 0 0 +6 0 114 7 169 0 0 0 0 +9 15 43 8 169 0 0 0 1 0.434263 -0.442403 -0.0272152 +8 10 42 9 169 0 0 0 0 +11 9 41 10 169 0 0 0 1 -0.0167486 -0.111827 0.00206928 +10 12 40 11 169 0 0 0 0 +13 11 157 12 169 0 0 0 1 -0.711044 -0.625093 0.00496407 +12 14 156 13 169 0 0 0 1 0.0635676 1.50128 0.000485811 +15 13 123 14 169 0 0 0 0 +14 8 122 15 169 0 0 0 0 +17 23 187 16 169 0 0 0 0 +16 18 186 17 169 0 0 0 0 +19 17 37 18 169 0 0 0 0 +18 20 36 19 169 0 0 0 0 +21 19 339 20 169 0 0 0 0 +20 22 338 21 169 0 0 0 0 +23 21 67 22 169 0 0 0 0 +22 16 66 23 169 0 0 0 0 +25 31 203 24 169 0 0 0 1 1.48858 -1.50635 -0.00219208 +24 26 202 25 169 0 0 0 0 +27 25 45 26 169 0 0 0 1 0.34562 -1.52335 0.00190803 +26 28 44 27 169 0 0 0 0 +29 27 347 28 169 0 0 0 0 +28 30 346 29 169 0 0 0 1 0.742424 -0.472759 -0.00035494 +31 29 75 30 169 0 0 0 0 +30 24 74 31 169 0 0 0 0 +33 39 3 32 169 0 0 0 0 +32 34 2 33 169 0 0 0 0 +35 33 1 34 169 0 0 0 1 -0.0167486 -0.111827 1.50207 +34 36 0 35 169 0 0 0 0 +37 35 19 36 169 0 0 0 1 0.434263 -0.442403 1.47278 +36 38 18 37 169 0 0 0 0 +39 37 173 38 169 0 0 0 0 +38 32 172 39 169 0 0 0 0 +41 47 11 40 169 0 0 0 0 +40 42 10 41 169 0 0 0 0 +43 41 9 42 169 0 0 0 0 +42 44 8 43 169 0 0 0 0 +45 43 27 44 169 0 0 0 0 +44 46 26 45 169 0 0 0 0 +47 45 181 46 169 0 0 0 0 +46 40 180 47 169 0 0 0 0 +49 55 259 48 169 0 0 0 0 +48 50 258 49 169 0 0 0 0 +51 49 85 50 169 0 0 0 0 +50 52 84 51 169 0 0 0 0 +53 51 97 52 169 0 0 0 0 +52 54 96 53 169 0 0 0 0 +55 53 103 54 169 0 0 0 0 +54 48 102 55 169 0 0 0 0 +57 63 275 56 169 0 0 0 1 2.22227 1.25089 0.0314059 +56 58 274 57 169 0 0 0 1 2.57992 -0.0560678 -0.00725942 +59 57 93 58 169 0 0 0 0 +58 60 92 59 169 0 0 0 1 0.960919 0.353084 -0.00179979 +61 59 105 60 169 0 0 0 0 +60 62 104 61 169 0 0 0 1 1.2943 0.405067 -0.0030335 +63 61 111 62 169 0 0 0 0 +62 56 110 63 169 0 0 0 0 +65 71 211 64 169 0 0 0 0 +64 66 210 65 169 0 0 0 0 +67 65 23 66 169 0 0 0 0 +66 68 22 67 169 0 0 0 0 +69 67 337 68 169 0 0 0 0 +68 70 336 69 169 0 0 0 0 +71 69 81 70 169 0 0 0 0 +70 64 80 71 169 0 0 0 0 +73 79 227 72 169 0 0 0 1 2.29455 -0.914557 -0.00554924 +72 74 226 73 169 0 0 0 0 +75 73 31 74 169 0 0 0 0 +74 76 30 75 169 0 0 0 0 +77 75 345 76 169 0 0 0 0 +76 78 344 77 169 0 0 0 1 0.974675 -0.385735 -0.00125524 +79 77 89 78 169 0 0 0 0 +78 72 88 79 169 0 0 0 0 +81 87 71 80 169 0 0 0 0 +80 82 70 81 169 0 0 0 0 +83 81 343 82 169 0 0 0 0 +82 84 342 83 169 0 0 0 0 +85 83 51 84 169 0 0 0 0 +84 86 50 85 169 0 0 0 0 +87 85 233 86 169 0 0 0 0 +86 80 232 87 169 0 0 0 0 +89 95 79 88 169 0 0 0 0 +88 90 78 89 169 0 0 0 0 +91 89 351 90 169 0 0 0 0 +90 92 350 91 169 0 0 0 0 +93 91 59 92 169 0 0 0 0 +92 94 58 93 169 0 0 0 0 +95 93 249 94 169 0 0 0 0 +94 88 248 95 169 0 0 0 0 +97 103 53 96 169 0 0 0 0 +96 98 52 97 169 0 0 0 0 +99 97 119 98 169 0 0 0 0 +98 100 118 99 169 0 0 0 0 +101 99 281 100 169 0 0 0 0 +100 102 280 101 169 0 0 0 0 +103 101 55 102 169 0 0 0 0 +102 96 54 103 169 0 0 0 1 1.2943 0.405067 1.49697 +105 111 61 104 169 0 0 0 0 +104 106 60 105 169 0 0 0 0 +107 105 127 106 169 0 0 0 0 +106 108 126 107 169 0 0 0 0 +109 107 297 108 169 0 0 0 1 1.10639 1.68746 -0.00339222 +108 110 296 109 169 0 0 0 0 +111 109 63 110 169 0 0 0 0 +110 104 62 111 169 0 0 0 0 +113 119 341 112 169 0 0 0 0 +112 114 340 113 169 0 0 0 0 +115 113 7 114 169 0 0 0 0 +114 116 6 115 169 0 0 0 0 +117 115 305 116 169 0 0 0 0 +116 118 304 117 169 0 0 0 0 +119 117 99 118 169 0 0 0 0 +118 112 98 119 169 0 0 0 0 +121 127 349 120 169 0 0 0 0 +120 122 348 121 169 0 0 0 0 +123 121 15 122 169 0 0 0 0 +122 124 14 123 169 0 0 0 0 +125 123 329 124 169 0 0 0 0 +124 126 328 125 169 0 0 0 0 +127 125 107 126 169 0 0 0 0 +126 120 106 127 169 0 0 0 0 +133 151 129 128 169 0 0 0 0 +134 130 128 129 169 0 0 0 0 +131 129 167 130 169 0 0 0 0 +130 132 168 131 169 0 0 0 0 +137 131 152 132 169 0 0 0 0 +128 138 134 133 169 0 0 0 0 +129 135 133 134 169 0 0 0 0 +136 134 140 135 169 0 0 0 0 +135 137 141 136 169 0 0 0 0 +132 136 153 137 169 0 0 0 0 +143 133 139 138 169 0 0 0 1 -1.45662 0.917163 1.50639 +144 140 138 139 169 0 0 0 0 +141 139 135 140 169 0 0 0 0 +140 142 136 141 169 0 0 0 0 +147 141 154 142 169 0 0 0 0 +138 148 144 143 169 0 0 0 0 +139 145 143 144 169 0 0 0 0 +146 144 308 145 169 0 0 0 0 +145 147 309 146 169 0 0 0 0 +142 146 155 147 169 0 0 0 0 +149 143 5 148 169 0 0 0 1 0.0635676 1.50128 1.50049 +148 150 4 149 169 0 0 0 0 +151 149 171 150 169 0 0 0 0 +150 128 170 151 169 0 0 0 0 +153 159 132 152 169 0 0 0 1 -1.72272 -1.11365 0.00897371 +152 154 137 153 169 0 0 0 0 +155 153 142 154 169 0 0 0 1 -1.45662 0.917163 0.00639035 +154 156 147 155 169 0 0 0 0 +157 155 13 156 169 0 0 0 0 +156 158 12 157 169 0 0 0 0 +159 157 179 158 169 0 0 0 0 +158 152 178 159 169 0 0 0 0 +165 175 161 160 169 0 0 0 0 +166 162 160 161 169 0 0 0 0 +163 161 197 162 169 0 0 0 0 +162 164 198 163 169 0 0 0 0 +169 163 176 164 169 0 0 0 0 +160 170 166 165 169 0 0 0 0 +161 167 165 166 169 0 0 0 0 +168 166 130 167 169 0 0 0 0 +167 169 131 168 169 0 0 0 0 +164 168 177 169 169 0 0 0 0 +171 165 151 170 169 0 0 0 1 -1.72272 -1.11365 1.50897 +170 172 150 171 169 0 0 0 0 +173 171 39 172 169 0 0 0 1 -0.711044 -0.625093 1.50496 +172 174 38 173 169 0 0 0 0 +175 173 185 174 169 0 0 0 0 +174 160 184 175 169 0 0 0 0 +177 183 164 176 169 0 0 0 1 -0.044416 -2.4175 0.00402107 +176 178 169 177 169 0 0 0 0 +179 177 159 178 169 0 0 0 0 +178 180 158 179 169 0 0 0 0 +181 179 47 180 169 0 0 0 0 +180 182 46 181 169 0 0 0 0 +183 181 201 182 169 0 0 0 0 +182 176 200 183 169 0 0 0 0 +185 195 175 184 169 0 0 0 0 +184 186 174 185 169 0 0 0 0 +187 185 17 186 169 0 0 0 1 0.34562 -1.52335 1.50191 +186 188 16 187 169 0 0 0 0 +189 187 209 188 169 0 0 0 0 +188 190 208 189 169 0 0 0 0 +195 189 191 190 169 0 0 0 0 +196 192 190 191 169 0 0 0 0 +193 191 221 192 169 0 0 0 0 +192 194 222 193 169 0 0 0 0 +199 193 206 194 169 0 0 0 0 +190 184 196 195 169 0 0 0 1 -0.044416 -2.4175 1.50402 +191 197 195 196 169 0 0 0 0 +198 196 162 197 169 0 0 0 0 +197 199 163 198 169 0 0 0 0 +194 198 207 199 169 0 0 0 0 +201 207 183 200 169 0 0 0 0 +200 202 182 201 169 0 0 0 0 +203 201 25 202 169 0 0 0 0 +202 204 24 203 169 0 0 0 0 +205 203 225 204 169 0 0 0 0 +204 206 224 205 169 0 0 0 1 1.87037 -2.40257 -0.00283687 +207 205 194 206 169 0 0 0 0 +206 200 199 207 169 0 0 0 0 +209 219 189 208 169 0 0 0 0 +208 210 188 209 169 0 0 0 0 +211 209 65 210 169 0 0 0 1 1.48858 -1.50635 1.49781 +210 212 64 211 169 0 0 0 0 +213 211 247 212 169 0 0 0 0 +212 214 246 213 169 0 0 0 0 +219 213 215 214 169 0 0 0 0 +220 216 214 215 169 0 0 0 0 +217 215 243 216 169 0 0 0 0 +216 218 244 217 169 0 0 0 0 +223 217 230 218 169 0 0 0 0 +214 208 220 219 169 0 0 0 1 1.87037 -2.40257 1.49716 +215 221 219 220 169 0 0 0 0 +222 220 192 221 169 0 0 0 0 +221 223 193 222 169 0 0 0 0 +218 222 231 223 169 0 0 0 0 +225 231 205 224 169 0 0 0 0 +224 226 204 225 169 0 0 0 0 +227 225 73 226 169 0 0 0 0 +226 228 72 227 169 0 0 0 0 +229 227 255 228 169 0 0 0 0 +228 230 254 229 169 0 0 0 1 2.99294 -1.4523 -0.00761403 +231 229 218 230 169 0 0 0 0 +230 224 223 231 169 0 0 0 0 +233 247 87 232 169 0 0 0 0 +232 234 86 233 169 0 0 0 0 +235 233 257 234 169 0 0 0 0 +234 236 256 235 169 0 0 0 0 +241 235 237 236 169 0 0 0 0 +242 238 236 237 169 0 0 0 0 +239 237 269 238 169 0 0 0 0 +238 240 270 239 169 0 0 0 0 +245 239 252 240 169 0 0 0 0 +236 246 242 241 169 0 0 0 0 +237 243 241 242 169 0 0 0 0 +244 242 216 243 169 0 0 0 0 +243 245 217 244 169 0 0 0 0 +240 244 253 245 169 0 0 0 0 +247 241 213 246 169 0 0 0 1 2.99294 -1.4523 1.49239 +246 232 212 247 169 0 0 0 1 2.29455 -0.914557 1.49445 +249 255 95 248 169 0 0 0 0 +248 250 94 249 169 0 0 0 0 +251 249 273 250 169 0 0 0 0 +250 252 272 251 169 0 0 0 1 3.46883 -0.00754211 -0.0104765 +253 251 240 252 169 0 0 0 0 +252 254 245 253 169 0 0 0 0 +255 253 229 254 169 0 0 0 0 +254 248 228 255 169 0 0 0 0 +257 267 235 256 169 0 0 0 0 +256 258 234 257 169 0 0 0 0 +259 257 49 258 169 0 0 0 1 2.57992 -0.0560678 1.49274 +258 260 48 259 169 0 0 0 0 +261 259 295 260 169 0 0 0 0 +260 262 294 261 169 0 0 0 0 +267 261 263 262 169 0 0 0 0 +268 264 262 263 169 0 0 0 0 +265 263 291 264 169 0 0 0 0 +264 266 292 265 169 0 0 0 0 +271 265 278 266 169 0 0 0 0 +262 256 268 267 169 0 0 0 1 3.46883 -0.00754211 1.48952 +263 269 267 268 169 0 0 0 0 +270 268 238 269 169 0 0 0 0 +269 271 239 270 169 0 0 0 0 +266 270 279 271 169 0 0 0 0 +273 279 251 272 169 0 0 0 0 +272 274 250 273 169 0 0 0 0 +275 273 57 274 169 0 0 0 0 +274 276 56 275 169 0 0 0 0 +277 275 303 276 169 0 0 0 0 +276 278 302 277 169 0 0 0 1 2.93554 1.86898 0.0175055 +279 277 266 278 169 0 0 0 0 +278 272 271 279 169 0 0 0 0 +281 295 101 280 169 0 0 0 0 +280 282 100 281 169 0 0 0 0 +283 281 327 282 169 0 0 0 0 +282 284 326 283 169 0 0 0 0 +289 283 285 284 169 0 0 0 0 +290 286 284 285 169 0 0 0 0 +287 285 323 286 169 0 0 0 0 +286 288 324 287 169 0 0 0 0 +293 287 300 288 169 0 0 0 0 +284 294 290 289 169 0 0 0 0 +285 291 289 290 169 0 0 0 0 +292 290 264 291 169 0 0 0 0 +291 293 265 292 169 0 0 0 0 +288 292 301 293 169 0 0 0 0 +295 289 261 294 169 0 0 0 1 2.93554 1.86898 1.51751 +294 280 260 295 169 0 0 0 1 2.22227 1.25089 1.53141 +297 303 109 296 169 0 0 0 0 +296 298 108 297 169 0 0 0 0 +299 297 335 298 169 0 0 0 0 +298 300 334 299 169 0 0 0 0 +301 299 288 300 169 0 0 0 1 1.10639 2.72388 -0.00422509 +300 302 293 301 169 0 0 0 0 +303 301 277 302 169 0 0 0 0 +302 296 276 303 169 0 0 0 0 +305 327 117 304 169 0 0 0 0 +304 306 116 305 169 0 0 0 0 +311 305 307 306 169 0 0 0 0 +312 308 306 307 169 0 0 0 0 +309 307 145 308 169 0 0 0 0 +308 310 146 309 169 0 0 0 0 +315 309 330 310 169 0 0 0 0 +306 316 312 311 169 0 0 0 0 +307 313 311 312 169 0 0 0 0 +314 312 318 313 169 0 0 0 0 +313 315 319 314 169 0 0 0 0 +310 314 331 315 169 0 0 0 0 +321 311 317 316 169 0 0 0 1 0.0699859 2.72388 1.49948 +322 318 316 317 169 0 0 0 0 +319 317 313 318 169 0 0 0 0 +318 320 314 319 169 0 0 0 0 +325 319 332 320 169 0 0 0 0 +316 326 322 321 169 0 0 0 0 +317 323 321 322 169 0 0 0 0 +324 322 286 323 169 0 0 0 0 +323 325 287 324 169 0 0 0 0 +320 324 333 325 169 0 0 0 0 +327 321 283 326 169 0 0 0 1 1.10639 2.72388 1.49577 +326 304 282 327 169 0 0 0 1 1.10639 1.68746 1.49661 +329 335 125 328 169 0 0 0 0 +328 330 124 329 169 0 0 0 0 +331 329 310 330 169 0 0 0 0 +330 332 315 331 169 0 0 0 0 +333 331 320 332 169 0 0 0 1 0.0699859 2.72388 -0.00051964 +332 334 325 333 169 0 0 0 0 +335 333 299 334 169 0 0 0 0 +334 328 298 335 169 0 0 0 0 +337 343 69 336 169 0 0 0 0 +336 338 68 337 169 0 0 0 0 +339 337 21 338 169 0 0 0 1 0.742424 -0.472759 1.49965 +338 340 20 339 169 0 0 0 0 +341 339 113 340 169 0 0 0 0 +340 342 112 341 169 0 0 0 0 +343 341 83 342 169 0 0 0 1 0.960919 0.353084 1.4982 +342 336 82 343 169 0 0 0 1 0.974675 -0.385735 1.49874 +345 351 77 344 169 0 0 0 0 +344 346 76 345 169 0 0 0 0 +347 345 29 346 169 0 0 0 0 +346 348 28 347 169 0 0 0 0 +349 347 121 348 169 0 0 0 0 +348 350 120 349 169 0 0 0 0 +351 349 91 350 169 0 0 0 0 +350 344 90 351 169 0 0 0 0 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/spiral-squared.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/spiral-squared.off new file mode 100644 index 00000000000..8defc5ea429 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/spiral-squared.off @@ -0,0 +1,92 @@ +OFF +46 44 0 +0.434263 -0.442403 1.47278 +-0.0167486 -0.111827 1.50207 +-0.711044 -0.625093 1.50496 +0.0635676 1.50128 1.50049 +0.434263 -0.442403 -0.0272152 +-0.0167486 -0.111827 0.00206928 +-0.711044 -0.625093 0.00496407 +0.0635676 1.50128 0.000485811 +1.48858 -1.50635 1.49781 +0.34562 -1.52335 1.50191 +0.742424 -0.472759 1.49965 +1.48858 -1.50635 -0.00219208 +0.34562 -1.52335 0.00190803 +0.742424 -0.472759 -0.00035494 +2.22227 1.25089 1.53141 +2.57992 -0.0560678 1.49274 +0.960919 0.353084 1.4982 +1.2943 0.405067 1.49697 +2.22227 1.25089 0.0314059 +2.57992 -0.0560678 -0.00725942 +0.960919 0.353084 -0.00179979 +1.2943 0.405067 -0.0030335 +2.29455 -0.914557 1.49445 +0.974675 -0.385735 1.49874 +2.29455 -0.914557 -0.00554924 +0.974675 -0.385735 -0.00125524 +1.10639 1.68746 1.49661 +1.10639 1.68746 -0.00339222 +-1.72272 -1.11365 1.50897 +-1.72272 -1.11365 0.00897371 +-1.45662 0.917163 1.50639 +-1.45662 0.917163 0.00639035 +-0.044416 -2.4175 1.50402 +-0.044416 -2.4175 0.00402107 +1.87037 -2.40257 1.49716 +1.87037 -2.40257 -0.00283687 +2.99294 -1.4523 1.49239 +2.99294 -1.4523 -0.00761403 +3.46883 -0.00754211 1.48952 +3.46883 -0.00754211 -0.0104765 +2.93554 1.86898 1.51751 +2.93554 1.86898 0.0175055 +1.10639 2.72388 1.49577 +1.10639 2.72388 -0.00422509 +0.0699859 2.72388 1.49948 +0.0699859 2.72388 -0.00051964 +4 0 1 2 3 +4 5 4 7 6 +4 8 9 0 10 +4 12 11 13 4 +4 2 1 0 9 +4 5 6 12 4 +4 14 15 16 17 +4 19 18 21 20 +4 22 8 10 23 +4 11 24 25 13 +4 22 23 16 15 +4 25 24 19 20 +4 17 16 26 14 +4 20 21 18 27 +4 16 0 3 26 +4 4 20 27 7 +4 28 30 3 2 +4 28 29 31 30 +4 30 31 7 3 +4 31 29 6 7 +4 32 28 2 9 +4 32 33 29 28 +4 29 33 12 6 +4 32 9 8 34 +4 34 35 33 32 +4 12 33 35 11 +4 34 8 22 36 +4 36 37 35 34 +4 11 35 37 24 +4 22 15 38 36 +4 38 39 37 36 +4 19 24 37 39 +4 38 15 14 40 +4 40 41 39 38 +4 19 39 41 18 +4 14 26 42 40 +4 42 43 41 40 +4 27 18 41 43 +4 26 3 44 42 +4 3 7 45 44 +4 44 45 43 42 +4 7 27 43 45 +4 23 10 0 16 +4 13 25 20 4 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/data/torus_quad.off b/Surface_mesh_topology/test/Surface_mesh_topology/data/torus_quad.off new file mode 100644 index 00000000000..66d29e35817 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/data/torus_quad.off @@ -0,0 +1,52 @@ +OFF +25 25 50 +0.107677 -1.54743e-018 -0.331395 +-0.281902 -1.54743e-018 -0.204814 +-0.281902 -1.54743e-018 0.204814 +0.107676 -1.54743e-018 0.331395 +0.34845 -1.54743e-018 8.92032e-008 +0.18208 0.331395 -0.560383 +-0.476691 0.331395 -0.346336 +-0.476691 0.331395 0.346336 +0.18208 0.331395 0.560384 +0.589223 0.331395 8.92032e-008 +0.302466 0.204814 -0.930895 +-0.791866 0.204814 -0.575325 +-0.791866 0.204814 0.575324 +0.302466 0.204814 0.930895 +0.978801 0.204814 8.92032e-008 +0.302466 -0.204814 -0.930895 +-0.791866 -0.204814 -0.575325 +-0.791866 -0.204814 0.575324 +0.302466 -0.204814 0.930895 +0.978801 -0.204814 8.92032e-008 +0.18208 -0.331395 -0.560383 +-0.476691 -0.331395 -0.346336 +-0.476691 -0.331395 0.346336 +0.18208 -0.331395 0.560384 +0.589222 -0.331395 8.92032e-008 +4 5 6 1 0 +4 6 7 2 1 +4 7 8 3 2 +4 8 9 4 3 +4 9 5 0 4 +4 10 11 6 5 +4 11 12 7 6 +4 12 13 8 7 +4 13 14 9 8 +4 14 10 5 9 +4 15 16 11 10 +4 16 17 12 11 +4 17 18 13 12 +4 18 19 14 13 +4 19 15 10 14 +4 20 21 16 15 +4 21 22 17 16 +4 22 23 18 17 +4 23 24 19 18 +4 24 20 15 19 +4 0 1 21 20 +4 1 2 22 21 +4 2 3 23 22 +4 3 4 24 23 +4 4 0 20 24 diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/fundamental_group_of_the_circle.cpp b/Surface_mesh_topology/test/Surface_mesh_topology/fundamental_group_of_the_circle.cpp new file mode 100644 index 00000000000..54d9ff78634 --- /dev/null +++ b/Surface_mesh_topology/test/Surface_mesh_topology/fundamental_group_of_the_circle.cpp @@ -0,0 +1,179 @@ +/* +FUNDAMENTAL GROUP OF THE CIRCLE + +We know that the fundamental group of the torus is Z +Hence we can choose a path on a circle by choosing an integer + +The test generates all pairs of integer (i, j) between -10 and 10 and the associated paths pi and pj with two different basepoints +Then it verify that +-> pi is contractible iff i==0 +-> pj is contractible iff j==0 +-> pi is homotopic to himself +-> pj is homotopic to himself +-> pi and pj are homotopic iff pj and pi are +-> pi and pj are homotopic iff i==j +*/ +#include +#include +#include + +// If you want to use a viewer, you can use qglviewer. +#ifdef CGAL_USE_BASIC_VIEWER +#include +#endif + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_positive_loop_88(Path_on_surface& p, unsigned int n) +{ + p.clear(); + p.push_back_by_index(88, false, false); + if (n==0) + { + p.push_back_by_index(88, true, true); + CGAL_assertion(p.is_closed()); + } + else + { + p.extend_straight_positive(10*n-1); + CGAL_assertion(p.is_closed()); + } +} +/////////////////////////////////////////////////////////////////////////////// +void create_negative_loop_88(Path_on_surface& p, unsigned int n) +{ + p.clear(); + p.push_back_by_index(88, true, false); + if (n==0) + { + p.push_back_by_index(88, false, true); + CGAL_assertion(p.is_closed()); + } + else + { + p.extend_straight_positive(10*n-1); + CGAL_assertion(p.is_closed()); + } +} +/////////////////////////////////////////////////////////////////////////////// +void create_positive_loop_24(Path_on_surface& p, unsigned int n) +{ + p.clear(); + p.push_back_by_index(24, false, false); + if (n==0) + { + p.push_back_by_index(24, true, true); + CGAL_assertion(p.is_closed()); + } + else + { + p.extend_straight_positive((10*n)-1); + +#ifdef CGAL_USE_BASIC_VIEWER + /* std::vector > v; + v.push_back(p); + CGAL::draw(p.get_mesh(), v, "Title"); */ +#endif // CGAL_USE_BASIC_VIEWER + + CGAL_assertion(p.is_closed()); + } +} +/////////////////////////////////////////////////////////////////////////////// +void create_negative_loop_24(Path_on_surface& p, unsigned int n) +{ + p.clear(); + p.push_back_by_index(24, true, false); + if (n==0) + { + p.push_back_by_index(24, false, true); + CGAL_assertion(p.is_closed()); + } + else + { + p.extend_straight_negative((10*n)-1); + CGAL_assertion(p.is_closed()); + } +} +/////////////////////////////////////////////////////////////////////////////// +void create_loop_88(Path_on_surface& p, int n) +{ + if (n>0) + { create_positive_loop_88(p, n); } + else + { create_negative_loop_88(p, -n); } +} +/////////////////////////////////////////////////////////////////////////////// +void create_loop_24(Path_on_surface& p, int n) +{ + if (n>0) + { create_positive_loop_24(p, n); } + else + { create_negative_loop_24(p, -n); } +} +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/cylinder-with-two-borders.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/cylinder-with-two-borders.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface p1(sm), p2(sm); + bool c1, c2, h11, h12, h21, h22; + bool test_valid=true; + + for (int i=-10; i<=10; ++i) + { + for (int j=-10; j<=10; ++j) + { + create_loop_88(p1, i); + create_loop_24(p2, j); + c1=cst.is_contractible(p1); + c2=cst.is_contractible(p2); + h11=cst.are_freely_homotopic(p1, p1); + h12=cst.are_freely_homotopic(p1, p2); + h21=cst.are_freely_homotopic(p2, p1); + h22=cst.are_freely_homotopic(p2, p2); + + if (i==0 && !c1) + { std::cout<<"FAILURE : a path associated with int "< pij is contractible iff i==0 and j==0 +-> pkl is contractible iff k==0 and l==0 +-> pik is homotopic to himself +-> pkl is homotopic to himself +-> pij and pkl are homotopic iff pkl and pij are +-> pij and pkl are homotopic iff i==j and k==l +*/ +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_positive_i(Path_on_surface& pij, int i) +{// pre i>0 + pij.push_back_by_index(23); + pij.extend_straight_positive(5*i-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_positive_j(Path_on_surface& pij, int j) +{// pre j>0 + pij.push_back_by_index(29); + pij.extend_straight_positive(5*j-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_positive_k(Path_on_surface& pkl, int k) +{// pre i>0 + pkl.push_back_by_index(33); + pkl.extend_straight_positive(5*k-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_positive_l(Path_on_surface& pkl, int l) +{// pre j>0 + pkl.push_back_by_index(8); + pkl.extend_straight_positive(5*l-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_negative_i(Path_on_surface& pij, int i) +{// pre i<0 + pij.push_back_by_index(98); + pij.extend_straight_positive((-5)*i-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_negative_j(Path_on_surface& pij, int j) +{// pre j<0 + pij.push_back_by_index(24); + pij.extend_straight_positive((-5)*j-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_negative_k(Path_on_surface& pkl, int k) +{// pre i<0 + pkl.push_back_by_index(2); + pkl.extend_straight_positive((-5)*k-1); +} +/////////////////////////////////////////////////////////////////////////////// +void extend_loop_negative_l(Path_on_surface& pkl, int l) +{// pre j<0 + pkl.push_back_by_index(1); + pkl.extend_straight_positive((-5)*l-1); +} +/////////////////////////////////////////////////////////////////////////////// +void create_loop_ij(Path_on_surface& pij, int i, int j) +{ + pij.clear(); + + if (i>0) + { extend_loop_positive_i(pij, i); } + else if (i<0) + { extend_loop_negative_i(pij, i); } + + if (j>0) + { extend_loop_positive_j(pij, j); } + else if (j<0) + { extend_loop_negative_j(pij, j); } +} +/////////////////////////////////////////////////////////////////////////////// +void create_loop_kl(Path_on_surface& pkl, int k, int l) +{ + pkl.clear(); + + if (k>0) + { extend_loop_positive_k(pkl, k); } + else if (k<0) + { extend_loop_negative_k(pkl, k); } + + if (l>0) + { extend_loop_positive_l(pkl, l); } + else if (l<0) + { extend_loop_negative_l(pkl, l); } +} +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/torus_quad.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/torus_quad.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface pij(sm), pkl(sm); + bool cij, ckl, hij_ij, hij_kl, hkl_ij, hkl_kl; + bool test_valid=true; +/* +#ifdef CGAL_USE_BASIC_VIEWER + std::vector > paths={pij, pkl}; + CGAL::draw(sm, paths); // Enable only if CGAL was compiled with Qt5 +#endif // CGAL_USE_BASIC_VIEWER +*/ + for (int i=-4; i<=4; ++i) + { + for (int j=-4; j<=4; ++j) + { + for (int k=-4; k<=4; ++k) + { + for (int l=-4; l<=4; ++l) + { + create_loop_ij(pij, i, j); + create_loop_kl(pkl, k, l); + cij=cst.is_contractible(pij); + ckl=cst.is_contractible(pkl); + hij_ij=cst.are_freely_homotopic(pij, pij); + hij_kl=cst.are_freely_homotopic(pij, pkl); + hkl_ij=cst.are_freely_homotopic(pkl, pij); + hkl_kl=cst.are_freely_homotopic(pkl, pkl); + + if (i==0 && j==0 && !cij) + { std::cout<<"FAILURE : a path associated with ints "< +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(24); // Its starting dart + for (int i=0; i<9; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index(12); // Its starting dart + for (int i=0; i<19; ++i) + { p.extend_negative_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_index(2); // Its starting dart + p.extend_positive_turn(1); + p.extend_positive_turn(2); + p.extend_positive_turn(2); + p.extend_positive_turn(2); + p.extend_positive_turn(1); + p.extend_positive_turn(1); + p.extend_positive_turn(2); + p.extend_positive_turn(2); + p.extend_positive_turn(2); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/cylinder-with-two-borders.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/cylinder-with-two-borders.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface p1(sm), p2(sm), p3(sm); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + bool res=true; + + if (cst.is_contractible(p1)) + { + std::cout<<"ERROR homotopy_big_cylinder test1: " + <<"Path p1 should not be contractible" + < +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(38); // Its starting dart + for (int i=0; i<18; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index(50); // Its starting dart + for (int i=0; i<18; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_index(51); // Its starting dart + for (int i=0; i<18; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/2torus-3borders.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/2torus-3borders.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface p1(sm), p2(sm), p3(sm); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + bool res=true; + + if(cst.is_contractible(p1)) + { + std::cout<<"ERROR homotopy_double_torus_with_holes test1: " + <<"Path p1 should not be contractible" + < +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(15); // Its starting dart + for (int i=0; i<10; ++i) + { p.extend_positive_turn(2); } // Extend the path + p.extend_positive_turn(1); + p.extend_positive_turn(2); + p.extend_positive_turn(1); + for (int i=0; i<10; ++i) + { p.extend_positive_turn(2); } // Extend the path + p.extend_positive_turn(1); + p.extend_positive_turn(2); +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index(136); // Its starting dart + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_3(Path_on_surface& p) +{ + p.push_back_by_index(15); // Its starting dart + p.extend_positive_turn(2); + p.extend_positive_turn(3); + p.extend_positive_turn(2); + p.extend_positive_turn(3); + p.extend_positive_turn(2); + p.extend_positive_turn(3); + p.extend_positive_turn(2); +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/rond_point_saucisse.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/rond_point_saucisse.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface p1(sm), p2(sm), p3(sm); + create_path_1(p1); + create_path_2(p2); + create_path_3(p3); + + bool res=true; + + if (!cst.is_contractible(p1)) + { + std::cout<<"ERROR homotopy_rond_point_saucisse test1: " + <<"Path p1 should be contractible" + < +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void create_path_1(Path_on_surface& p) +{ + p.push_back_by_index(2); // Its starting dart + for (int i=0; i<2; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +void create_path_2(Path_on_surface& p) +{ + p.push_back_by_index(10); // Its starting dart + for (int i=0; i<5; ++i) + { p.extend_positive_turn(2); } // Extend the path +} + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + SM sm; + std::ifstream in("data/cylinder-2-borders-12darts.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/cylinder-2-borders-12darts.off"<>sm; + + Curves_on_surface_topology cst(sm); + Path_on_surface p1(sm), p2(sm), p3(sm); + create_path_1(p1); + create_path_2(p2); + + bool res=true; + + if (cst.is_contractible(p1)) + { + std::cout<<"ERROR homotopy_small_cylinder test1: " + <<"Path p1 should not be contractible" + < +#include +#include +#include + +#include + +/////////////////////////////////////////////////////////////////////////////// +typedef CGAL::Combinatorial_map<2> CMap; +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3; +using namespace CGAL::Surface_mesh_topology; +/////////////////////////////////////////////////////////////////////////////// +bool basic_tests() +{ + bool res=true; + CMap cmap; + cmap.make_combinatorial_hexahedron(); + + Path_on_surface p1(cmap); + p1.initialize_random_starting_dart(); + p1.extend_straight_positive(3); + if (!p1.is_valid() || p1.length()!=4 || !p1.is_closed() || !p1.is_simple()) + { + std::cerr<<"path_tests ERROR: !p1.is_valid() || p1.length()!=4 || " + <<"!p1.is_closed() || !p1.is_simple()."< p2(p1); + if (p1!=p2 || !p1.are_paths_equals(p2)) + { + std::cerr<<"path_tests ERROR: p1!=p2 || !p1.are_paths_equals(p2)."< p3(cmap); + p3.push_back(p1.front(), !p1.front_flip()); + p3.extend_straight_negative(3); + if (p3.length()!=4 || !p3.is_closed()) + { + std::cerr<<"path_tests ERROR: p3.length()!=4 || !p3.is_closed()." + < p4(p3); + p4.reverse(); // Here p3==p4 because the path is symetric (it does a round trip) + if (p3!=p4 || !p3.are_paths_equals(p4)) + { + std::cerr<<"path_tests ERROR: p3!=p4 || !p3.are_paths_equals(p4)."< p5(cmap); + p5.push_back(p1.front(), !p1.front_flip()); + for (int i=0; i<3; ++i) + { p5.extend_positive_turn(); } + p5.reverse(); + if (p1!=p5 || !p1.are_paths_equals(p5)) + { + std::cerr<<"path_tests ERROR: p1!=p5 || !p1.are_paths_equals(p5)."< p6(cmap); + p6.push_back(p1.front(), p1.front_flip()); + p6.extend_straight_positive(2); + p6.extend_positive_turn(1); + p6.extend_straight_positive(2); + if (!p6.is_valid() || !p6.is_simple() || p1!=p6) + { + std::cerr<<"path_tests ERROR: !p6.is_simple() || !p6.is_simple() || p1!=p6."< lmq(p6.get_map()); + internal::Path_on_surface_with_rle > p7(lmq, p6); + if (!p7.is_valid() || p7.size_of_list()!=2) + { + std::cerr<<"path_tests ERROR: !p7.is_valid() || size_of_list()!=2."< p8(p7); + if (!p8.is_valid() || p6!=p8 || !p6.are_paths_equals(p8)) + { + std::cerr<<"path_tests ERROR: !p8.is_valid() || p6!=p8 || !p6.are_paths_equals(p8)."< p9(cmap); + p9.push_back(p1.front(), p1.front_flip()); + if (!p9.can_be_pushed(cmap.beta<1,2,1>(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back()))) // 1st + { + std::cerr<<"path_tests ERROR: 1st !p9.can_be_pushed."<(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back())); } + + if (!p9.can_be_pushed(cmap.beta<1,2,1>(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back()))) // 2nd + { + std::cerr<<"path_tests ERROR: 2nd !p9.can_be_pushed."<(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back())); } + + if (!p9.can_be_pushed(cmap.beta<1>(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back()))) // 3rd + { + std::cerr<<"path_tests ERROR: 3rd !p9.can_be_pushed."<(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back())); } + + if (!p9.can_be_pushed(cmap.beta<1,2,1>(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back()))) // 4th + { + std::cerr<<"path_tests ERROR: 4th !p9.can_be_pushed."<(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back())); } + + if (!p9.can_be_pushed(cmap.beta<1,2,1>(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back()))) // 5th + { + std::cerr<<"path_tests ERROR: 5th !p9.can_be_pushed."<(p9.back_flip()?cmap.template beta<2>(p9.back()):p9.back())); } + + if (!p9.is_valid() || p6!=p9 || !p6.are_paths_equals(p9)) + { + std::cerr<<"path_tests ERROR: !p9.is_valid() || p6!=p9 || !p6.are_paths_equals(p9)."< +#include +#include +#include +#include +#include +#include + +#include "Creation_of_test_cases_for_paths.h" + +// If you want to use a viewer, you can use qglviewer. +#ifdef CGAL_USE_BASIC_VIEWER +#include +#endif + +struct MyItems +{ + template + struct Dart_wrapper + { +#ifdef CGAL_PWRLE_TURN_V3 + typedef std::size_t Dart_info; +#endif // CGAL_PWRLE_TURN_V3 + typedef CGAL::Cell_attribute_with_point Vertex_attrib; + typedef CGAL::cpp11::tuple Attributes; + }; +}; + +typedef CGAL::Linear_cell_complex_traits +<3, CGAL::Exact_predicates_inexact_constructions_kernel> MyTraits; + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2, 3, + MyTraits, MyItems> LCC_3_cmap; + +#define NB_TESTS 21 // 0 ... 20 +static unsigned int nbtests=0; + +static const unsigned int ALL_TESTS=std::numeric_limits::max(); + +enum Transformation // enum for the type of transformations +{ + REDUCTION, + PUSH, + FULL_SIMPLIFICATION +}; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +void transform_path(Path_on_surface& path, Transformation t, + bool use_only_positive, + bool use_only_negative, + bool +#ifdef CGAL_USE_BASIC_VIEWER + draw +#endif + =false, + std::size_t repeat=0) // If 0, repeat as long as there is one modifcation; + // otherwise repeat the given number of times +{ +#ifdef CGAL_USE_BASIC_VIEWER + std::vector > v; + if (draw) + { + v.push_back(path); + // CGAL::draw(path.get_map(), v); + } +#endif // CGAL_USE_BASIC_VIEWER + + internal::Light_MQ lmq(path.get_map()); + Path_on_surface prepp(path.get_map()); + Path_on_surface prevp=path; + internal::Path_on_surface_with_rle >curp(lmq); + std::size_t nb=0; + bool modified=false; + do + { + curp=internal::Path_on_surface_with_rle > + (lmq, prevp, use_only_positive, use_only_negative); + + modified=false; + /* curp->display_negative_turns(); + std::cout<<" "; curp->display_positive_turns(); + std::cout<<" -> "<(curp); +#ifdef CGAL_USE_BASIC_VIEWER + if (draw) { v.push_back(prevp); } +#endif // CGAL_USE_BASIC_VIEWER + } + + // if (draw /* && nbtest==1*/) + // CGAL::draw(path.get_map(), v); + + ++nb; + } + while((repeat==0 && modified) || (nb& path, Transformation t, + std::size_t repeat, + const char* msg, const char* expected_result, + bool draw, unsigned int testtorun, + bool use_only_positive, + bool use_only_negative) +{ + CGAL_USE(msg); + bool res=true; + + if (testtorun==ALL_TESTS || nbtests==testtorun) + { +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"[Test "< "< path(lcc); + + generate_one_positive_spur(path); // Test 0 + if (!unit_test(path, REDUCTION, 1, "Positive spur (2^6 1 0 2^4)", + "2 2 2 2 2 2 3 2 2 2", draw, testtorun, true, false)) + { res=false; } + + generate_one_negative_spur(path); // Test 1 + if (!unit_test(path, REDUCTION, 1, "Negative spur (-2^6 -1 0 -2^4)", + "-2 -2 -2 -2 -2 -2 -3 -2 -2 -2", draw, testtorun, false, true)) + { res=false; } + + generate_cyclic_spur(path); // Test 2 + if (!unit_test(path, REDUCTION, 1, "Cyclic spur (0 0)", + "", draw, testtorun, false, false)) + { res=false; } + + generate_one_positive_bracket(path); // Test 3 + if (!unit_test(path, REDUCTION, 1, "Positive bracket (2^3 3 1 2^6 1 3 2^2)", + "2 2 2 2 -2 -2 -2 -2 -2 -2 2 2 2", draw, testtorun, true, false)) + { res=false; } + + generate_one_negative_bracket(path); // Test 4 + if (!unit_test(path, REDUCTION, 1, "Negative bracket (-2^3 -1 -2^6 -1 -2^2)", + "-2 -2 3 2 2 2 2 2 2 3 -2 -2", draw, testtorun, false, true)) + { res=false; } + + lcc.clear(); + if (!CGAL::load_off(lcc, "./data/spiral-squared.off")) + { + std::cout<<"PROBLEM reading file ./data/spiral-squared.off"< path(lcc); + + generate_one_l_shape(path); // Test 9 + if (!unit_test(path, PUSH, 1, "L-shape (-2^2 -3 -2^8 -1 -2^5 -3 -2^3)", + "-2 -2 2 1 2 2 2 2 2 2 2 3 2 2 2 2 1 2 -2 -2 -2", + draw, testtorun, false, true)) + { res=false; } + + generate_l_shape_case2(path); // Test 10 + if (!unit_test(path, PUSH, 1, "L-shape (-2^2 -3 -1 -2^5 -3 -2^3)", + "-2 -2 2 2 2 2 2 2 1 2 2 2 2", draw, testtorun, false, true)) + { res=false; } + + generate_l_shape_case3(path); // Test 11 + if (!unit_test(path, PUSH, 1, "L-shape (-2^2 -3 -2^5 -1 -3 -2^3)", + "-2 -2 2 1 2 2 2 2 2 2 -2 -2 -2", draw, testtorun, false, true)) + { res=false; } + + lcc.clear(); + if (!CGAL::load_off(lcc, "./data/case4-right-shift-squared.off")) + { + std::cout<<"PROBLEM reading file ./data/case4-right-shift-squared.off" + < path(lcc); + bool res=true; + + generate_path(path, // Test 17 + {-8,8,6,0,-10,10,-7,0,2,2,-7,10,-2,3,-9,2,2,8,-6,5,0, + 8,3,2,2,10,-10,7,9,4,-10,0,10,6,-5,8,-5,6,3,6}, // pair of numbers: (turn, length of flat) + {3,0,-6,4,-8,6,10,1,-6,7,-5,0,5,1,2,5,-10,10,10,6,-7,6 + ,1,10,8,5,7,4,2,7,10,7,10,0,-8,6,7,0,1,0,-2,4,-4,9,4,9,0,18}); + if (!unit_test(path, FULL_SIMPLIFICATION, 0, "first random path on cube", + "2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2", draw, testtorun, true, false)) + { res=false; } + + generate_path(path, {1,3,0,6,9,4,1,10,-3,3}, // Test 18 + {-3,4,-10,4,-3,0,-6,10,-10,4}); + if (!unit_test(path, FULL_SIMPLIFICATION, 0, "second random path on cube", + "1 2 2 2 2", draw, testtorun, true, false)) + { res=false; } + + generate_path(path, {10,6,-4,5,-5,8,-2,2,4,9,5,3,8,4,-7,7}, // Test 19 + {6,0,-7,7,8,9,3,0,-9,1,-8,2,-3,1,4,8}); + if (!unit_test(path, FULL_SIMPLIFICATION, 0, "third random path on cube", + "2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2", + draw, testtorun, true, false)) + { res=false; } + + generate_path(path, // Test 20 + {-2,10,6,5,8,1,-2,10,3,8,-7,7,5,10,1,5,9,0,-5,2,-2,4,7,8,-9,9, + -9,0,10,3,1,10,-4,8,5,4,-3,5,7,5,-4,7,-4,10,-8,8,2,0,2,1}, + {6,0,0,9,-3,7,-10,10,6,7,1,9,10,7,2,6,1,0,-6,8,-8,8,9,9,-8,2 + ,-2,2,4,8,-2,6,3,10,-2,8,1,6,-7,5,7,6,5,5,6,7,-2,6,1,4}); + if (!unit_test(path, FULL_SIMPLIFICATION, 0, "fourth random path on cube", + "1 2 2 2 2 2 2", draw, testtorun, true, false)) + { res=false; } + + return res; +} +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +[[noreturn]] void usage(int /*argc*/, char** argv) +{ + std::cout<<"usage: "<(std::stoi(std::string(argv[++i]))); + if (testN>=NB_TESTS) + { error_command_line(argc, argv, "Error: invalid value for -test option."); } + } + else if (arg=="-h" || arg=="--help" || arg=="-?") + { usage(argc, argv); } + else if (arg[0]=='-') + { std::cout<<"Unknown option "< +#include +#include +#include +#include +#include +#include + +#include "Creation_of_test_cases_for_paths.h" + +/* If you want to use a viewer, you can use qglviewer. */ +#ifdef CGAL_USE_BASIC_VIEWER +#include +#endif + +struct MyItems +{ + template + struct Dart_wrapper + { +#ifdef CGAL_PWRLE_TURN_V3 + typedef std::size_t Dart_info; +#endif // CGAL_PWRLE_TURN_V3 + typedef CGAL::Cell_attribute_with_point Vertex_attrib; + typedef CGAL::cpp11::tuple Attributes; + }; +}; + +typedef CGAL::Linear_cell_complex_traits +<3, CGAL::Exact_predicates_inexact_constructions_kernel> MyTraits; + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<2, 3, + MyTraits, MyItems> LCC_3_cmap; + +#define NB_TESTS 3 // 0 ... 2 +static int nbtests=0; +static int starting_seed; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +bool unit_test_canonize(Curves_on_surface_topology& cst, + std::vector >& paths, + const char* msg, + bool +#ifdef CGAL_USE_BASIC_VIEWER + draw +#endif + , int testtorun) +{ + CGAL_USE(msg); + bool res=true; + + if (testtorun==-1 || nbtests==testtorun) + { +#ifdef CGAL_TRACE_PATH_TESTS + std::cout<<"[Test "<0 && !cst.are_freely_homotopic(paths[0], paths[i])) + { + std::cout<<"[Test "< > paths; + + // Test 0 (double torus, three G1 cycles) + { + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "./data/double-torus.off")) + { + std::cout<<"PROBLEM reading file ./data/double-torus.off"< cst(lcc); + + for (unsigned int i=0; i<3; ++i) + { + Path_on_surface p(lcc); + CGAL::generate_g1_double_torus(p, i); + paths.push_back(p); + } + + if (!unit_test_canonize(cst, paths, + "canonize paths on double torus gen1", + draw, testtorun)) + { res=false; } + } + + // Test 1 (double torus, one random path, deformed randomly two times) + { + paths.clear(); + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "./data/double-torus.off")) // "./data/double-torus-smooth.off")) + { + std::cout<<"PROBLEM reading file ./data/double-torus.off"< cst(lcc); + + if (testtorun==-1 || nbtests==testtorun) + { + CGAL::Random random(static_cast(starting_seed+nbtests)); + Path_on_surface p(lcc); + + internal::generate_random_closed_path + (p, static_cast(random.get_int(5, 20)), random); // random path, length between 5 and 20 + paths.push_back(p); + + p.update_path_randomly(random); + paths.push_back(p); + + p.update_path_randomly(random); + paths.push_back(p); + } + + if (!unit_test_canonize(cst, paths, + "random canonize paths on double torus", + draw, testtorun)) + { res=false; } + } + + // Test 2 (3torus-smooth, one random path, deformed randomly two times) + { + paths.clear(); + LCC_3_cmap lcc; + if (!CGAL::load_off(lcc, "./data/3torus-smooth.off")) // 3torus.off + { + std::cout<<"PROBLEM reading file ./data/3torus-smooth.off"< cst(lcc); + + if (testtorun==-1 || nbtests==testtorun) + { + CGAL::Random random(static_cast(starting_seed+nbtests)); + Path_on_surface p(lcc); + + internal::generate_random_closed_path + (p, static_cast(random.get_int(5, 200)), random); // random path, length between 5 and 200 + paths.push_back(p); + + p.update_path_randomly(random); + paths.push_back(p); + + p.update_path_randomly(random); + paths.push_back(p); + + if (!unit_test_canonize(cst, paths, + "random canonize paths on double torus", + draw, testtorun)) + { res=false; } + } + } + + return res; +} +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +[[noreturn]] void usage(int /*argc*/, char** argv) +{ + std::cout<<"usage: "<=NB_TESTS) + { error_command_line(argc, argv, "Error: invalid value for -test option."); } + } + else if (arg=="-seed") + { + if (i==argc-1) + { error_command_line(argc, argv, "Error: no number after -seed option."); } + starting_seed=std::stoi(std::string(argv[++i])); + } + else if (arg=="-h" || arg=="--help" || arg=="-?") + { usage(argc, argv); } + else if (arg[0]=='-') + { std::cout<<"Unknown option "< +#include +#include +#include +#include +#include + +typedef CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map<> PS; +typedef typename PS::Dart_handle Dart_handle; + +using namespace CGAL::Surface_mesh_topology; + +static unsigned int starting_seed; + +/////////////////////////////////////////////////////////////////////////////// +bool test_two_random_paths(const PS& ps, + const Curves_on_surface_topology& cst, + unsigned int nbtests, + unsigned int& seed, + int lmin=5, + int lmax=20) +{ + CGAL_assertion(lmin>0 && lmin p1(ps), p2(ps); + internal::generate_random_closed_path + (p1, static_cast(random.get_int(lmin, lmax)), random); + + p2=p1; + p2.update_path_randomly(100, random); + + // std::cout<<"("<& cst, + unsigned int& seed, + int lmin=5, + int lmax=20) +{ + static std::size_t nbtest=0; + std::cout<<"***** Test "<(std::time(nullptr)); + std::string arg; + for (int i=1; i(std::stoi(std::string(argv[++i]))); + // initialize the random generator with the given seed + } + else if (arg=="-h" || arg=="--help" || arg=="-?") + { usage(argc, argv); } + else if (arg[0]=='-') + { std::cout<<"Unknown option "< cst(ps); + generate_random_polygonal_schema(ps, 1000, starting_seed++, 30, closed, percent); // Closed, no perforated faces + res&=run_n_random_paths_tests(ps, 10, cst, starting_seed); + } + switch(i) + { + case 0: closed=true; percent=15; break; + case 1: closed=false; percent=0; break; + case 2: closed=false; percent=15; break; + } + } + + if (res) + { + std::cout<<"test_homotopy_with_polygonal_schema ALL TESTS OK."< +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SM; + +using namespace CGAL::Surface_mesh_topology; + +/////////////////////////////////////////////////////////////////////////////// +bool test_constructions() +{ + bool res=true; + SM sm; + std::ifstream in("data/cylinder-with-two-borders.off"); + if (!in.is_open()) + { + std::cout<<"ERROR reading file data/cylinder-with-two-borders.off"<>sm; + + Path_on_surface p1(sm), p2(sm); + + p1.push_back_by_index(24); + p1.extend_positive_turn(1); + p1.extend_negative_turn(1); + p1.extend_straight_positive(); + p1.extend_straight_negative(); + p1.push_back_by_index(93, true); + p1.extend_positive_turn(3); + p1.extend_positive_turn(3); + p1.extend_negative_turn(1); + p1.extend_straight_positive(5); + p1.extend_straight_negative(5); + if (!p1.is_valid()) + { std::cout<<"ERROR: Path p1 NOT is valid, test failed"<>sm; + + Path_on_surface p1(sm), p2(sm), p3(sm); + CGAL::Random random; + + p1.generate_random_path(100, random, true); + if (!p1.is_valid()) + { std::cout<<"ERROR: Path p1 is NOT valid, test failed."< #include #include -#include +#include #include #include #include @@ -708,7 +708,7 @@ void Volume::display_marchin_cube() #ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE if(m_surface_mc.empty()) { - QTime total_time; + QElapsedTimer total_time; total_time.start(); values_list->save_values(fileinfo.absoluteFilePath()); @@ -824,7 +824,7 @@ void Volume::display_surface_mesher_result() m_view_surface) // Or it is computed and displayed, and one want // to recompute it. { - QTime total_time; + QElapsedTimer total_time; total_time.start(); values_list->save_values(fileinfo.absoluteFilePath()); diff --git a/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h b/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h index 73957550317..ad8cc16789a 100644 --- a/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h +++ b/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h @@ -280,7 +280,7 @@ public: /*! Run the sweep-line alogrithm on a range of x-monotone curves, a range * of action event points (if a curve passed through an action point, it will * be split) and a range of query points (if a curve passed through a - * query point,it will not be splitted). + * query point,it will not be split). * \param curves_begin An iterator for the first x-monotone curve in the * range. * \param curves_end A past-the-end iterator for this range. diff --git a/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h b/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h index 4409f5f7243..1022d56b585 100644 --- a/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h +++ b/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h @@ -14,6 +14,10 @@ implemented using `Compact_container`. The class may offer some flexibility for the choice of container in the future, in the form of additional template parameters. +\tparam VertexBase must be a model of `TriangulationDSVertexBase_2`. The default is `Triangulation_ds_vertex_base_2`. + +\tparam FaceBase must be a model of `TriangulationDSFaceBase_2`. The default is `Triangulation_ds_face_base_2`. + \cgalModels `TriangulationDataStructure_2` \cgalHeading{Modifiers} @@ -33,7 +37,7 @@ guarantee the combinatorial validity of the resulting data structure. \image html tds-insert_degree_2.png "Insertion and removal of degree 2 vertices. " \image latex tds-insert_degree_2.png "Insertion and removal of degree 2 vertices. " */ -template< typename Vb, typename Fb > +template< typename VertexBase, typename FaceBase > class Triangulation_data_structure_2 { public: @@ -42,13 +46,13 @@ public: /// @{ - typedef Triangulation_data_structure_2 Tds; + typedef Triangulation_data_structure_2 Tds; /// The vertex type. - typedef typename Vb::template Rebind_TDS::Other Vertex; + typedef typename VertexBase::template Rebind_TDS::Other Vertex; /// The face type. - typedef typename Fb::template Rebind_TDS::Other Face; + typedef typename FaceBase::template Rebind_TDS::Other Face; /// @} diff --git a/TDS_2/doc/TDS_2/PackageDescription.txt b/TDS_2/doc/TDS_2/PackageDescription.txt index 95e6f385c9f..54faad3f455 100644 --- a/TDS_2/doc/TDS_2/PackageDescription.txt +++ b/TDS_2/doc/TDS_2/PackageDescription.txt @@ -58,7 +58,7 @@ These refining concepts and their models are described in Chapter - `TriangulationDSVertexBase_2` \cgalCRPSection{Classes} -- `CGAL::Triangulation_data_structure_2` +- `CGAL::Triangulation_data_structure_2` - `CGAL::Triangulation_ds_face_base_2` - `CGAL::Triangulation_ds_vertex_base_2` diff --git a/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h b/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h index 742ea25c03c..49bcbed73b4 100644 --- a/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h +++ b/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h @@ -15,21 +15,17 @@ see below). The class may offer some flexibility for the choice of container in the future, in the form of additional template parameters. -\cgalHeading{Parameters} +\tparam VertexBase must be a model of `TriangulationDSVertexBase_3`. The default is `Triangulation_ds_vertex_base_3`. -It is parameterized by base classes for vertices and cells which have to match -the requirements for the concepts `TriangulationDSCellBase_3` and -`TriangulationDSVertexBase_3` respectively. +\tparam CellBase must be a model of `TriangulationDSCellBase_3`. The default is `Triangulation_ds_cell_base_3`. -They have the default values `Triangulation_ds_vertex_base_3` and -`Triangulation_ds_cell_base_3` respectively. -The `Concurrency_tag` parameter allows to enable the use of a concurrent +\tparam ConcurrencyTag enables the use of a concurrent container to store vertices and cells. It can be `Sequential_tag` (use of a `Compact_container` to store vertices and cells) or `Parallel_tag` (use of a `Concurrent_compact_container`). If it is `Parallel_tag`, the following functions can be called concurrently: -`create_vertex`, `create_cell`, `delete_vertex`, `delete_cell`. +`create_vertex()`, `create_cell()`, `delete_vertex()`, and `delete_cell()`. `Sequential_tag` is the default value. \cgalModels `TriangulationDataStructure_3` @@ -45,9 +41,9 @@ specified by the concept. \sa `CGAL::Triangulation_vertex_base_with_info_3` \sa `CGAL::Triangulation_cell_base_with_info_3` */ -template< typename TriangulationDSVertexBase_3, - typename TriangulationDSCellBase_3, - typename Concurrency_tag > +template< typename VertexBase, + typename CellBase, + typename ConcurrencyTag > class Triangulation_data_structure_3 : public CGAL::Triangulation_utils_3 { public: @@ -55,13 +51,13 @@ public: /// @{ /*! -Vertex container type. If Concurrency_tag is Parallel_tag, a +Vertex container type. If `ConcurrencyTag` is `Parallel_tag`, a `Concurrent_compact_container` is used instead of a `Compact_container`. */ typedef Compact_container Vertex_range; /*! -Cell container type. If Concurrency_tag is Parallel_tag, a +Cell container type. If `ConcurrencyTag` is `Parallel_tag`, a `Concurrent_compact_container` is used instead of a `Compact_container`. */ typedef Compact_container Cell_range; diff --git a/TDS_3/doc/TDS_3/PackageDescription.txt b/TDS_3/doc/TDS_3/PackageDescription.txt index 4e043ee26a6..9bde710fa0d 100644 --- a/TDS_3/doc/TDS_3/PackageDescription.txt +++ b/TDS_3/doc/TDS_3/PackageDescription.txt @@ -56,7 +56,7 @@ Section \ref TDS3secintro.) \cgalCRPSection{Classes} -- `CGAL::Triangulation_data_structure_3` is a model for the concept of the 3D-triangulation data structure `TriangulationDataStructure_3`. It is templated by base classes for vertices and cells. +- `CGAL::Triangulation_data_structure_3` is a model for the concept of the 3D-triangulation data structure `TriangulationDataStructure_3`. It is templated by base classes for vertices and cells. \cgal provides base vertex classes and base cell classes: diff --git a/TDS_3/doc/TDS_3/TriangulationDS_3.txt b/TDS_3/doc/TDS_3/TriangulationDS_3.txt index 0c3ab60bfab..557b45a4a24 100644 --- a/TDS_3/doc/TDS_3/TriangulationDS_3.txt +++ b/TDS_3/doc/TDS_3/TriangulationDS_3.txt @@ -304,10 +304,10 @@ typedef Triangulation_vertex_base_3 Other; \subsection tds3parallel Parallel Operations The third template parameter of `Triangulation_data_structure_3` is -`Concurrency_tag`. It enables the use of a concurrent +`ConcurrencyTag`. It enables the use of a concurrent container (`Concurrent_compact_container`) to store vertices and cells. -If it is `Parallel_tag`, then `create_vertex`, `create_cell`, `delete_vertex` -and `delete_cell` can be called concurrently. +If it is `Parallel_tag`, then `create_vertex()`, `create_cell()`, `delete_vertex()` +and `delete_cell()` can be called concurrently. \section TDS3secexamples Examples diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 63217b459d4..4805a68e33e 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -299,7 +299,7 @@ template void insert_constraint(Vertex_handle vaa, Vertex_handle vbb, OutputIterator out) // forces the constrained [va,vb] -// [va,vb] will eventually be splitted into several edges +// [va,vb] will eventually be split into several edges // if a vertex vc of t lies on segment ab // of if ab intersect some constrained edges { diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h index b9c2ef0d4f7..dad024bd902 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h @@ -857,7 +857,7 @@ insert_subconstraint(Vertex_handle vaa, Vertex_handle vbb, OutputItertator out) // insert the subconstraint [vaa vbb] - // it will eventually be splitted into several subconstraints + // it will eventually be split into several subconstraints { std::stack > stack; stack.push(std::make_pair(vaa,vbb));