From 53d5c41759e77befd4b86a5e74d0d8b1c84a4fc7 Mon Sep 17 00:00:00 2001 From: Olivier Devillers Date: Fri, 25 May 2012 14:45:48 +0000 Subject: [PATCH] implementing reviews of concept TDS --- .gitattributes | 2 + .../doc_tex/Triangulation/triangulation.tex | 68 ++-- .../DelaunayTriangulationTraits.tex | 6 +- .../Delaunay_triangulation.tex | 2 +- .../RegularTriangulationTraits.tex | 8 +- .../Triangulation_ref/Triangulation.tex | 61 ++-- .../TriangulationDSFullCell.tex | 10 +- .../TriangulationDSVertex.tex | 4 +- .../TriangulationDataStructure.tex | 304 ++++++++++++------ .../Triangulation_ref/TriangulationFace.tex | 4 +- .../TriangulationFullCell.tex | 2 +- .../Triangulation_ref/TriangulationTraits.tex | 6 +- .../Triangulation_ref/TriangulationVertex.tex | 2 +- .../Triangulation_ds_full_cell.tex | 2 +- .../Triangulation_ref/Triangulation_face.tex | 2 +- .../Triangulation_full_cell.tex | 2 +- .../Triangulation_ref/fig/insert-in-hole.pdf | Bin 20242 -> 20311 bytes .../Triangulation_ref/fig/insert-in-hole.png | Bin 36961 -> 25751 bytes .../fig/insert-increase-dim.pdf | Bin 0 -> 12775 bytes .../fig/insert-increase-dim.png | Bin 0 -> 7143 bytes .../doc_tex/Triangulation_ref/intro.tex | 2 +- .../examples/Triangulation/delaunay.cpp | 4 +- .../include/CGAL/Delaunay_triangulation.h | 4 +- Triangulation/include/CGAL/Triangulation.h | 5 - .../CGAL/Triangulation_data_structure.h | 5 - Triangulation/test/Triangulation/tds.cpp | 2 +- 26 files changed, 300 insertions(+), 207 deletions(-) create mode 100644 Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.pdf create mode 100644 Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.png diff --git a/.gitattributes b/.gitattributes index 25c08b34306..c601411a2b9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4247,6 +4247,8 @@ Triangulation/doc_tex/Triangulation_ref/fig/insert-in-face.pdf -text Triangulation/doc_tex/Triangulation_ref/fig/insert-in-face.png -text Triangulation/doc_tex/Triangulation_ref/fig/insert-in-hole.pdf -text Triangulation/doc_tex/Triangulation_ref/fig/insert-in-hole.png -text +Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.pdf -text +Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.png -text Triangulation/doc_tex/Triangulation_ref/intro.tex -text Triangulation/doc_tex/Triangulation_ref/main.tex -text Triangulation/dont_submit -text diff --git a/Triangulation/doc_tex/Triangulation/triangulation.tex b/Triangulation/doc_tex/Triangulation/triangulation.tex index 95bddf6a915..a10dd8f93ce 100644 --- a/Triangulation/doc_tex/Triangulation/triangulation.tex +++ b/Triangulation/doc_tex/Triangulation/triangulation.tex @@ -15,26 +15,26 @@ it under insertions (and deletions in the Delaunay case). \section{Introduction\label{triangulation:intro}} -A \em{finite abstract simplicial complex} is built on a finite set of +A {\em finite abstract simplicial complex} is built on a finite set of vertices $V$ and consists of a collection $S$ of subsets of $V$ such that \centerline{if $s$ is a set of vertices in $S$, then all the subsets of $s$ are also in $S$.} The sets in $S$ (which are subsets of $V$) are called -\em{faces} or \em{simplices} (the -singular of which is \em{simplex}). +{\em faces} or {\em simplices} (the +singular of which is {\em simplex}). % -A simplex $s\in S$ is \em{maximal} if it is not a proper subset of some other -set in $S$. The simplicial complex is \em{pure} %(or \em{homogeneous}) +A simplex $s\in S$ is {\em maximal} if it is not a proper subset of some other +set in $S$. The simplicial complex is {\em pure} %(or {\em homogeneous}) if all the maximal simplices have the same cardinality, i.e., they have the same number of vertices. -In the sequel, we will call these maximal simplices \em{full cells}. -A \em{face} of a simplex is a subset of it. -A \em{proper face} of a simplex is a strict subset of it. +In the sequel, we will call these maximal simplices {\em full cells}. +A {\em face} of a simplex is a subset of it. +A {\em proper face} of a simplex is a strict subset of it. If the vertices are embedded into Euclidean space $\real^d$, we deal with -\em{finite simplicial complexes} which have slightly different simplices +{\em finite simplicial complexes} which have slightly different simplices and additional requirements: \begin{itemize} \item vertices corresponds to points in space. @@ -48,7 +48,7 @@ entry} for more about simplicial complexes. This \cgal\ package deals with pure finite simplicial complexes without boundary, which -we will simply call in the sequel \em{triangulations}. It provides three main classes +we will simply call in the sequel {\em triangulations}. It provides three main classes for creating and manipulating triangulations. The class \ccc{CGAL::Triangulation_data_structure} adds further constraints to a triangulation, in that all its simplices must have the -so-called \em{Delaunay} or \em{empty-ball} property: the interior of +so-called {\em Delaunay} or {\em empty-ball} property: the interior of a ball circumscribing any simplex (or full cell) must be free from any vertex of the triangulation. The \ccc{CGAL::Delaunay_triangulation} class supports deletion of vertices. @@ -94,15 +94,15 @@ affinely independent. If the maximal dimension of a simplex in the triangulation is $d$, we call:\begin{itemize} -\item an $i$-face for some $i\in[0,d]$ a \em{face}; -\item a $0$-face a \em{vertex}; -\item a $1$-face an \em{edge}; -\item a $(d-2)$-face a \em{ridge}; -\item a $(d-1)$-face a \em{facet}; and -\item a $d$-face a \em{full cell}. +\item an $i$-face for some $i\in[0,d]$ a {\em face}; +\item a $0$-face a {\em vertex}; +\item a $1$-face an {\em edge}; +\item a $(d-2)$-face a {\em ridge}; +\item a $(d-1)$-face a {\em facet}; and +\item a $d$-face a {\em full cell}. \end{itemize} -Two faces $\sigma$ and $\sigma'$ are \em{incident} if and only if +Two faces $\sigma$ and $\sigma'$ are {\em incident} if and only if $\sigma'$ is a proper sub-face of $\sigma$ or \emph{vice versa}. \section{Triangulation Data Structure\label{triangulation:tds}} @@ -119,11 +119,11 @@ TriangulationDSFullCell>}. For simplicity, we use the abbreviation \tds. A \tds\ can represent an abstract pure complex, such that any facet is incident to exactly two full cells. -A \tds\ has a property called the \em{ambient dimension} which is a +A \tds\ has a property called the {\em ambient dimension} which is a positive integer equal to the maximum dimension a full cell can have. This ambient dimension can be chosen by the user at the creation of a \tds\ and can then be queried using the method \ccc{tds.ambient_dimension()}. -A \tds\ also knows the \em{current dimension} of its full cells, +A \tds\ also knows the {\em current dimension} of its full cells, which can be queried with \ccc{tds.current_dimension()}. In the sequel, let us denote the ambient dimension with \ad\ and the current dimension with \cd. It always holds that $-2\leq\cd\leq\ad$ and $0<\ad$. @@ -145,7 +145,7 @@ The special meaning of negative values for $d$ will be explain below. %% dimension. This means that, whatever the current dimension is, a %% full cell is always represented by the \ccc{FullCell} nested type, And a %% \ccc{Facet} represents a face of dimension \ccc{current_dimension()-1} -%% \em{and not} \ccc{ambient_dimension()-1}. +%% {\em and not} \ccc{ambient_dimension()-1}. \subsubsection{The data structure triangulates $\sphere^\cd$} @@ -155,17 +155,17 @@ i.e., its faces can be embedded to form a partition of $\sphere^\cd$ into $\cd$-simplices. % When a % \tds\ is used as the combinatorial part of a geometric triangulation, one -% special vertex of the \tds\ plays the role of the \em{vertex at +% special vertex of the \tds\ plays the role of the {\em vertex at % infinity}; we can consider that the triangulation covers the whole % affine hull of its vertices -% using \em{infinite} or \em{unbounded} full cells to fill the space outside the convex +% using {\em infinite} or {\em unbounded} full cells to fill the space outside the convex % hull of the triangulation's finite vertices. (More details are given in the next section.) One nice consequence of the above important fact is that a full cell has always exactly $\cd+1$ neighbors. Two full cells $\sigma$ and $\sigma'$ sharing a facet are called -\em{neighbors}. +{\em neighbors}. Possible values of $\cd$ (the \emph{current dimension} of the triangulation) include @@ -204,7 +204,7 @@ Each full cell stores references to its $\cd+1$ vertices and neighbors. Its vertices and neighbors are indexed from $0$ to \cd. The indices of its neighbors have the following meaning: the $i$-th neighbor of $\sigma$ is the unique neighbor of $\sigma$ that does not contain the $i$-th vertex of -$\sigma$; in other words, it is the neighbor of $\sigma$ \em{opposite} to +$\sigma$; in other words, it is the neighbor of $\sigma$ {\em opposite} to the $i$-th vertex of $\sigma$. \begin{figure}[htbp] @@ -258,7 +258,7 @@ concepts: \ccc{Triangulation_ds_vertex} and can see, take the \tds\ as a template parameter in order to get access to some nested types in \tds. -\em{This creates a circular dependency}, which we resolve in the same way +{\em This creates a circular dependency}, which we resolve in the same way as in the \cgal\ \ccc{Triangulation_2} and \ccc{Triangulation_3} packages (see Chapters~\ref{chapter-TDS2},~\ref{chapter-Triangulation2},~\ref{chapter-TDS3},~and~\ref{chapter-Triangulation3}). In particular, models of the concepts \ccc{TriangulationDSVertex} and @@ -294,7 +294,7 @@ It is also possible to fix it at run time as in the next example. \subsubsection{Barycentric subdivision} This example provides a function for computing the barycentric subdivision of a single full cell \ccc{c} in a triangulation data structure. The other -full cells neighboring \ccc{c} are automatically subdivided to match the +full cells adjacent to \ccc{c} are automatically subdivided to match the subdivision of the full cell \ccc{c}. The barycentric subdivision of \ccc{c} is obtained by enumerating all the faces of \ccc{c} in order of decreasing dimension, from the dimension of~\ccc{c} to dimension~1, and inserting a new @@ -330,7 +330,7 @@ triangulation into Euclidean space. More precisely, it maintains a triangulation (a partition into pairwise interior-disjoint full cells) of the convex hull of the points (the embedded vertices) of the triangulation, as well as a triangulation of the complement of the convex hull -\em{in the affine subspace} spanned by the triangulation's points +{\em in the affine subspace} spanned by the triangulation's points using a special vertex at infinity. Methods are provided for the insertion of points in the triangulation, the @@ -339,7 +339,7 @@ as well as the localization of a query point inside the triangulation. Infinite full cells outside the convex hull are each incident to a finite facet on the convex hull of the triangulation and to a unique special -\em{vertex at infinity}. +{\em vertex at infinity}. %\note{In every infinite full cell, the vertex at infinity always has index $0$.} %\note{SH: the above note this should go in the documentation of the %\ccc{TriangulationDataStructure} concept, or that of the class?} @@ -455,17 +455,17 @@ visits \emph{only} the infinite full cells but stores handles to them into a The class \ccc{CGAL::Delaunay_triangulation} derives from \ccc{CGAL::Triangulation} and adds further constraints to a triangulation, in that all its full cells must have the so-called -\em{Delaunay} or \em{empty-ball} property: the interior of the ball +{\em Delaunay} or {\em empty-ball} property: the interior of the ball circumscribing any full cell must be free from any vertex of the triangulation. -The \em{circumscribing ball} of a full cell is the ball +The {\em circumscribing ball} of a full cell is the ball having all vertices of the full cell on its boundary. In case of degeneracies (co-spherical points) the triangulation is not uniquely defined, note however that the \cgal\ implementation computes a unique triangulation even in these cases. -%The \em{circumscribing sphere} of a face \ccc{c} is the smallest sphere +%The {\em circumscribing sphere} of a face \ccc{c} is the smallest sphere %touching all vertices of the face. A triangulation of the convex %hull of a finite point set has the Delaunay (or empty-ball) property if all %its full cells have the Delaunay (or empty-ball) property: @@ -476,8 +476,8 @@ triangulation even in these cases. When a new point \ccc{p} is inserted into a Delaunay triangulation, the finite full cells whose circumscribing sphere contain \ccc{p} are said to -\em{be in conflict} with point \ccc{p}. The set of full cells that are in -conflict with \ccc{p} form the \em{conflict zone}. That conflict zone is +{\em be in conflict} with point \ccc{p}. The set of full cells that are in +conflict with \ccc{p} form the {\em conflict zone}. That conflict zone is augmented with the infinite full cells whose finite facet does not lie anymore on the convex hull of the triangulation (with \ccc{p} added). The full cells in the conflict zone are removed, leaving a hole that contains \ccc{p}. That diff --git a/Triangulation/doc_tex/Triangulation_ref/DelaunayTriangulationTraits.tex b/Triangulation/doc_tex/Triangulation_ref/DelaunayTriangulationTraits.tex index c326a1d97df..3f23579c961 100644 --- a/Triangulation/doc_tex/Triangulation_ref/DelaunayTriangulationTraits.tex +++ b/Triangulation/doc_tex/Triangulation_ref/DelaunayTriangulationTraits.tex @@ -103,9 +103,9 @@ const;} \ccHasModels -\ccc{Cartesian_d},\\ -\ccc{Simple_cartesian_d},\\ -\ccc{Filtered_kernel_d} (recommended) +\ccc{CGAL::Cartesian_d},\\ +\ccc{CGAL::Simple_cartesian_d},\\ +\ccc{CGAL::Filtered_kernel_d} (recommended) \ccSeeAlso diff --git a/Triangulation/doc_tex/Triangulation_ref/Delaunay_triangulation.tex b/Triangulation/doc_tex/Triangulation_ref/Delaunay_triangulation.tex index 487b48090ae..fe71d43e245 100644 --- a/Triangulation/doc_tex/Triangulation_ref/Delaunay_triangulation.tex +++ b/Triangulation/doc_tex/Triangulation_ref/Delaunay_triangulation.tex @@ -108,7 +108,7 @@ value of \ccc{lt}:\begin{itemize} \item[\ccc{OUTSIDE_AFFINE_HULL}] Point triangulation. The method \ccVar.\ccc{insert_outside_affine_hull()} is called. \item[\ccc{ON_VERTEX}] The position of the vertex \ccc{v} described by \ccc{f} is set to \ccc{p}. \ccc{v} is returned. \item[Anything else] The point \ccc{p} -is inserted in the conflict zone \em{which is assumed} to contain +is inserted in the conflict zone {\em which is assumed} to contain full cell \ccc{c}. (Roughly speaking, the method \ccVar.\ccc{insert_in_conflict_zone()} is called.)\end{itemize} \ccPrecond The parameters \ccc{lt}, \ccc{f}, \ccc{ft} diff --git a/Triangulation/doc_tex/Triangulation_ref/RegularTriangulationTraits.tex b/Triangulation/doc_tex/Triangulation_ref/RegularTriangulationTraits.tex index ddde754c74d..d345e9dff6d 100644 --- a/Triangulation/doc_tex/Triangulation_ref/RegularTriangulationTraits.tex +++ b/Triangulation/doc_tex/Triangulation_ref/RegularTriangulationTraits.tex @@ -46,7 +46,7 @@ subspace Aff. It is guaranteed that the affine subspace Aff is given a consistent orientation when it is called many times with simplex points (in range \ccc{[start,end)}) living in a same affine subspace.\\ \textbf{Important.} Information about the affine subspace Aff is computed -\em{once} and then stored in the predicate class, so it is wise to keep an +{\em once} and then stored in the predicate class, so it is wise to keep an instance of the predicate around as long as one is sure that the affine subspace Aff doesn't change. \ccPrecond \ccc{std::distance(start,end)>=3} and \ccc{std::distance(start,end)<=start->dimension()+1}. The points in range @@ -72,9 +72,9 @@ side_of_oriented_subphere_d_object() const;} \ccHasModels -\ccc{Cartesian_d},\\ -\ccc{Simple_cartesian_d},\\ -\ccc{Filtered_kernel_d} (recommended). +\ccc{CGAL::Cartesian_d},\\ +\ccc{CGAL::Simple_cartesian_d},\\ +\ccc{CGAL::Filtered_kernel_d} (recommended). \ccSeeAlso diff --git a/Triangulation/doc_tex/Triangulation_ref/Triangulation.tex b/Triangulation/doc_tex/Triangulation_ref/Triangulation.tex index 50eb1fbb56b..bf7fc368a6c 100644 --- a/Triangulation/doc_tex/Triangulation_ref/Triangulation.tex +++ b/Triangulation/doc_tex/Triangulation_ref/Triangulation.tex @@ -208,14 +208,14 @@ Returns the (modified) output iterator. incident_full_cells(const Face & f, OutputIterator out) const;} {Insert in \ccc{out} all the full cells that are incident to the face \ccc{f}, {i.e.}, the full cells that have the \ccc{Face f} as a subface. -Returns the (probably modified) output iterator. +Returns the output iterator. %\ccPrecond\ccc{is_full_cell(f.full_cell())}. } \ccMethod{template< typename OutputIterator > OutputIterator star(const Face & f, OutputIterator out) const;} {Insert in \ccc{out} all the full cells that share at least one vertex with the \ccc{Face -f}. Returns the (probably modified) output iterator. +f}. Returns the output iterator. %\ccPrecond\ccc{is_full_cell(f.full_cell())}. } @@ -228,31 +228,31 @@ constructed. \ccPrecond$0 < d$. } -\ccMethod{template< typename OutputIterator > OutputIterator -incident_upper_faces(Vertex_const_handle v, int d, OutputIterator -out);}{Constructs all the \em{upper} \ccc{Face}s of dimension \ccc{d} -incident to \ccc{Vertex} v and inserts them in the \ccc{OutputIterator out}.\\ -Assuming some total ordering on the vertices of the triangulation (which is -invariant as long as no vertex is inserted in or removed from the triangulation), a -\ccc{Face} incident to \ccc{v} is an \em{upper} \ccc{Face} if and only if -its vertices occur at \ccc{v} or beyond \ccc{v} in the ordering.\\ In -particular, taking the disjoint union of the upper \ccc{Face}s of dimension -\ccc{d} incident to every vertex of the triangulation yields exactly the set of -faces of dimension \ccc{d} of the triangulation.\\ The constructed \ccc{Faces} are -lexicographically ordered using the vertex order as base ordering. In order to -make it easy to find the infinite \ccc{Faces}, the latter ordering makes the -vertex at infinity the smallest vertex; so calling the method on a finite -vertex will construct only finite faces and calling it on the vertex at -infinity will produce all infinite \ccc{d}-faces. (Elle est pas belle, la vie -?) If $d\geq $\ccVar.\ccc{current_dimension()}, then no \ccc{Face} is -constructed. -\ccPrecond$0 < d$. -} +% \ccMethod{template< typename OutputIterator > OutputIterator +% incident_upper_faces(Vertex_const_handle v, int d, OutputIterator +% out);}{Constructs all the {\em upper} \ccc{Face}s of dimension \ccc{d} +% incident to \ccc{Vertex} v and inserts them in the \ccc{OutputIterator out}.\\ +% Assuming some total ordering on the vertices of the triangulation (which is +% invariant as long as no vertex is inserted in or removed from the triangulation), a +% \ccc{Face} incident to \ccc{v} is an {\em upper} \ccc{Face} if and only if +% its vertices occur at \ccc{v} or beyond \ccc{v} in the ordering.\\ In +% particular, taking the disjoint union of the upper \ccc{Face}s of dimension +% \ccc{d} incident to every vertex of the triangulation yields exactly the set of +% faces of dimension \ccc{d} of the triangulation.\\ The constructed \ccc{Faces} are +% lexicographically ordered using the vertex order as base ordering. In order to +% make it easy to find the infinite \ccc{Faces}, the latter ordering makes the +% vertex at infinity the smallest vertex; so calling the method on a finite +% vertex will construct only finite faces and calling it on the vertex at +% infinity will produce all infinite \ccc{d}-faces. (Elle est pas belle, la vie +% ?) If $d\geq $\ccVar.\ccc{current_dimension()}, then no \ccc{Face} is +% constructed. +% \ccPrecond$0 < d$. +% } -\ccGlue\ccMethod{template< typename OutputIterator, typename Comparator > -OutputIterator incident_upper_faces(Vertex_const_handle v, const int d, -OutputIterator out, Comparator cmp);} {Same as above, but uses \ccc{cmp} as -the vertex ordering to define the upper faces.} +% \ccGlue\ccMethod{template< typename OutputIterator, typename Comparator > +% OutputIterator incident_upper_faces(Vertex_const_handle v, const int d, +% OutputIterator out, Comparator cmp);} {Same as above, but uses \ccc{cmp} as +% the vertex ordering to define the upper faces.} \ccHeading{Faces and Facets} % - - - - - - - - - - - - - - - - - - - - FACETS @@ -263,11 +263,6 @@ the vertex ordering to define the upper faces.} {Returns the index of the vertex of the full cell \ccc{c=}\ccVar.\ccc{full_cell(f)} which does {not} belong to \ccc{c}.} -%\begin{ccAdvanced} -%\ccMethod{Face make_empty_face() const;}{Returns an empty \ccc{Face}.} -%%\note{to be removed, internal use only. at least should be advanced} -%\end{ccAdvanced} - \ccHeading{Triangulation traversal} % - - - - - - - - - - - - - - - - - - TRAVERSAL %\ccMethod{Vertex_const_iterator vertices_begin() const;}{} @@ -356,10 +351,10 @@ having \ccc{v} as a vertex is returned. \ccc{IN_FACET}, \ccc{ft} is set to one of the two finite facets containing the \ccc{query} point. The full cell of \ccc{ft} is returned. \item[$k=$\ccc{c.current_dimension()}] If the \ccc{query} point lies -\em{outside} the convex hull of the points in the triangulation, then +{\em outside} the convex hull of the points in the triangulation, then \ccc{loc_type} is set to \ccc{OUTSIDE_CONVEX_HULL} and a full cell is returned as in the \ccc{locate} method above. If the \ccc{query} point lies -\em{inside} the convex hull of the points in the triangulation, then +{\em inside} the convex hull of the points in the triangulation, then \ccc{loc_type} is set to \ccc{IN_FULL_CELL} and the unique full cell containing the \ccc{query} point is returned. \end{itemize}} diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationDSFullCell.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationDSFullCell.tex index 0ae37378319..8c8565e760f 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationDSFullCell.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationDSFullCell.tex @@ -17,8 +17,8 @@ concept. \ccHasModels -\ccc{Triangulation_ds_full_cell}\\ -\ccc{Triangulation_full_cell} +\ccc{CGAL::Triangulation_ds_full_cell}\\ +\ccc{CGAL::Triangulation_full_cell} \ccTypes @@ -82,7 +82,7 @@ $0\leq i\leq$\ccc{ambient_dimension()}.} the full cell \ccVar as a neighbor in the full cell \ccVar\ccc{.neighbor(i);}. If the returned integer is not negative, it holds that \ccVar.% \ccc{neighbor(i)->neighbor(j) == }\ccVar. Returns -\ccc{-1} if \ccVar has no neighboring full cell of index \ccc{i}. +\ccc{-1} if \ccVar has no adjacent full cell of index \ccc{i}. \ccPrecond $0\leq i\leq$\ccc{ambient_dimension()}.} \ccMethod{int index(Full_cell_handle n) const;}{Returns the index \ccc{i} @@ -103,7 +103,7 @@ a non-\ccc{const} object.} \begin{ccAdvanced} \ccMethod{Vertex_handle mirror_vertex(const int i, const int cur_dim) const;} {Returns a handle to the mirror vertex of the \ccc{i}-th vertex of full cell -\ccVar. This function works even if the neighboring information stored in the +\ccVar. This function works even if the adjacency information stored in the neighbor full cell \ccc{*}\ccVar\ccc{.neighbor(i)} is corrupted. This is useful when temporary corruption is necessary during surgical operation on a triangulation. \ccPrecond $0\leq @@ -118,7 +118,7 @@ vertex of the full cell. \ccPrecond $0\leq i\leq$\ccc{ambient_dimension()}.} \ccMethod{void set_neighbor(const int i, Full_cell_handle n);} {Sets the -\ccc{i}-th neighboring full cell of \ccVar\ to \ccc{n}. Full cell \ccc{n} is +\ccc{i}-th neighbor of \ccVar\ to \ccc{n}. Full cell \ccc{n} is opposite to the $i$-th vertex of \ccVar. \ccPrecond $0\leq i\leq$\ccc{ambient_dimension()}.} diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationDSVertex.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationDSVertex.tex index aeca4e9b613..8f05807167a 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationDSVertex.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationDSVertex.tex @@ -12,8 +12,8 @@ concept. \ccHasModels -\ccc{Triangulation_ds_vertex}\\ -\ccc{Triangulation_vertex} +\ccc{CGAL::Triangulation_ds_vertex}\\ +\ccc{CGAL::Triangulation_vertex} \ccTypes diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationDataStructure.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationDataStructure.tex index 96fd28155e6..950c915c81a 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationDataStructure.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationDataStructure.tex @@ -7,14 +7,14 @@ maintaining the combinatorial part of a $\cd$-dimensional pure simplicial complex (all simplices that are not sub-faces of another have the same dimension $\cd$). Its topology is the topology -of the sphere $\sphere^\cd$ with $d\in[-2,\ad]$ -or possibly of another $\cd$-dimensional manifold without boundary -(that can be embedded in an higher dimension). +of the sphere $\sphere^\cd$ with $d\in[-2,\ad]$. +%possibly of another $\cd$-dimensional manifold without boundary +%(that can be embedded in a higher dimension). In a pure (or homogeneous) simplicial $\cd$-complex, all faces are sub-faces of some $\cd$-simplex. (A simplex is also a face of itself.) In particular, it does not contain any $\cd+1$-face, and any $\cd-1$-face belongs to exactly -two $\cd$-dimensional {\em full cell}. +two $\cd$-dimensional {full cells}. Values of $\cd$ (the \emph{current dimension} of the complex) include \begin{itemize} @@ -42,13 +42,19 @@ An $i$-simplex is a simplex with $i+1$ vertices. An $i$-simplex $\sigma$ is {incident} to a $j$-simplex $\sigma'$, $j} +\ccc{CGAL::Triangulation_data_structure} \ccTypes -\ccTwo{Triangulation_data_structure::Full_cell_iteratorxx}{} - +\ccThree{typedef std::pair}{Facet;}{} +\ccThreeToTwo \ccNestedType{Vertex} { @@ -63,11 +69,16 @@ Full cell type. The concept \ccRefName\ also defines a type for describing facets of the triangulation with codimension~1: -%\ccTypedef{typedef std::pair Facet;} -\ccNestedType{Facet} -{A facet of a full cell. Its dimension is -\ccc{current_dimension()-1}. \ccc{Facet f(c,i)} represents the facet of -full cell \ccc{c} opposite to its \ccc{i}-th vertex} + +\ccThree{typedef std::pair}{Facet;}{} +\ccTypedef{typedef std::pair Facet;} +%\ccNestedType{Facet} +{ +\ccc{Facet f(c,i)} represents the facet of +full cell \ccc{c} opposite to its \ccc{i}-th vertex. + Its dimension is \ccc{current_dimension()-1}. +} +\ccThreeToTwo \ccNestedType{Face} {A model of the concept \ccc{TriangulationFace}.} @@ -133,11 +144,12 @@ Iterator over the facets of the complex. \ccCreation \ccCreationVariable{tds} -\ccConstructor{XXXXXXXXXX(const int dim);} {Creates an instance \ccVar\ of +\ccConstructor{(int dim);} {Creates an instance \ccVar\ of type \ccRefName. The maximal dimension of its full cells is \ccc{dim} and \ccVar\ is initialized to the empty triangulation. Thus, \ccVar.\ccc{current_dimension()} equals \ccc{-2}. -Parameter \ccc{dim} is ignored if the dimension tag is static.} +Parameter \ccc{dim} is ignored if the dimension tag is static. +\ccPrecond \ccc{dim>0}.} %\ccOperations @@ -173,33 +185,38 @@ contains nothing. Returns \ccc{false} otherwise. } void full_cells(Full_cell_handle c, TraversalPredicate & tp, OutputIterator & out) const;} {This function computes (\emph{gathers}) a connected set of full cells -satifying a common criteria. Call them \emph{good} full cells. It is assumed +satifying a common criterion. Call them \emph{good} full cells. It is assumed that the argument \ccc{c} is a good full cell. The full cells are then -recursively explored by examining if, from a given good full cell, its neighboring +recursively explored by examining if, from a given good full cell, its adjacent full cells are also good.\\ The argument \ccc{tp} is a predicate that takes as argument a \ccc{Facet} -whose containing \ccc{Full_cell} is good. The predicate must return \ccc{true} +whose defining \ccc{Full_cell} is good. The predicate must return \ccc{true} if the traversal of that \ccc{Facet} leads to a good full cell.\\ -All the good full cells are outputted into the last argument \ccc{out}.} +All the good full cells are output into the last argument \ccc{out}. +\ccPrecond \ccc{c!=Full_cell_handle()} and \ccc{tp(c)==true}. +} \ccMethod{template< typename OutputIterator > OutputIterator incident_full_cells(Vertex_handle v, OutputIterator out) const;} {Insert in \ccc{out} all the full cells that are incident to the vertex \ccc{v}, {i.e.}, the full cells that have the \ccc{Vertex v} as a vertex. -Returns the (modified) output iterator.} +Returns the output iterator. +\ccPrecond \ccc{v!=Vertex_handle()}. +} + \ccMethod{template< typename OutputIterator > OutputIterator incident_full_cells(const Face & f, OutputIterator out) const;} {Insert in \ccc{out} all the full cells that are incident to the face \ccc{f}, {i.e.}, the full cells that have the \ccc{Face f} as a subface. -Returns the (probably modified) output iterator. -%\ccPrecond\ccc{is_full_cell(f.full_cell())}. +Returns the output iterator. +\ccPrecond\ccc{f.full_cell()!=Full_cell_handle()}. } \ccMethod{template< typename OutputIterator > OutputIterator star(const Face & f, OutputIterator out) const;} {Insert in \ccc{out} all the full cells that share at least one vertex with the \ccc{Face -f}. Returns the (probably modified) output iterator. -%\ccPrecond\ccc{is_full_cell(f.full_cell())}. +f}. Returns the output iterator. +%\ccPrecond\ccc{f.full_cell()!=Full_cell_handle()}. } \ccMethod{template< typename OutputIterator > OutputIterator @@ -208,55 +225,61 @@ f}. Returns the (probably modified) output iterator. \ccc{Vertex} v and inserts them in the \ccc{OutputIterator out}. If \ccc{d >=} \ccVar.\ccc{current_dimension()}, then no \ccc{Face} is constructed. -\ccPrecond\ccc{0 < d}. +\ccPrecond\ccc{0 < d} and \ccc{v!=Vertex_handle()}. } -\ccMethod{template< typename OutputIterator > OutputIterator -incident_upper_faces(Vertex_handle v, const int d, OutputIterator - out);}{Constructs all the \em{upper} \ccc{Face}s of dimension \ccc{d} - incident to \ccc{Vertex} v and inserts them in the \ccc{OutputIterator out}.\\ - Assuming some total ordering on the vertices of the complex (which is - invariant as long as no vertex is inserted in or removed from the complex), a - \ccc{Face} incident to \ccc{v} is an \em{upper} \ccc{Face} if and only if - its vertices occur at \ccc{v} or beyond \ccc{v} in the ordering.\\ In - particular, taking the disjoint union of the upper \ccc{Face}s of dimension - \ccc{d} incident to every vertex of the complex yields exactly the set of - faces of dimension \ccc{d} of the complex.\\ The constructed \ccc{Faces} are - lexicographically ordered (using the vertex order as base - ordering). If -$d\geq$\ccVar.\ccc{current_dimension()}, then no \ccc{Face} is - constructed. -\ccPrecond\ccc{0 < d}. -} -\ccGlue\ccMethod{template< typename OutputIterator, typename Comparator > - OutputIterator incident_upper_faces(Vertex_handle v, const int d, - OutputIterator out, Comparator cmp);} {Same as above, but uses \ccc{cmp} as - the vertex ordering to define the upper faces.} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Since unused from the moment and usage is not clear, I remove it +% for the moment. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \ccMethod{template< typename OutputIterator > OutputIterator +% incident_upper_faces(Vertex_handle v, const int d, OutputIterator +% out);}{Constructs all the {\em upper} \ccc{Face}s of dimension \ccc{d} +% incident to \ccc{Vertex} v and inserts them in the \ccc{OutputIterator out}.\\ +% Assuming some total ordering on the vertices of the complex (which is +% invariant as long as no vertex is inserted in or removed from the complex), a +% \ccc{Face} incident to \ccc{v} is an {\em upper} \ccc{Face} if and only if +% its vertices occur at \ccc{v} or beyond \ccc{v} in the ordering.\\ In +% particular, taking the disjoint union of the upper \ccc{Face}s of dimension +% \ccc{d} incident to every vertex of the complex yields exactly the set of +% faces of dimension \ccc{d} of the complex.\\ The constructed \ccc{Faces} are +% lexicographically ordered (using the vertex order as base +% ordering). If +% $d\geq$\ccVar.\ccc{current_dimension()}, then no \ccc{Face} is +% constructed. +% \ccPrecond\ccc{0 < d} and \ccc{v!=Vertex_handle()}. +% } + +% \ccGlue\ccMethod{template< typename OutputIterator, typename Comparator > +% OutputIterator incident_upper_faces(Vertex_handle v, const int d, +% OutputIterator out, Comparator cmp);} {Same as above, but uses \ccc{cmp} as +% the vertex ordering to define the upper faces.} \ccHeading{Accessing the vertices} % --------------------- ACCESS TO VERTICES +\ccThree{Vertex_iterator}{tds.number_of_full_cells() const}{} \ccMethod{Vertex_handle vertex(Full_cell_handle c, const int i) const;}%{} { Returns a handle to the \ccc{i}-th \ccc{Vertex} of the \ccc{Full_cell} \ccc{c}. -\ccPrecond $0\leq i\leq$\ccVar.\ccc{current_dimension()}.} +\ccPrecond $0\leq i\leq$\ccVar.\ccc{current_dimension()} and \ccc{c!=Full_cell_handle()}.} \ccMethod{int mirror_index(Full_cell_handle c, int i) const;}%{} {Returns the index of the vertex mirror of the \ccc{i}-th vertex of \ccc{c}. -Equivalently, returns the index of \ccc{c} in its \ccc{i}-th neighbor. +Equivalently, returns the index of \ccc{c} as a neighbor of its \ccc{i}-th neighbor. \ccPrecond $0\leq i\leq$\ccVar.\ccc{current_dimension}()\\ -and \ccc{c} is not the default constructed \ccc{Full_cell_handle}. } +and \ccc{c!=Full_cell_handle()}. } \ccMethod{Vertex_handle mirror_vertex(Full_cell_handle c, int i) const;}%{} {Returns the vertex mirror of the \ccc{i}-th vertex of \ccc{c}. Equivalently, returns the vertex of the \ccc{i}-th neighbor of \ccc{c} that is not vertex of \ccc{c}. \ccPrecond $0\leq i\leq$\ccVar.\ccc{current_dimension}()\\ -and \ccc{c} is not the default constructed \ccc{Full_cell_handle}. } +and \ccc{c!=Full_cell_handle()}. } \ccMethod{Vertex_iterator vertices_begin();} { -The first vertex of \ccVar. +The first vertex of \ccVar. User has no control on the order. } \ccGlue \ccMethod{Vertex_iterator vertices_end();} @@ -265,6 +288,7 @@ The beyond vertex of \ccVar. } \ccHeading{Accessing the full cells} % ------------------- ACCESS TO CELLS +\ccThree{Full_cell_iterator}{tds.number_of_full_cells() const}{} \ccMethod{Full_cell_handle full_cell(Vertex_handle v) const;}%{} {Returns a full cell incident to \ccc{Vertex} \ccc{v}. Note that this @@ -280,7 +304,7 @@ and \ccc{c} is not the default constructed \ccc{Full_cell_handle}} \ccMethod{Full_cell_iterator full_cells_begin();} { -The first full cell of \ccVar. +The first full cell of \ccVar. User has no control on the order. } \ccGlue \ccMethod{Full_cell_iterator full_cells_end();} @@ -303,10 +327,6 @@ The beyond full cell of \ccVar. {Returns the index of vertex of the full cell \ccc{c=}\ccVar.\ccc{full_cell(f)} which does {not} belong to \ccc{c}.} -\ccMethod{Face make_empty_face() const;}{Returns an empty \ccc{Face} -ready to be setup with any $k$-face of the (combinatorial) triangulation with -$k<$\ccVar.\ccc{current_dimension()}. See \ccc{TriangulationFace}.} - %\begin{ccAdvanced} % %\ccMethod{bool is_boundary_facet(const Facet & f) const;} @@ -323,12 +343,16 @@ $k<$\ccVar.\ccc{current_dimension()}. See \ccc{TriangulationFace}.} \ccHeading{Vertex insertion} % - - - - - - - - - - - - - - - - - - INSERTIONS -\ccMethod{Vertex_handle insert_in_full_cell(Full_cell_handle c);}{Inserts a new +\ccMethod{Vertex_handle insert_in_full_cell(Full_cell_handle c);} +{Inserts a new vertex \ccc{v} in the full cell \ccc{c} and returns a handle to it. The full cell -\ccc{c} is subdivided into \ccVar.\ccc{current_dimension())+1} full cells which -share the vertex \ccc{v}. -\ccPrecond Current dimension is positive and \ccc{c} is a full cell of \ccVar.} +\ccc{c} is subdivided into \ccVar.\ccc{current_dimension()}+1 full cells which +share the vertex \ccc{v} (see Figure~\ref{triangulation:fig:insert-full-cell}). +\ccPrecond Current dimension is positive and \ccc{c} is a full cell of +\ccVar.} + +\begin{figure}[ht] \begin{ccTexOnly} \begin{center} \includegraphics{Triangulation_ref/fig/insert-in-cell.pdf} @@ -339,10 +363,15 @@ share the vertex \ccc{v}. The effect of insert_in_full_cell() \end{ccHtmlOnly} +\caption{Insertion in a full cell, $\cd=2$\label{triangulation:fig:insert-full-cell}} +\end{figure} \ccMethod{Vertex_handle insert_in_face(const Face & f);} {Inserts a vertex in the triangulation data structure by subdividing the -\ccc{Face f}. Returns a handle to the newly created \ccc{Vertex}.} +\ccc{Face f}. Returns a handle to the newly created \ccc{Vertex} (see +Figure below~\ref{triangulation:fig:insert-face}).} + +\begin{figure}[ht] \begin{ccTexOnly} \begin{center} \includegraphics{Triangulation_ref/fig/insert-in-face.pdf} @@ -353,51 +382,87 @@ share the vertex \ccc{v}. The effect of insert_in_face() \end{ccHtmlOnly} +\caption{Insertion in face, $\cd=3$\label{triangulation:fig:insert-face}} +\end{figure} \ccMethod{Vertex_handle insert_in_facet(const Facet & ft);} {Inserts a vertex in the triangulation data structure by subdividing the \ccc{Facet ft}. Returns a handle to the newly created \ccc{Vertex}.} + + \ccMethod{template< class ForwardIterator > Vertex_handle insert_in_hole(ForwardIterator start, ForwardIterator end, Facet f);}{The -full cells in the range $C=$\ccc{[start, end)} are removed, thus forming a hole. +full cells in the range $C=$\ccc{[start, end)} are removed, thus +forming a hole $H$. A \ccc{Vertex} is inserted and connected to the boundary of the hole in order -to ``fill it''. A \ccc{Vertex_handle} to the new \ccc{Vertex} is returned. -\ccPrecond $C$ must be a (combinatorial) ball and not contain any vertex -all of whose incident full cells are in $C$. (This implies that -\ccVar.\ccc{current_dimension()}$\geq2$ if $|C|>1$.)\\ The boundary of -$C$ must be a (combinatorial) triangulation of the sphere -$\sphere^{d-1}$. $f$ must be on the boundary of $C$.} +to ``fill it''. A \ccc{Vertex_handle} to the new \ccc{Vertex} is returned +(see Figure~\ref{triangulation:fig:insert-hole}). +\ccPrecond +\ccc{c} belongs to $C$ and \ccc{c->neighbor(i)} +does not, with\ccc{f=(c,i)}. +$H$ the union of full cells in $C$ is simply connected and its +boundary $\partial H$ is a +combinatorial triangulation of the sphere $\sphere^{d-1}$. +All vertices of the triangulation are on $\partial H$. +} \ccGlue \ccMethod{template< class ForwardIterator, class OutputIterator > Vertex_handle insert_in_hole(ForwardIterator start, ForwardIterator end, Facet f, OutputIterator out);}{Same as above, but handles to the new full cells are appended to the \ccc{out} output iterator.} +\begin{figure}[ht] +\begin{ccTexOnly} +\begin{center} +\includegraphics{Triangulation_ref/fig/insert-in-hole.pdf} +\end{center} +\end{ccTexOnly} +\begin{ccHtmlOnly} +
+The effect of insert_in_hole() +
+\end{ccHtmlOnly} +\caption{Insertion in a hole, $\cd=2$\label{triangulation:fig:insert-hole}} +\end{figure} + \ccMethod{Vertex_handle insert_increase_dimension(Vertex_handle star);} {Transforms a triangulation of the sphere $\sphere^d$ into the triangulation of the sphere $\sphere^{d+1}$ by adding a new vertex \ccc{v}. \ccc{v} is used to triangulate one of the two half-spheres of -$\sphere^{d+1}$ ($v$ is added as $d+2^{th}$ vertex to all +$\sphere^{d+1}$ ($v$ is added as $(d+2)^{th}$ vertex to all full cells) and \ccc{star} is used to triangulate the other half-sphere -(all full cells that do not already has star as vertex are duplicated, +(all full cells that do not already have star as vertex are duplicated, and \ccc{star} replaces \ccc{v} in these full cells). The indexing of the vertices in the full cell is such that, if \ccc{f} was a full cell of maximal dimension in the initial complex, then \ccc{(f,v)}, in this order, is the corresponding full cell -in the updated triangulation. A handle to \ccc{v} is returned. +in the updated triangulation. A handle to \ccc{v} is returned +(see Figure~\ref{triangulation:fig:insert-increase-dim}). \ccPrecond\ccVar. If the current dimension is -2 (empty triangulation), then \ccc{star} -has to be ommitted, otherwise +has to be omitted, otherwise the current dimension must be strictly less than the ambient dimension and \ccc{star} must be a vertex of \ccVar.} +\begin{figure}[ht] +\begin{ccTexOnly} +\begin{center} +\includegraphics{Triangulation_ref/fig/insert-increase-dim.pdf} +\end{center} +\end{ccTexOnly} +\begin{ccHtmlOnly} +
+The effect of insert_increase_dimension() +
+\end{ccHtmlOnly} +\caption{Insertion, increasing the dimension from $\cd=1$ to $\cd=2$\label{triangulation:fig:insert-increase-dim}} +\end{figure} + \begin{ccAdvanced} -The following methods may destroy the integrity %(the ``purity'', one may say) -of the data structure. They are used internally. Use at your own risks. \ccMethod{Full_cell_handle new_full_cell();} {Adds a new full cell to \ccVar\ and returns a handle to it. The new full cell has no vertex and no neighbor yet.} @@ -418,8 +483,7 @@ j);} \ccc{cj} to \ccc{ci}.} \ccMethod{void set_current_dimension(int d);} { Forces the current dimension -of the complex to \ccc{d}. This will have weird consequences if you don't know -what you are doing. +of the complex to \ccc{d}. \ccPrecond $-1\leq d\leq$\ccc{ambient_dimension()}.} \end{ccAdvanced} @@ -430,51 +494,88 @@ what you are doing. {Reinitializes \ccVar\ to the empty complex.} \ccMethod{Vertex_handle collapse_face(const Face & f);} {Contracts the -\ccc{Face f} to a single vertex. Returns a handle to that vertex. \ccPrecond -The contracted triangulation must be valid ({i.e.}, be a triangulation of -a sphere of dimension \ccVar.\ccc{current_dimension()}).} +\ccc{Face f} to a single vertex. Returns a handle to that vertex +(see Figure~\ref{triangulation:fig:collapse-face}). +\ccPrecond +The boundary of the full cells incident to \ccc{f} +is a topological sphere of dimension +\ccVar.\ccc{current_dimension()}-1). +} + +\begin{figure}[ht] +\begin{ccTexOnly} +\begin{center} +\includegraphics{Triangulation_ref/fig/collapse-face.pdf} +\end{center} +\end{ccTexOnly} +\begin{ccHtmlOnly} +
+The effect of collapse_face() +
+\end{ccHtmlOnly} +\caption{Collapsing an edge in dimension $\cd=3$, \ccc{v} is returned\label{triangulation:fig:collapse-face}} +\end{figure} \ccMethod{void remove_decrease_dimension(Vertex_handle v, Vertex_handle star);} {This method does exactly the opposite of -\ccc{insert_increase_dimension()}. \ccPrecond Both vertices \ccc{v} and -\ccc{star} must share an edge with all vertices and the current -dimension is not -2.} +\ccc{insert_increase_dimension()}: +\ccc{v} is removed, +full cells not containing \ccc{star} are removed +full cells containing \ccc{star} but not \ccc{v} loose vertex \ccc{star} +full cells containing \ccc{star} and \ccc{v} loose vertex \ccc{v} +(see Figure~\ref{triangulation:fig:insert-increase-dim}). +\ccPrecond +All cells contains either \ccc{star} or \ccc{v}. +Edge \ccc{star-v} exists in the triangulation +and \ccc{current_dimension()!=2}. +} \begin{ccAdvanced} \ccMethod{void delete_vertex(Vertex_handle v);} -{Remove the vertex \ccc{v} from the triangulation. This does not take care of -erasing the references to \ccc{v} in other parts of the triangulation.} +{Remove the vertex \ccc{v} from the triangulation. +%This does not take care of +%erasing the references to \ccc{v} in other parts of the triangulation. +} \ccMethod{void delete_full_cell(Full_cell_handle c);} -{Remove the full cell \ccc{c} from the triangulation. This does not take care of -erasing the references to \ccc{c} in other parts of the triangulation.} +{Remove the full cell \ccc{c} from the triangulation. +%This does not take care of +%erasing the references to \ccc{c} in other parts of the triangulation. +} \ccMethod{template< typename ForwardIterator > void delete_full_cells(ForwardIterator start, ForwardIterator end);} {Remove the full cells in the range \ccc{[start,end)} from the triangulation. -This does not take care of erasing the references to these full cells in other parts of -the triangulation.} +%This does not take care of erasing the references to these full cells in other parts of +%the triangulation. +} \end{ccAdvanced} + + +\begin{ccDebug} \ccHeading{Validity check} % - - - - - - - - - - - - - - - - - - - - VALIDITY -\ccMethod{bool is_valid(bool verbose = true, int level = 0) const;} +\ccMethod{bool is_valid(bool verbose = true) const;} {Partially checks whether \ccVar\ is a triangulation. This function returns \ccc{true} if each vertex is a vertex of the full cell of which it claims to be a vertex, if the vertices of every full cell are pairwise distinct, -if the neighbor relationship is symmetric, and if neighboring full cells share +if the adjacency (neighbor) relationship is symmetric, and if adjacent full cells share exactly \ccVar.\ccc{current_dimension()} vertices and the induced orientation of these two full cells are compatible. It prints an error message if one of these conditions is violated and the \ccc{verbose} parameter is -\ccc{true}. Passing these tests does not garanty that we have a +\ccc{true}. Passing these tests does not guaranty that we have a triangulation (abstract pure complex). In particular, for example, it is not checked whether full cells that share \ccVar.\ccc{current_dimension()} vertices are neighbors in the data structure.} +\end{ccDebug} + + \ccHeading{Input/Output} % ---------------------------- I/O \ccFunction{istream & operator>>(istream & is, TriangulationDataStructure & @@ -485,16 +586,21 @@ equal to \ccVar.\ccc{ambient_dimension()}.} \ccFunction{ostream & operator<<(ostream & os, const TriangulationDataStructure & tds);} -{Writes \ccc{tds} into the stream \ccc{os}} +{Writes \ccc{tds} into the output stream \ccc{os}} -The information stored in the \ccc{iostream} is: the current dimension (which -must be \ccc{<=} \ccVar.\ccc{ambient_dimension()}), the number of vertices, -the number of full cells, the indices of the vertices of each full cell and then the -indices of the neighbors of each full cell, where the index corresponds to the -preceding list of full cells. -If the \ccc{TriangulationDataStructure} vertices and full cells contains some extra information -(i.e. geometric information) the classes \ccc{Vertex} and -\ccc{Full_cell} has to provide the relevant I/O operators. +The information stored in the \ccc{iostream} is: +\\- the current dimension (which must be \ccc{<=}\ccVar.\ccc{ambient_dimension()}), +\\- the number of vertices, +\\- for each vertex the information of that vertex, +\\- the number of full cells, +\\- for each full cell the indices of its vertices and extra information for that full cell, +\\- for each full cell the indices of its neighbors. + +The indices of vertices and full cells correspond to the order in the +file, the user cannot control it. +The classes \ccc{Vertex} and +\ccc{Full_cell} has to provide the relevant I/O operators +(possibly empty). \ccSeeAlso diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationFace.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationFace.tex index 7ff2d6d9b89..e69a454e82e 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationFace.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationFace.tex @@ -5,7 +5,7 @@ A \ccRefName\ simply describes a \ccc{k}-face \ccc{f} in a triangulation. It gives access to a handle to a full cell \ccc{c} containing the face \ccc{f} in its boundary, as well as the indices of the vertices of \ccc{f} in -\ccc{c}. It must hold that \ccc{f} is a \em{proper} face of full cell +\ccc{c}. It must hold that \ccc{f} is a {\em proper} face of full cell \ccc{c}, {i.e.}, the dimension of \ccc{f} is strictly less than the dimension of \ccc{c}. @@ -21,7 +21,7 @@ defined/used.} \ccHasModels -\ccc{Triangulation_face}. +\ccc{CGAL::Triangulation_face}. \ccCreation \ccCreationVariable{f} diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationFullCell.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationFullCell.tex index 3076940e53c..4c0ffc007fb 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationFullCell.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationFullCell.tex @@ -18,7 +18,7 @@ well as a method for constructing the center of the full cell's circumsphere. \ccHasModels -\ccc{Triangulation_full_cell} +\ccc{CGAL::Triangulation_full_cell} \ccTypes diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationTraits.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationTraits.tex index be72d58b90f..e4481889f25 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationTraits.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationTraits.tex @@ -47,7 +47,7 @@ the templated operator\\\ccc{template bool operator()(ForwardIterator start, ForwardIterator end, const Point_d & p)}.\\The operator returns \ccc{true} if and only if point \ccc{p} is contained in the affine space spanned by the points in the range \ccc{[start, -end)}. That affine space is also called the \em{affine hull} of the points +end)}. That affine space is also called the {\em affine hull} of the points in the range. \ccPrecond The $k$ points in the range must be affinely independent. @@ -141,9 +141,9 @@ const;}% \ccHasModels -\ccc{Cartesian_d},\\ +\ccc{CGAL::Cartesian_d},\\ %\ccc{Simple_cartesian_d},\\ -\ccc{????} (recommended). +\ccc{CGAL::????} (recommended). \note{The new kernel is currently under developement} \ccSeeAlso diff --git a/Triangulation/doc_tex/Triangulation_ref/TriangulationVertex.tex b/Triangulation/doc_tex/Triangulation_ref/TriangulationVertex.tex index 8fdb9d629ab..6324d86a007 100644 --- a/Triangulation/doc_tex/Triangulation_ref/TriangulationVertex.tex +++ b/Triangulation/doc_tex/Triangulation_ref/TriangulationVertex.tex @@ -17,7 +17,7 @@ an embedding of the vertex into a geometric point. \ccHasModels -\ccc{Triangulation_vertex} +\ccc{CGAL::Triangulation_vertex} \ccTypes diff --git a/Triangulation/doc_tex/Triangulation_ref/Triangulation_ds_full_cell.tex b/Triangulation/doc_tex/Triangulation_ref/Triangulation_ds_full_cell.tex index 49ede402fa0..ca819483033 100644 --- a/Triangulation/doc_tex/Triangulation_ref/Triangulation_ds_full_cell.tex +++ b/Triangulation/doc_tex/Triangulation_ref/Triangulation_ds_full_cell.tex @@ -36,7 +36,7 @@ equivalent to setting \ccc{TDSFullCellStoragePolicy} to When the second parameter is specified, its possible ``values'' are:\begin{itemize} -\item \ccc{CGAL::Default}, which is the \em{default} value. In that case, the +\item \ccc{CGAL::Default}, which is the {default} value. In that case, the policy \ccc{CGAL::TDS_full_cell_default_storage_policy} is used. \item \ccc{CGAL::TDS_full_cell_default_storage_policy}. In that case, the mirror diff --git a/Triangulation/doc_tex/Triangulation_ref/Triangulation_face.tex b/Triangulation/doc_tex/Triangulation_ref/Triangulation_face.tex index 9e511a08c6b..145aad53ff7 100644 --- a/Triangulation/doc_tex/Triangulation_ref/Triangulation_face.tex +++ b/Triangulation/doc_tex/Triangulation_ref/Triangulation_face.tex @@ -6,7 +6,7 @@ A \ccRefName\ is a model of the concept \ccc{TriangulationFace}. \ccParameters -Parameter \ccc{TriangulationDataStructure} must be a \em{very loose} model of the concept +Parameter \ccc{TriangulationDataStructure} must be a {\em very loose} model of the concept \ccc{TriangulationDataStructure} in that it must only provide the types\begin{itemize} \item \ccc{Full_cell_handle}, diff --git a/Triangulation/doc_tex/Triangulation_ref/Triangulation_full_cell.tex b/Triangulation/doc_tex/Triangulation_ref/Triangulation_full_cell.tex index 8378d23689c..96002e29d50 100644 --- a/Triangulation/doc_tex/Triangulation_ref/Triangulation_full_cell.tex +++ b/Triangulation/doc_tex/Triangulation_ref/Triangulation_full_cell.tex @@ -7,7 +7,7 @@ is used by default for representing full cells in the class \ccc{Triangulation}. A \ccRefName\ stores handles to the vertices of the cell as well as handles -to its neighboring cells. +to its adjacent cells. \ccInclude{CGAL/Triangulation_full_cell.h} diff --git a/Triangulation/doc_tex/Triangulation_ref/fig/insert-in-hole.pdf b/Triangulation/doc_tex/Triangulation_ref/fig/insert-in-hole.pdf index 3348b8082af9a62adaf5bc8c42a2976f57075601..7013a5360278a77517e71cf5db09fbaba42de29a 100644 GIT binary patch delta 3482 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 delta 3422 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 diff --git a/Triangulation/doc_tex/Triangulation_ref/fig/insert-in-hole.png b/Triangulation/doc_tex/Triangulation_ref/fig/insert-in-hole.png index 1bef5faa5824f79c47a5a301c00aac5ad2e9fdeb..08036faa365f278cc1e1b59a6b5a70c9ffbdfc1d 100644 GIT binary patch literal 25751 zcmZs@2{@E{_&2WOluBqr5>9ob5-LSv%qc}BR4Q2~$sR(8S+rOxMXAW1oCqwVLYi^#h^o5_Ne*H77bJs^+^uKw``G4LmA`(s| ziikL1PoFq;@pkuApX=>QLnJir-Or0+f1qSCWzKHi_WI33(Ia=_@0?o^@%QDNN1Hy} z^Ht8Yx{)c`viFhSDUp?Gl3m}|?tb@B^x!*>d+RzB&;Rkr&&@<6r}zj;W7=1dE&TVi zsGPsg9H;WfH);RN9o-=>7f9iBBAFzs=G9)FJfb3iI(QbJo6a)_D!EzC=<83Jbf;_wV1YOI2@ZQt&y2tVf2aD;S=89e(#L zFsbmL>Xz900(M1TszJD%UB|1Q@I+nb+O%I>qg0E;bXGamx0QvCeycF}*f zH!0ImRo9sJr3Ay%-k(;c8AT~749{2botKw-JS(P(fBt*}W~R>>d~T+{=9xyj#X6Bp z`bNNiIxGc)SfQ!p|+)KDlCUzdIw*}+5uKE34i>%6?Y z8DelwW@cuYfcq0{h7+#1ch8?5$Ml+@40=Ub4Ea1#~%*kLd@K>rH6 zfJ&7*Ks>M^mr-^9YG=4+fal4RC%@QX`Md#HX=yl$Ve3a%NLnRKP9mQ?-6!OWoU7hx zQyuy=us@IkCN8tgt5TEK?r3Xk>%|A02P?%6jzlS@Ms&?@b&RX*h(ifqU@m zd9c9^-16IZMDNYdKL(q~RaIA4*JphdR^IXLD@XRherCyS@4&!74mH^B+_`i6gXTwD z(u^{=ZX&P89^(GJVqiErA*=YKYLcE!ybKm}=YGyHd&C&g%CK8sO6i@0my64cRzK6& zw^g__fb7dWm)?G~$h94;XV(&Rk7LkMH}ej!#;&aHOB1~PA))PM2hJtrQ(7K6@Y@Sm zfNR*W6)qFxm*bnRPDmS$vU@dQ)kw4U8mnu|go1pqIjY9)-Mfznmk~SHy?t`a*#$q* zCx<<4kUPoDh(zXLpxSQ#^;4c;SKM!Q+NUa?MecZX^VZ`|Swwk};*hUKYeT{_e*TOG zllNRoKj_@LR_Z1d&0Hb*^L+AP23igNh)X2X=hI5WG%E9g7RK9qJmnuXUk3}hyEi~e zq+8}$)Ml5+4P0(flUV8C@kKRZU#i;LfT-o=dtkN!9{tBn7)zHYs2gSkLSH4!eKn|6WUThm0 z92_1VE?zdUw!L6I{}#_%oa*7FtoA#j-odJ%BTKe0{xS}1e9n!g?spP%d{A7}5N;1F zlb|BvLTX^O9IslsmgU>1Y z0_)sSk(#fv;X+=$61H9S&zCu{Fc&^5qo$OoH$ST6}IKRmQPLVQ-dNAa%x% zCM_!~tHPA)&)5B@vxPmJV1mB7dD^Kud}LTsNpX5RTqDxy15dc)adUX`d5-{i!aAv& z7Ir$`KR-XTUKEktL61LdGS@7l*w%E^eSWl{>03j?w{H!Ty*g?+z9S>as;b!OvWpbw znG|H%q@@*ZUqxK;5+-I`(=CWmUX{!^_vwhPE`&X2-w1NZSK7sZsGD^C;a8KB4v})G zqv+uI(PQ_0d{#-6v-^Mk#4=45u&X}CfCG`S4-tgPKZ=NmFvqK_rTVwTHsbGy`{|b4 zNZyZYzq3L|M|4$UFo7W8j3^OqU+!RphZ{C()AhW6Hfm?Q{j$IQOmCI&g^}WEnC(}? z>~Yz>TVN_As|^|IR>EWk?B!SGN%jmpdsMSaF2&m1W{kGT z+PxYNSbe8vBgf@hYT@bLo%0LXw)4t*AKNkWj=mHAyU_1!y-(URq%9Kttvsh)Gjc2o zf)?TrGme=wq$!39tE$(`fD9 za~E$_OE9Kqf82lg`M#8Cl9i2~-?+HOi&)A`)o4pj_CraLCn~I#>%~prN!ti_vMFwu zcRg}3RUP_PQ({HoN~V7+5{~G-Q^VMu|9~qKJKUYS-(2B%M1>J6nb90X7;fM$uA?E# zuNaH5yKP^U+0+fp*GajJjmgQ4jlnNeee27MlLd-x4-87Ng#vPtn#Q5xHPwcG()i52QRT8* z07l+pFy;jWJj5A@G>_$!l{KA0@OLuF`XW|U#hLmmu07Q|j&^S9$Pf0a4-qRpH$N0W zso+glF!iSjQ(!&NT?8IP?^~UD2#$~slR|R_8P%BEjIt5C+YBT0w?=+T6u<|75Y^eW}SD0bSRWb#*Fh<>Egx+f*x4kjihjo%QL^)f={B|s*x&U0{h3$Fco zrfj0RZTT%%TZ}b=CmJ+&8bxk-mVo`dAui5n+q3cPyXmsS9}MtK&9et#2Xsrz(s6T* z+LWcAzEl*u*8-D+p}4l@Rsg)ntnACNFlK5R8kHN9_jI-w3_yK35Q}axY?mt1>NZnMpoUDx`pl~t)^&Bomnuq zHHFL_*G@g~xHbHOM7Ux+xN12W|9F0y+S-L11`l`g*oxR2!wqqo)mNKSgq7D%I}YhG z-&+>=Pi3SC29#28ENU>EPPDKqo2H1JA8#*V+F=)_DtbJ1r%QW0@!VTe-5J!E7W%WF zUs}K$WidDbCl`TjnXOX6w`=4w5?Lc?3kaR+HdkP3$?X0yFddyPFiT5%FRDSX;)cWt z{o-?5Ql%!U&y!M!SLmP?ptzLt&>~pF8*L;O5!6#suhX;=+9G%Pq zNQj;MKqp`)TheOptUv`#mJYxYln%f>jup`Cl!BKT;V^VM&}`;99XOn~Z#f+7bYSx_ z>@=qy1N$>%O+Y_qraDS5+GgR9j^N?FLR?hEJ-97!4<59l9jabWjh=SOKw9-T=eI@BrzOm=<<7CwF~ z;8z5g8Bg?+tV;?DJ^S30IFY(C8svefB{5`>Hvrg@uOIe5V7E%*{Zz2mg6~{Z;qB zSRcBqgsbsaeB_))jwklyE636W{u!n)lz3WNLWVLG^l^o4MVMtN6PJNyGjS@oN)FQw zZ?DniMerR>eZK37oTg{*B@2%(hY!0?xo_g04vP^@eQ-XDI*JxIR+rs(8#z-rAzzzr zQFN$>Xxwja$T!Jmp!NxH=y z%Sa)Y)yl410XWs;q+9f%VTOLu&iTfY!GjH7L%Yf@Wy|clQsmZ^U#n;<>XfC>de=Tb(T?15-l9`H8NV2*3&T)sM1<uB@gy z{s!oa(k80w=0j3K)Uc&yc54YENpHdGB4W(nE=Jc!p#?wg$H$xLcjeg+)Z`5w)GV+r zdH=qjB%GiGEx0X3*AHLD5;Qno&JFM0y*e<^VT~bhihE?#VFHTW6UKQpTUYj!c+tru zl^uUsdET^s_We8L>!m;LA&_~Fs)Pb)UsZ)b)G*;0$({27{gxLlTsY`#+G^419;X~@ zuVmY4Zo$irQAhBeI=?U7r&ihS%K9Z#6=(!Y2vwO|q!+qK>rD}O0PhW~Xw7lAW&k{yxg`lsXi&|_Q z%3M=-kvmO)7H;!Yo1G75IDtuG*T{o=n8*e9kU>qxE{?SpIFB@;uv+af0ltlg&GZ8s z57)<#c+>fgQD{PwP88aXrW!nR-`b1+Ny_vHBhi<|$}Jm?vGy!`%W2BWG5Tcsn|LTk z>}dPQAISgN`gKp6q)&()GIW_SWKPC%|jlm0b5?o|m1D+E87>Fbn9bbX?n{j-1gqGTBYDRXzu$sc*8}AZ5xn=l6fsShpqgQ`&v0riO-w z%CU50g5UFr+hXpqC*g79x@O|WYxb3`&ESo zB<=`1T0%)5&z)iPc+m?+JS$9+j(YX?mSvJ7{im$VH=h-tcC%J|*vMH@`tn5?3@r>q zQo^s#%D}b@Lc_=IOX&|jHIU>qdZnAC=<{D%*aeNfjXho{zVf_QK;4icc9J55fy8En zGf4r}u{Onz$6Bd6&fNL)Y15>Dws&f}$9+0=f805CU-HOb8q5ysIo4L+%Zyjr^xhJt z7h!I`Rn;Qbri^Bn<9^;TKPKv)V)q5*vZSCZN0Vb?fxeROkPHcqoolKG766m?BVo54 z_}~(95rH3zA@djE5On;lQP$AV>rQNFz%P!qxu)Q)gs|T`W;mqluo}E+){sG1FP8aq zyQ3pOkZyPEbQcNBp3Wr42NQ?Vu6E|l)W{=b65LWumYL|G#ILo&oq8WbjYcY_%jcSO znah&}z*0>XKwM@)aK7<%!%_dq?jncUTwCnIcz2O&tc_Mllzz}e4h*wjUFhLEm94DWVj_pztEgcF#gqp102wLy`gRpgS2d@j3Iddaa zsg%>;B4ReIEx|2zaTikX#bpuu4LTDJjV%qRn2h)FK5qhItUE9E#`4nR#~1-?y299a z)5DH)b9u8{l~z{oYc*182XZB3C^VCtp3_&S617doXE0jX3{AQ{%VP#F!w?=C8*Ae; z-vYz;(_)IZzn{*`^6QfE=vubR2QDr%a3W`CROMU~3`}xHO0u>_*?DYF`_k^)LoY+Y zc+&~V$;o!YWdA$G#=s1nQZL!>()?h@QCWphxOKyS>N)3{hKQ8$%UoP_U5*&)yyp`14<{* zIa$Xa@XT`+A(uuGEWA5!X_;o2b7fY*Q@y-Aq@jeHiKX0{=*ToL@l;7{PODv`vQCNc z<8F1hS5p1q3EC2DzJ#84q$#)Cn=2=fPoK!mh7doVP3-7h`QYW(TFUu~-YP$ut@jsc zi{wS2$1~Zh-Qg;fvmy0=jQlG>$Jfg zNB>Ke4Z;wvV|aLR3fp!*g;4H4#a$4Wh4iEWINyTkzKZNXlHLhy>wuZ`7Huh{Iw48)_TAJl>EbIb@US^WN#hCM^KM?Rp z9-!W9?kNiOQCy9XOjX5iv=si zVYry$wfF7b$(4iYF{Tk;O?TdSbEC>6X#S1W{pJfu6>aLVJ0fz-(SXXc-%X1o( zvmWyvb%s+pMz?JsAB3p74$r8vx!{ssi4bVn7A3`oRBv$!`Ksi1Wxnu^y>3$fgzQZ! zD+}NDok%bBHc~=)_F6hSIwtvD<{R0Sc=EY^6OSS=L7AmXZ)5ujytlE%$tP2J)7BRY znPl^f;bGIH?rq8*k^0=+ib(x(FM6w~{GoSc@{AOm ze;h(RixO_=elNB41-NAFZ-&p0bWpEcLZO?8aT@-3cc5ly@KE}IO^?q+PFGh+Keyc? zC0NjI;ZOs~meW}`+0x=L!zs1Q#Q`fHsk-JJdXv=iVX2NGUlNhTTuu%Ul@(a<>C|RD zepYsqj`RGeO7fABM3v;u{C9w#BV>W@uPW5D>bW&~b37BzO$>57 z;?!fidFwE{Bc~_NzOTHi!01UlszQfs?C#Rme^ASFUCxQM;^N{MYz}autT<D0by^If|_}*AT7*d3oLo z?|QODJ$5|vQg(9CIIBKNXP8x=z^n*~tL`UN+#2iSRn9>mIC`j^);C|(w{xFRGGOAZ z@vnO&{;^thWiRT^mAIjvtk5rsU0ph0{}H5-T}|vHzx;b zio*VCE1WKM`1(|LdTG9OVFJyc{~0kt1@553|A|NTd2F>ZI#lD-ia>jmh(PaIV8KTtR<%#+vRHS@u3}_dItZC2*KK z0q!p?svoBrcz$$G#=GUxC!4$cDx_2p?J1?hSX_nIHp#cP#LoEd8azEqPTx;6VYPTr?!k;4bi{1K8cF8boL6vz@h3)H*pdxr|CVtg+T(nveB! zop{pyTshWhjqTCub#?}1t>ug1JJh#oA@#B13oBRJTNnUnY4-~5IV3G9g|5W1QH!H} zJR|gYyL52wHJQA1)x5v_y$n3@H}14jJXA+oWglly|FQGL3iRkf$tVx{=X4h zSjy?1wb;7uptQvrz1)@dDVTRC`ItND-1uvo;!C&rU-1Vsh`C2&2D4YOfezOpEYH>o zf67YinfP89tr|)eaOr|Y?gYfh*;*ys&0cSCtG(W-7e*o59{2lx8fsFI6HRq&8`*#T zYoV(_7~rb_G9aSoDv%Q8KQXL|rin@|H+o6x^*brF%>wDE;A&qyjhO8eS_*D zGbtsSv^WOmUGrELbK~~ixb=&d-@nog`0_}Vh+~AR5_@}#Co`qD7D37|5M^;m&2G8F z+KcoOSmAdy=v?K3$^xAbv7do+-{3qO*wWLF`s|+Y;V+>1V~(*eW0DC$uC8vf*2RNw znrBFnM}9`?Mjp9V7yZE@cHiks;*W|u-;uVzwcM)Sa21?2*d+_ZGPqok_!=z=fQn$? zXwtcdT-Mkh7-bAbj~jx4i+c^44VRda=4nyoH^OWbKF_GAZ;ZxAEt%T9EB zlnx95eMQExwgEXpcg*e7e+NTlkKcg8W;hU$E?)!osgWl0zklCk3bi0cNIALwKhj7- z$I7QuUe~`V@q+_+gsuYP*z{#>7XpM)Sh=YZm-F7UZ%)FBn(9tf`ZD`-O1L(+Z4&k~ zz8h__nw&}QC{~-~HU28!rD%Cf_m=qv^yKVu zubwWUOA%)7D^~KISx1Tb6Hqt&H>7{d42AJiIyuiAWYv`t^qf zphJ#RNqqrOK{fN5R`iUu)pBc-bFQ5KUax_kJ8K|g*pFvF*bqRswb09UU&Z`xtm{`k z|Gmc(xPqzT?%;&VLxlpSzVGl#*@nb2pP|Y?Rf|Xkps+eWBvecgi`G2pPQfo~Qv#>U zl#Tl#=P0qVo(oe`Z9JZJsPdulKvIw!oh-WQM#WUP5@F#|{fqssj~i__2XTfVJ0Ni8 z$E2lOGgOpD2A@OX|J*G3pyS}zJ?0m%Cvzz0u`E0K@-oygqmqw!yN{h&o977W{_!h& z1NaLFZEUY|x&BWimD4Y^AS(EG`cgegP`pVV6V00}x8pQume7GqwmdnqB|D zrvn3vVliQkZx%GvCF=izv&Wr>r5b&sl3Y6ardV+?x~R!;>dBtQF>_-xreW7U|!XVdmlJal;l6&>79{OMGw=dE{`<-#TVq!q>Q9~wLS z9qU)N(6Py^aww*_#|pJYAIF_%RLiQr&$24b%ca=_jkOqIf?VAnl%}5N>5TlnaU_}d zO%)jF7Nbm5N}e^75pE3e5P>bMtCt*Ud(O0xreL*7DDh0TfwM7exLAyawQ~dtC zPwQG~&f2xCIVeNCiBJsIlQ!OM&?$Zr(}W5bZt$h%sD^pOt*4Gl-7dl?>3e29N-Kg# zG5Z_RnowD*UCY`Y$|$SvrQS$F$s}7NeA*e*+eKV%CF`-K;S;N}{P&YXu_IJ8yO%SU zK(svGx>lE86BW!In;iiEI#2^Oj-L^L+`0QRTU1m}(Zu&50nbba26Mcj(5|ySHU;f| znIL#1%_NmvJGt8Dzr1{-oo}lN6&28GBBhsiYfMxsF`(Z*JSo6#sb_Gv{Ljm~(+@g+ zQxYC={05bT%DL$ZrJ&JdtYXk8ik*mKq1c5D(xK6sP@S79cJDY8khYjd3ut(Sq!DnD zwzjr~tIVC6O`IKV+lm&dY)lN!+yUH(fIc=Q1yXy(Z>9g$sC<6K$0JogK7}iGR|M2X zLKv!7&qzEN$l8-}h+eUws()t`9GIO^;3TwrXVR1odvuCNk4(5_yY~|XkJ660n9(ni zRwPuMuQ(IrVZkEPb(#Cr)YLp8Q=Zm9gefdkw>8zx31FI=c}QUUqd{Er-cr_Pra{w- z3~mh1^PlJ_VG@H;F3rSX+X|{(=N^kIM}i6Vj0lZLxw)Sa5;}wj!DeWFjXVs?b8yx2 zTwEM>8mPHm-#cop@9_PV2!lM9UR5>Ilm7azUW537M#B%%UQjFBZxMkCWPcS zfhb87ae07vuLB1PL4OHKWe8KirR>!km6ZX7jQ2Ix_fIzq*K?|z)6bs%d$C(l$5SW=TkSItjaTD%k23}+lR z@k@pvizG~sXL34g2Q&B=&jI-yoU zJNVP!&o78D%1jTD-=X=gK%RdJlV}HvwX>pAPrnicrUePsexDy`QUO&AQY3uw3cBe~ zOPC^K5s6k<`jnUwZZy?soA+F!tld&Q#(yH_WqXeGNK;>h_7|JWoutK&q9aM{kD>CtAJ0Z20ZBFc}CEjS*QL}z=mzh2zr0%(x#8z$3=GViL*dhr0^#{)NXBkhtkX4)A-##6in9j$K9ir5BA6e|YcTX)rbluz|fIPM6e(%~jDuoRy%mnP8So{jBHSpDdKoP3DFnPa`|kuvAw-BU-^2IK6bQuyTRog zs{*Glk3Kjk1>+_=8u2xetL;rwIG z_+Y2QxLV7C%eje%C)gBB8H-J!dr|rVU|4VC>kBBcQEqo{zTwoF0+D|oeWitk8rIp1 znYvUrFLejmYoC08vp?o!V8}NRDV?oBB!Po2vOhodcv(QQ26b!e%N@!(lL|LKzCI?l z?P+YlL{4C!8e5}9E7WjG3UzC`EJ}|Rj^1a<`WdlM>l5XEV2z2*aHFb*hK7_M9^#d? z`XLW$BWmy|fo~Y4Ki}MvrcpNdE=^FPH5{`>cRrUQ=yE1f2(h-sJ%F{3$5y6yYag*c zZrK&G2E3?%McKQTND1DH=I0a5Vl#m z9W7Q`_N4oz(~47S&xj^#BXkTLo0<=2XMR%)A>pF*k2=&mmV?p`kf|!#e;bDFU+*uX z=+~z0{C%c*ONdcPssV4IzG2&uo4uupiQHJnu)KgC4^gpxe`})MeKGd9@}x&@bo6u6 z_=9gPi1I?L~%|NH_Jr`>X!`ACYe%{&v&9*-B@ zroa4A6b}FB8(`H(-*jW7{WU!)cxrOR)Mbk_|F@PRR-*8rTXhb?e0#BfY0MJ*buQm7 zW%dR_v7gR|a6nB#qj6+GXp)KQArB?(X()*5i~yz6Sh4i88#QsfvtlU5A&N8<(@zRt z2aHlJI$4iXi}sxMjWFXs=|<&#$wv_IT$xZ^lCQ?G&X2Pp2xst~I zT`xh_O8Ob`$(kq806gBkd$)UEty{NYodlCY>je(|k!o(~&j3oo!J*uWT$2BnNA5(E z{yy#h#inncJZ$GW*7@P#XBq|$v40P2%`*j`GhEsHVyD#i^;jmTGU5;aM~)X^o>v+$ zKZ;h|(wX^K_dHxGMX&6D?)=u=!$#!p<69&{te6Os z1H}m?!TK03v%)JVD2V%;`vL@*smv;pt9ugNbIpUKrg`o2d836X9wS^{n>^PfHH>7yq&2pEuAsO{w8w`Rc|o?`7|U#h>PU&%+m|bUso9e$`2t9#9*w>cS)#D#f5E;bRwP_1?Ul}Vns{`_7XLi)7R5coy#7E@3X z#7@o*Cn(|PhZ8JpS|~zki$mnk#tx6S9B`<4umPe7RUc#zG}E%;Ym1XmQw6mdl`#0M zfGWwixX)!Oc6HGwxu$|GcZTy2jks`MTL+IvM>OTrB<;?^jH&7-0TffbPWaZdv zfJ8Lg!i$jYxOIn~Kt?teN;)AGMy-lyy&z1WBO=j$*U;4=>lFw#BcoLU4w8SikeeBykj&b zCn~t(Dk+uRae2>Dc0UpWj`HVQ&4Nc$5hZVaKI96kv3Jbz=^};hDy+i~&u!ig73i!m z6TiV?Yipt)yr5cAcleb}0I;HXzXA4iunG)r_jXK<~0 zlFO^?Snf?nb|Ny?uTMdFJlXted%Lqj#{R3D!yd)&T~cQ9NWTTV>420D9s`zlg!K2eHjZp+fF zj?O@B#`xAA&p~l}W>$7Gj+K?|SvlK}%{aTpUW0QOsjYz+yh=^RXW5X^^7I zVV-g9{#tP{$@i21r8=jk${+XQG->ZG^M2%%q?-l*d>A-4zW0wpPg}qu?aiqOD!g|uLORrjJ$0{s{PF3& zSVjgL(f2>_f1+_kI_!;)Ptc;?k2`^LP^;>%ye~Q4z3}?Jm7rTpGV!3}kB_dcKE4?y z*_5%s2}oCogiCgUYz&_jtE^1ndralYhLk~(+Z0N*z|4~<6p>;@m<`t~qmn_xx}1z+ zyD3}$?cIK(d3~VppizXcp}j-_Hv{rM!tDqCjkYF-5>FpHMi7*ZM9P=Aw3K>-%59>f z%-4iABghYekd#n3!*>hv1n!u z$wUWqLA@7bj)8ga-hYNnYax7P4 zRW0-dOW$6mj@VU;mX(oXHv7|uekHp^J5nIizmqM$*S8qADRw`0@$)8VT$=6m1x6}C zc2!uFVjnl4>+N`-q}n!9J#Qjum6RvvWOCBcCrWf^%326n)83vLB)0WheU;sM|CJbD z69QN%_FrfPDYn~zDd@~MDv5D@(fexS>P!MgNUD}%_T!^alDaqA-Wfs^BEvC=#<{JS45l8au6Y_+zlmy zZ@EVr)-_uEky^CIBB)00zL?au+p}NhhHY`)F6B?h=eqUkV;Yl5NYyC^1O5p1CR0F( zxM-1Mm3Os0OCKL5#ca)B(ENHlY87<@S^hov*)Ng0;6tlI#bvdIRon(@kX9IQcVEAL zU5&0A8#{0@(xdTrQy7$SlnM;w!#HzDVU_sMdsYGU#Gqn5~6(bUA|$ z9EeicXf3mNZ*c8LVwl7sD(AK#ayxi(*EsRJ{Jo66he_f-~1S`t9b6a^Xz_Iw~Gc%jNA$zpXss;gK$W4 z?8CzqgNEb4n`Fs#@28cxnj^xCw#;E}yalWOmz=-1x7*MBIh!A*wJt$7!rDTmq0b-D z9D!q163m37Z`9fPXCmwnPjX9h*<7s>GrykCPVxB$V2mBm8$f^a2G7P1Jh^vIyZ_We zdx<-nV(-B24`XZfNVPL`fHi*n-)f0ArNa0QNZ~PpCSCh<^?m9d zr>Gx+F4@nRt*x&0OPY$%XnHjZ$)klb)P72G%ejnjs!m4XArzlShiLde^tEkdf*wsa z{@D%7ha0x4Pd3BZ0ox0tpqiSAdLVsfm%4Sw8qIbKx=+;(DiD^MbE9dX@=Z*{2!obp zM5VUrSL%>y)?V#xl?xqX8R+@uu?!8XTa3^MnYWAG2A%SHx4R2J-7o1Y_8n312Qdj+ z$a!fIzgW>Jz3!=1PdfL{pR$Ax${WE2zqJ(ZMEc)Oe0uZ=yg6U6eph@_yf)exH3$`_ZfKZpQtp?%U*5jO*R zUhH(~faH`A5DA^y`Qrm7kL*UFZT5^KC{(MtGhDHfp-N$O{U1 z^3Z09$fJn%r*^AOdSAYsw$F9wP@5hBX$fZ}1r&!!4<8&NO^sx7Ve+-<(Oy)yK+Oz!T_lx~xc_t%e9 z)%rEA=~m(&>>xTgfK#zI@&^{+4XbalaWH>Ya%Hv2@V6=C_zGW37;J-{8hqT zAvQnOnnC3*AiQJhCMTA9Mfy}o*}~VxsUG&bH2+RUwG?F`=RbXlYZT?`u}kguR>s;K zbZ%0P-DmAT_O?EzX!)=@MlfAbA1fsf`D30vsAPQxA8gR3Lqgx0q0MHSBu^BmZh5U7 zH{^cazJ>|e&aXbyrX*nMm;^TPRzslHT+=cgV~t2RQDmdSz&WHJS7(yMbwdKJ%i=kj zMQB%3#dH?Y$JN$*Hs0N{Y$(QBMuWfz%}7z#pbW*ZSg8goXSWYzkRF!bjb2CAmS(9GDP>;vRh%D$VdT$y4zyItj?chGu42_nZb0=3Me1iheO#2vNJdM|C+J-B{#B{u^pDKX^#+!oj zMB91DYM|+E>-Nc{+duJa7@lq~E8A&Qe6~}($_7*F6<($4_A}YZ1Q8OjmhF1F6D+J*INO=;#t7X4d?@rFFqLFHI>_bI zeF)AbOm%Y!`qi(zZJB4UjQdxuiHjp)qqYUstL-%Eh%_@%o*WY24$Uy<)3^)nUn{S@ zs>Ke+^>_sj$DJ#6%t$)w4++priG9<4&XJcdAD(b@bRAQU{d*%+`=Q&IfVE96aZC&x z)*hn4X3|ex^ePR99-YL=omh-Uz1oEW~S#x z0g^uO3Q}wX`uu3^Lhk;JICdZ6O}DFuz1||w!lg5OWp^4uxFyoTpXJws?iIfXF&FQj zMUM(wYwy+Zz8>kq37(ArDat}e$NI%+*P`CSD&hS4#j2$3lW}JWCbpu6ervWj<9@{G za7Wc`%LAa>Oc6zxPn#X^^{I*SYG~PYcDHK6e*3O`kR23HvMK0^_jDnd)1((d%FYd9 z)n(_F&(>g>NeAB^2DP&PO3}h~&xj90Ym3$|9*>Jj@Z_?2@0)Zrkl2HCb!lpr+&FJD z#re4ZjgkN*Ce;MrT;PG4yK8Uf*%+_ge|z8wv|^Nc57f+X%4Phu!u9dxw?LWQ{JN^@ zuIL0Yq-$$KV&JEhn$EeF1y?^=d-V}`OoFzr(?st`X1kC18r2mnq^>aMRf+U;Zkl-1 zoS=L4qID@Ygt=6UMjDfw;$K3Er*7`8+Aut=h{jg zb*Yb(`Tz5xjowY$C#7YYQZQGpT)aicx26{rLo&9}#?cXcW9lFK|C!ssi9h=;L-vsw z;=wj=ZbJ`ju;a8CAt=S~OO@JlJ*A}#^d-0n_#y$g=2D zdv?Gtt4#mS@DA4DyXF29?ZQj;{<*m*oyP5nnALZq^y6W&7#RJ)6BM;YZjTLcS$-Gk zWJsZM5Q*4th1>ISO|Iep&61>0^N8xbhg)s;x}7zArawn^@kgj-WLTwFqxRK{v_SYC zh#N_Bce}cP9ix> z{g?Y#bbkb$_qdS$gy!(uMFzoZZrEWEzL6`x9Rw~ z2?b+ge4h65>g_D33Kp7Mb)S?49neYH!-Dtf{8^ywQOgblm3i#vQ|HSIy zT5HsTcL9W$1g*JONuMkRdiv6$AmhGi?@P&+z+A^tQHaM#y=gj{w#6+s*9KuREGsw_ ztO<#hO!Ew&0(I~I{8%Lmps|OnQQF|3|C&gliv17 zQMTCB{$KPw?OUSd?EIzF5x7Y=}igNjG?eT|IFWUqT zRfSsEbw$(p|L=??GEX+fMt|ulQt+&Kg6Q4=SzwShup&|G{QVf&M-y!VZ3WF;P^Dlt z=?eK*jUK$f;LZbunAYwy=b9vHSX8v&R_&*=&_>1sKI!EQL|?I0EVJ9sS00 z_civKy_u<>AEZLOqcghc^gqW8OBi$1*l&*B+xTg|&fvK6wL7M0pG+QE3@17qI^2mSr~ zSlf;kT0ldKwHH+Stv%&_mvM-~?5&$P$NwkO22j9YRd?B% z;p*MDv#5^7A>(e_--mgy85@MJ91y1s&2^A4SEmVQ7|0*pZW{9O>A0`32H@i7O;8T6 z694iAewlDC@m>a{HA?dA7-&8&;_|F1!l%j2tK-{BGP33@3On6;?~l+S?k8*2ySN z8>~nG{s{0!P9;*WFAo67f#>DbtM1eELEuHl| z1(6AdbU_^$7>rN%c1DiUDZ#?^%j5AA;!<7iGyzZ7V9R~4r9Uc%U5d7SiwUt!PrY5& zp(EA2^-*cz;|@y25pBR!X_1hpOQDxLN}Q;Qhus!IHK%j)$BR9pVjye;i3Iax>@!08Kfz=IZ>&zDg7*3XLP(*u0{xH=7Zx1@)arW(%)M(;rXfz zdO8aJ%=Oc{uc)`wY=C78`q|J?VH{hd!8&^hK=S)j4{)h}8XNdqg}sId{R^w5*Y6_dRaGErJX}M*K+|E5nKRTDVSoS6AEe<@pR~G5Z7=$}bpxfp_@-LwpHc z@4(HZ8bDENwE5G0Utef4bYG3FtIB$6>%T@x+kfDG>JIoaoOaaiLQ_WUxmTjI#=DCe zUsnqfH<^C@KkZ$8IF#ucM{Au{K2o-#W~iiS7{lZ%9}OC1Te6~K#F;X}q?wSihx&s`h6Qe2<<1iFK1{usFLT{&WPJ3g$@VL@;$a7tRVACfxFPb1 z{=?fubUqL)-v%s%B5D?0oQhV|&wX)XX2^C1YJ(pj?O^#wz36afo$Bv!KQ#)aM>%Pd zs-p#4?eXJ0Yje{H_Em-k+9LS*HAtFYo%L$0#gvysDeD?3Y0d>N^KDocxs_`l@;rI@ zU{gTM_@gX<+(a$~(3c|_p=3YF#h;nK2He=)*dA3v(qLOY@CV{P7U;}De8n3c4d{8X zo-kYYI+qh4^#0K;X8ZzR;4n@Meg@;Au8zrrUV3=ROi}t9yd|%;}20r z$W=AwoCtu!Nh~%6M1} zHY_?ht5>fzQmT&Hh~6J^;pYhzwBRmvxQ)jgpz}E7lbFfau}W%1G!mop@uPS7#~T-b z)3v^BAVybf=e-QIjx6_Uv~LA<7Am3LD>uqs^ij#)$v(SGMWf(1X(8L4wI@?D_2=rb zDsX;My|sdTi$hgRAXM$x*Hac2aY~uV$wkYy?q<_JZO^ckM6hu{X-mb#|<@IfQ>*YCoL}Ut(TM( zC)YDnBjVg0@*#Z$S~Y%HvO-(2(`6`0N<1jg-aWIRev zh{St;=_Va*y=>;x^V07h#6t?jN0_fc@kM|DH@Cdfbo8BXYf6Erm+n&85ZPWuNnHbM zt-5XG2#2Ts@>mBV@7X!iQ$>lFWOD93V5lLGUCrxUM23x&S^~jPVbS^Xm|Nq^HH|Yg zbOPsR-+}uV%ldsGK%pZt&E$eu!)65Jlh%PUCZ~41Aie>qBNsPKO-NbGTC)SH0manD zXOcE`nzkBR3}p$MpF9&BjxcyS4WvI1e%ZibK?EiOTmBhFlZizilnsy@0{QsEGTRA3 zA+OC=JQm%ouY#IwF_iHVk1rwh0f0^yHXxQBaBw#4x-PPXo+=2he3P5|f}0O#E28mlP8Y?ib=M~1K!h@|j7wb`somj0i%h*5UF^3r&UT1}c!n;#tpdzFn(Grm8S7Vhx6QgdzQ9x)E2mrLJLSfKj_^lD0@6V2?Jpz#&Ymz(4Hd zf=hvebY6W!^^2gqFi6mV*R^tTQ8>AB?v->U>T5!49_~8yFK$k*fugkSI}UxcAO^n5 zUL8-{igIehWyuU!cL4oE*6)U91c2zX-cVC8**jfVM~VAR4UEyN7$;F?9#V`}?| zxu!RuM+Z?CJioC|2K50h2NHuH5%sF~81>bXl}OCnZQ#hIUTE^L4k3j7>uW0b%=(Sf zjSNYO5{9hrUHVkH+F9n9H+}yEk|0Bci}aZ?nA~A%qrJe48@HuvxW76@Y+d&r-1-u_ z-;zo$T={M<+1_Z$`>wSwMbpzyHsTc%GB!oPa7w%H6+k3u|1|BC&+}rb9xD*VI|%F+ z?FhT-$P{}C z8!YK|SALH4xc3+(+wCZ%6WHUQ?~P$L&`C4xny3jvVWLQs{if_#40mz;;MARcSw>d_8| Y>h0XAS8LjYOjX$9@}+YH;V+550x$P82mk;8 literal 36961 zcmbTeby(Eh7d?vlDzEYa2BD;q(jwg=0!m9WloHZ4bgPI6NOz-@#L%58(k(G`_rL%H zGegeYGy47Ad!PH~-Oq!gBQl>8d!Mz}TE|cgHAT`JG&hKdh)7>Nf2K)9bXkjt=!(+K z%itXs`nR;;<+}5816T0+{Lhy{kDWB(O%G>TtN-)eL_{G&Wkf`8iC#RD)%Kd+o%8nV z-#En|Om2xO#ZJg_uqD=tCf=L=@Rf!0-y*i6qK5;Ml&oUkFyCyiVQ36YjSh&=QsBBJ_0sAI>g zM|c1GxI+kgnBqU*jdxI&OdfQ-vJeY4e?;{533x;|apM|W@eDPqstP#qKew3}7v(D| z=z=a0eQUP}3l9&En;wHiU47dmI(gkIhAt>Hj1a%Ky$U|dD%mS45TaKJHc>`Obbnto zL#<%+9u*<-#}Cx*1@+rO^FMl%cGEWby`}D9VbK}1fTHH%vDQiPggDwRW{c}#(W?As zkgsjknS|RvI$>ruKu(GhQY@)9P{kUH>)0+Tho{cdFU3~di z!sCRfOj!lY@_Gq3n8jp~A+rj7)S-20lgI7VTE`YzHcJ}EvFBh?r$(<3c?ErF;W5HI#N{F;(lbq5onh`L3n@B zDa=-i=!yU16RA_{Jf#FqRyMU%L7P~*k3Bro7YNe>5YHrt-pX*9;u!JAT{8KqY100u zM{(@*WFgFTV5%%C^tqo&JmCV1hgD%pcbjp&z`_h=K@gM8`r~mI9!+z+UB}H{5}=CM07(O{@5I~H&Yk%{{4Fk-Z-rC zw>WQ@QbLhVv2Kg=(%D`c9v3AOaJE~wz^39wctI|-1%gkh2@obif<(gJTcQyjL!f;M zJMU5DgB|qX0by%bhH)@5;}eI*w|;_qaU_spbTUfa}-kcK#tc7ul1q_oaXFln_5hazHZi+f4-O?HE-sad2?FNE9-x z3H$u{Go4hbH|g;081hTs7nst|EYf3QUV@mZv$C|blsaBCg$p)$41jEqIsR@hoF?K} zJ!M}zIoWhDl%Zrz^!EF*%&kFxO{fY6D}Bbz%*>nvU27wQmL8^lc*1e;v-uifO9XJT zvI+?a)wm4#grJOm>o)hv-m?(rC>f?^qKSV1-Pb)9|DAh?EsC_D0H&TSADRzo7M)sGO= zjEszY52~z378e&^rDR&Ry(CMuy_g24O;o?#$cRGD$YxqOd+wqE6iO&U2g{nBouJ$$ z!{46Cfdc#_tmgbcQDZpkPQqT-{Rdi?3rae`rk*nl4h?-%HC2K}{6qBbf4>Ev7Jc^F zi+wt8v>{|L5wCpbaaoUx)-vNF853hP-{Yz7UjnxA!f|G5l~iYg5>(+GO#X4g_Rm#S zRbje3+#taGgKdW3zf5$lXO!M!@mMw88ssY^iuK{9%t}_j-Nw*@@kD&E9<1x%V?HG6 z(g{ znhfTD@fEvs)~aSxyxR4Wa`x$3A#jY?6wp#y5)L0zQ~z;`$0-)eaG%eazx>IGy3=$! zAd>QpSCvMnQ{WZ~h~KQj!orE(q*w37kk?y5sgYfbpvY@6Wlb>m@^OeU`zCaR6&ld; zfGlNUd4_li>KG~nEI#YubghE{h_zmjRG`R06<jG227D!#qDx2Edo_Iys*=DgfK1ymOyduwoPzN>82ZxN3nCql-0 ztA33vI`eICaj-lZQ6wz*SP+%V-b792}k!W_x4s#9H?M#v$JKwYq~S)o^XSOci-Mb`?P33 z%y{$zoMdb&k3ia{z|Xx6wAO1b&MrLHgYn?O@j)e+LhX_ct;@yh1>nftaw||ffqx_V zj%DfWW-`X(`t3Zg>JF$gG0rNkUV*aeHCobFXVb4Y>)}if;|gyPeW0+rC&bCm&tGvr z%dp3AUP$KR0q$zkeuy^}?sGTss!~`@cWTyj(zH}Z26$CdhC$>(j-4J}(k9wxfSd6^ zHRTYuu6|4h|Io@HZrQ?_IEMU~C*f%C$1xyCN0LyCPA#08D8p7LkCD3i>4jzU4RSi>0zDC~4_CM>hB{zsEzE zoqN>qDyzQ4moIq?ZKb}xj|9)g7*=zf`R5;0wsAffrtRXhv^@$5%BZ|HTVh~gQT4{f zg-y$7wrWU0Ug~UTx<+_rx@J0(^sSPGNsfNFQ$4R;t)suENt~ssQ@?a&d`e=zzrgkD zbv%$~@-@~6=Z6&)Lo%kty88MsNU@$FtXR)ZLKtKRUao@5p~r=pBf_}3zK*xcZoEjg zQ^rb7^LM(KxUqh+8g@ic7oo^V%3%MPlwrr&!cvUx%C%n|q<0tlUS84wr8*Gr>+J0O zr~~3RRI_fi(n)|-^Tj6|@jG@bztIV&z}DLbc?UmTCnwad27_bpg=u} zfu2#ur+SP6z4k5oP7HaremG-~!QtU4Iy*c2{?NpEd}GGEv_10*9XL{6uRag;KEqgA z?933b3Ja^lLS|~Cf73`e<7*;G^#FV_$f+rn3aY^Sdh%d>dRwy!5{2?Uh1W4>0T{sV z1dcC<6V%BePvXfTIel-psM|wcLJY#o_;A!rj87`4WD=@`Q>*>D0|$n#kv0nn^_sV$ z!g`K+xo#iwntF)ynbyt-Jl?^O%cv-w?#qdN0Pv9Hi6w>IfjT&+W-ku42h_#dmm~62 zQs5uS)t}#$o^>~wX%u3$L`*o$Xlm9vn4261K9i=f)+}M=>H{Yy*ljh)G zlHR`sVuost!%UnWZK4U;{^bkQ$aU#yxaHE*l+QH*l$X9mnen{)StTSxdJTa1Hoqx> zr29tUW!=q~jWh6M9_uwvo~_DVVhy>o`s8Ye$z^36n21Zs7XWTKS~+&;r4R1d7r3HU zfBou-YiI$P{BYv-CzR=-)@A*G^_tnRvToGcSYc?WR>AGV%X(k_bUm($h}T4|Y;`|# z#p;j3M}3}kmr-&N&Q7 zTMMhF>*uRDJEuIpLfqLwO4sc#i7xL8xvZ#`*Qfd@tmfOVi`1;rGp7dQ)Pmz1Z=c9k zQ0dIs4GeuG1vO5(ZoZ1bl%xBT-$UnIeUhYUowb00p>!?g4n3lOn8Io({t>eaST~yJ zpDKE{%ypA)=h-Eu4v0de%Jb*XqcIDRsDE2sk?G)g?9Z?R2O$CuFpgo>8y-lt^~+Kt zYisMxJY~I7qsD4~U&u6O*Z-`u1HG#(@_-1Zjx@a&Q32xiwfZ(aXRt&+h@shVut#m- zrN&JjyEHZhHSjGo=vDqI4*asmI|RW(^*@y$M`;41SMTa_y%eHMZkLFIP@BBs~0Z-UfT| zxA`DZ^h78oRXa2DmF4ASizIc#tsm4AB?h(jQ`r3r6o6u@}r(P8`-JSMnF;Sn?>WN_{ zbO*A$e~`F(#_4*RQ>&QstA$qoGhUNs=cS*)MLKp9|B-O%aI)lT7d{Qf;jn}jB4F`d zcD5ozq5eUPqT_tC+ZNoE^y8ZWNUfx6Cn&pTNBk)&`2tp;dzI_`E@+zzj_hZ$L^!#y zns{D%P`XtnwL*V2Fe_sA7TWN`U*?*yyG;QX%kl+a45cP59=qo!J3EIP=u=Le|2{Ul zGX~VFWpL^!CD;zX8vCY}Vd4u@XDqH!&x&OYr{FNCblX~73}I|_+e$JGIO%XVv7166 zo2e)}nsqhG`-nSwI6OEO_$d49H*P*$?GF3ZkRbuuJS{#`+)@Z*K>3X4-h7J$7Xne% zhHHEp3>HR*lkhWdvxZUeXyreT>0)#mU9adW(jGw+YhNb`|MV}3tAGECxK!Z`!9wRH zCixrG45E+3ycfT#ONU0`SK|=yHry%PRK!8tZFBg+Nw*z59l)a2(hogzO@vQQd3?!Q z+0mh=At6dy>BWl|g<2sCGVfk5v>t&7B5pfg4(9_ayc(x2&7rwkkoEq3sp-&QD|GGn zfP}gg*Z5`tx@HS@!{Jg0SZEU|mRujS51LcAM6WF1B8(CNFVkcdtyfA&kCL<=F32LI zaYN3I7jF!bGR~Jw?JxPCPTKpQ?kwO()sy)8x>lvidM-TRtZK;P!VlfV9qwDV0a;*J z3Z8lNW!7k5_b+Cx$mRrV&z;FHa>V2elJ!mt)TSRkNS^P@ktc9yl^RV|<|ze#OneA( zD?^-I#;5_>;*-FIKr5`YoQE>M-W$xAsoR^q_t;{k^MM@Lqgwge94BR3`GU5B4%6S? z3TPNAv4P(5jjR1rDia8DYA9O_0gN(gEFSUn|6H*4VJM-lWB`27dAaZF` z_W~YQ*OtJC|9*v%bF9?(%hSHZAmTdvt-_d9dd#m0n1GezT%%J~M{Gt37e-ecT==P~8d7g$ya*?Xf~FYQ8sCfmmaZmp3SRjSAF)Z@6!N z2+=F0W8ifuwH=R+F4AHB=xwg;FvF`qT= zr%&{?gQ^44tmru0fE=9K^~LN= zxvuwvXHr)(h=;Cm>J({wv7b^(VDQ_=E|5^;(D3c?tbj%z^eI}xy~tFCB^SCDebXt* z^#mmwl*lLJ>4?XhQ)7?HbzIwcy6pZq&#L-PUKkWiBc3GYt5}QDoC^ z&!j!GyLTFt4ZDsoX@A|)^P^Ev#dZ!b1M1iUm9O_Tq7Aq~X20l50!PnGETI$UfJ8lv zuAk3VR=rq_tFd#XdKN?L7C|d>YQ544)~RSrj$Fuzfoh`Jd%Wn!51rz5k03R}hTXje zFsVtVr6w>#YzuaK!npj^;kr8_)34Iob#F%`Y<9io8Yyznx^kG~kmlvE2w1oq9S~Gv z)&1V_Vgmm63F5VqjaOu_8O}EAXmp>cg&D#bmyPC;d^-)PQccE9Vy-lTUgrn-s_d$e z@>f4DFUXMOt1Lt>+^G5DbAGVYTZkGE@!>;~lKT5m#M5}&EGH>zn*Exj9dA5_z` zCfNcWPYl*bHLKNi<7kV7nnAqU>mZVTAu#Z?dasL{q_^~NI+C8iqy3i7^d8V!6;bf0 z1&vALpxra+hk5s@?RpGu$}gwSW}j^r%Y~59a~h!D5rabUav8kD|4UY?nP+d%Ad8(e zhe4z;lPy%w4n%Ha)Y6};%ea`0eanzgjA(?HvsYFPW%LbZ3UNJ#4yLCFfCsJk8Ax_b znZm7wt2;i05z6!gmyxVr9$A(Bo^6R~lN;;8LwcE4q*$WjU%mH3Cc zbX)!au!l;fA6DdA47mx*C6$T0w{I`6tgN(PgCIAVvwrDB z@n=M2jJTbu_7GxHB{c@YZ<=|asO$6&nL}Vf*QV?P&s}hSOFwn(d`>aD5ShN_N0#$h ze`%4Ya(SrNetv$<6U^`1;%rlbZ(O~4(V()}lEntfSltYuq`rRrs?9U847n)}3CofR z+#cH+6>&U2KU9~wK=lDy4;5}F8~@mnP@NTKXx*k`FIx8Z4XS>&d+ySRI>ULf6)wnabFB-t;))nSVUhM!B{Zn? zRi~I|H!kysMq%uaM~+6?WA!fB(|_qDcui(2%tLPj2+Sc6i2F#I<)4psZ4@bWO)=7o zx$0u@$!2`JElHGQx>*=%0cgheg5j|XYN!AvM!#peT&%dBcpG7MHa50({17*uZzA^a zn(^TKhtMEi(c>7!_d$X97L6~afdfr>^?Y;9-stUtG%h_d+FGb(nF$FsW;+kfMMJTA zQO<6ZCbBbw1%zurG5QemIsK)^JXJMETzANMbW?Wa9y?x5sZyUi@jQ_4B(Q>NuZBX= z(PK~A-v^7FoQ#qVivUb78Xm>a()N6(aGeyVfSUl!iBV4WSeN5${URX|t-k}5YcCuc zNJ_hn_PNM?LBNgJ(-n5D642V*{V&U(z`ZY>nemj0Y(lv{p}Ls?D_p4Ae0+tRf@d2P z2OK2qY+hs`w;=E^qS;{~V74B!TSFh^^fR+~Ycx$bL##?QEjgLjc&t@fYdF6@`cM2% zfarSvoh^w3Fyw#(F?I_L#GVQ)lXpO%wG@0t$Gr)Lb%U8w{-Emqq@I;{j{zvF`y`S48f8ncc}shL`vi}Pjx4ddD- zJoeN8LzjT(R8D_f*6`bB46DwRWnWw`4Z2Ce!wr)xFbReP35SZ-4)9>moX(7yTLk6} z@~9mYiCL+KFTZLR#cQCPC;Iio76e(zj6wZdN4ps#l1Q0zVx%jcL)eIYAv)v-mZbY|CKz{C$v$) z$;3;qp*ya>S-_G6pvUX$>qW6nRcHD7;eoYaX(emgHk49D#tIMTeciXYjq1HY`#tYC zzvu)_gO?h)0NOCU!1yxjjdkHN{_!7t-2oXYah1B9cXAON7J4ZDvR2#2DJnfZ_dsB= z>|S6?iW!DAQ9TR*YMsgrBdb>Sau=K;} z6oKE@`U5wFWLM?BM~kwL=9Yx6&t@jd@i8lc%wnr`Agq%ZBfAVw2Z>s`YY2to$oBJ% zR3Y=OQiCe1q2&%=j5Q_ZgP>Egq?n{%FGZRI0jq6ACeVhyFXfRtcj%2@5P%=hO1ErX)ZGxLHlQhM0>MY7_n1onY$60*arz`;Qdv zml^x^#!uJyqG=>NCLiH#z%rmB-$M^%*M)47SI@jv1BRZnZdX_1GvQ&j7nd*NRr8-1 zcqVb}coxX!9K0iD@LGIF>^KLw^c$f1UVcp|BWFAvGqt;;?3|q3+)Q6hWnfu$uj*Y^ zdJ||x{P6C(9%%!PNp;g7r5-2~kQWTV`JdBqG%Z4l{Z}#_6@p*2AxCT!E%%g?s%of zPOr?Q<#g6{350hYh0|{qmfV*)K4=<|^=lc8ol)wl^fIkZ3!M>X81y_6@hfy>u=Ed%7 zN)0v|Uwge@|dCF8bve&V`8#vtj*E7@!{wC}v&XB_HX*=F_F z0LB(q`<-UC{hfn|_$;HZb>p+JsT9Lx`j543aR zpJ3LE!{)1`mbWuLzg5}a4+u*7v-Pwb#V7_K+dU0#bXU(jKj?~M2bJb}p=O?HTB^`Y z_10vC$8IG3R2P@%Hatrh7I5*pJu|>(vOH6Y^kb$}%LOGleWUZz@RwQ#YF_&p-8^s% zys&-Iy_4u_B5)U(>ERM+(g(ZVbRYGAs9WR!IS06bRyP|Z5J|j%kbGv;;&X`uE5jTauyy22njW%ETk;Z(0*^FTD5N` zQAv5K?SjE^)OqiwSm92WgY4)RXH&~bm>ADf?XFg(XJ7$(wjIAgxjo^JY!G)p|6)pq zjIx_VjBRCjio2uMTFnBUAASrbG4*;q@>R+g96i3Z*`Ug)BUMti{=^-&<_pY>)18w= zWlbL4L0EsPWeo&Y8k{ZeUZhp;`LaxiSF zZ-yLyTa0|=F%-6cXgxrCuH|?L3A*Mf_X;viP;=SX)Y3&=%m%#yWiG>trOO@gaZC`) zGqz6?_VJ%<+?{SYP-yaacboG5Ws#i*u;&KSLPF}C$~l8m0!0wEk*8DJy^WF_2?|)NuvN>{vn2au2+`TuRL(2!fJzlKG2ajSw z{ZQ{wO(UTO{KR2~CpT3%Yh6@4!?Tr6Qd;3xPmI#XX{a}{>e?2SBL1Kz`>EKJl$5PT zYSO^_o|p3)_bSZ6#-9Ho2Q=gUfi%$EHNQBaI#w7|zR}>HD`>tsUhIz8++6E3^>aBv z`SL6j3myz;Dq1NKq`Hbp)&_9F!0uD{GV2^EWAhf8_-9R%&&<>?f)gOF+ zx3qMH_%tAJC_&IR>Qk~17t?#NA%U6=;LYha7Xal>GqnU7kJtE=KterNI^Ana2bftx z^E*V1rSG+xCs`jU?L@I&6vIqyUVf>mjP2N9MvlVEi4K_;lZFkb8n|w$AF?6zPL?mP zb9-j-RMkvPn!v`F5T!)F)my0|$K=<2`C2F_DJjS6D}YF>o*JK=ocwU(-~WJo{HlA9 z5EDMR8YxHb1ZjX(!FsNpW@WaAJ9CD>>F|!aNQ_167xi6c>ex9@2&WB zQP0%4`FLE9BJ_Z`vJFgLtN-CTy)-~uOYNY)1+m#qF7R0T-1+o~uQgfBb*6T&wXgTL z&$EAToVuFOiar7Wq1LDY=(daAhsbNqe=y+96u6Po>8+DR#nq@sHdWHTwd1xm!ZuJR zPkV7s$7w;y^HVV4e5Uy&;cYSH*n=*)kACMa8-t;t84|^}Fh(tC-3XeMuA$6}gDx(; zd4wmQB%=EknB}B$b|JAm{cuEA_lS#kn;UM-XG|kPB8dVuQ3qClpMSyMbMbqj7Gk0W z)!XQvIhWLDz_Jc#Q%}c*$jDM1E^)|oy%tO7j9a7U!uS>y&-S$Y2veY4Hvn+BgD5st zw?>=ML|)@YZNx1~BOv@u`Yv6~8L{p+NYUCRs&k|V_-YICD;T6C6MV{U{5Jx9dOjNp zC}ijwY7H@t_?_oy+}n5@^!_I1Lv_+I?kq#1s_K8lAxu&GCQLsDoY5>@qHE5|jxK6N zY)WDg>0Phhp8KM8z+U3iRhfP_i*HW!G@u@eW#Zp!YjfQ=+cRxG9#scq(HoQc=#+c( z7so3jBN4QErL*D@!J(WUG&VW; z)4wgP?ueJ5)Cz}w=N zNN*ovkN}sfCIs<%C%uWGPcA3Kqe#!6RY;)0I~w&h{^}62rJxpZvmVWt3pqvIdl8ci z;B)#^6ZXia;P7ZmGcSyiOQ+ZRd_yKeVT$~yj-C_0F?8lzY7*eR)|+J7>Q&)pQ!x5w zrpjtV4a}}acQc!EN?{>^oI%FZ#jRuzL}>#9XmeaQal{MSYf~Q+5j&Zj{;~$t4lgFt z_;Xa#?g?c2dyIXv%HsL=wR(5ydO;Q-;8TT~JhQ}H*Z&)!ZSF$r%2k*V3^Qd(0Bar+#q?bw}rg4RQs3jt>AfiBdg3;?g~Dt&^WwJNoPk`*{OsPqBS9Nq88313s?-bSNFx83QJ!?L!_ zOx!5~BI7FrkX9>=R{pbR&Di<%fe>;=X_dok>M@3-n&}YUvJH>oAN0^>fjUmBw`Z%d zKRY7`e3f$I>iEY8c!kKFksQ6U{{HxQ|1)97ol&b5g~0h2abfWs91DJ+kIA?aPRXU2 ztIrQ-;=fwpx|l5sSO)81Ks=XaO4NBcl$qGUZKaqzdw2ooyVs&uhx~AzgsMM-s}BK* zQoaf{Uz6VBGD{0W+&syCcgCfc5jc=4h0!NyZ^0pYC3k5h+->bkCdxjD8@12hQI|a1 zxud>+gT!Y3CY5fhAHYW&0jM7KENiK+--SI(K@Zz!h;6Ak8TJ@bTdfbNO_y1)247iwdus}*A}Se;P77yydy@wj*aCG>O1`fL^i=q=c1gGc z<6r?Z>PG>}v{YQ?A!3>ILrZfHLcmVfVl`b%z>3$j)$Hm3EpjNCpRkYXXjW@8Rm?Me z{5WbKbV(Q&r(Z%^|A8KVMKC|p>Oz;5#YNPbsb7WToa0<)M0gmDh#CUE67Za^QXhk? z(a(L}pCSObezC*-cF>HslNXPOl{?H_C7G^;nOuAcDbma0&oNhY(ltTX7Gz}#Y-|;@ zx10JMOj&hB`tP-1=YdZ8Zo@=5a*oR&EEb$bLFzr?J`GSXlB6u?_{jrHV}%GGzzmxJ zF{AzC1G$F?XyCuTNWcF>ekQ$H=gXtTYX#$FQaakAawH`m0|fEA3(6$>*S zS{h#?g;c#6zMr6!`#dI@l=k#!s$4egSBcS7%UN%NCJP&f%|dG~3&-uz){CFPyEA82 zF?Zu^(6(_~CmZ;ap^Yr^qjL7u=e8N*_+!Q0>A(E}B&vI1ja!Tje#cLstfG&&?9ilP z`y4SR!ItkZ1N2Jw?fs<~X3w2}KNJ~E$CisYK#Fxo^T%N`tpN6Zkit65iMy^(z|JrR z++YO2K1CU&r7NI|#$9w?$ z(04rrJ6~*A=P=Xg4w{h8&(tQvK1T1X2GhTNYj7pF7I!8`WCEG0nd)eS9bzX5%|~X- z_@XqN(<-xt|6ifwcGlqL8Yj~xkDzNh#Z;Wyg_^Gt+z+@xed>zB@3$YU070cK;J~ae zalE+BeyT_Zn5rP&P0v+A$ik`IH#J&(tgX@8S_K}PkKBtU%EC4x7_(v@2b{P1x8Va8 zzlTx!V(e$~!Se=Vl|Z^MF*ZLW_y-@n#yS#kmoTVnn`I4&?l#kcyrnPVbYUOK9LALp zE+-^EGl8vgcRnMb=9MhGl!W?sv#g^~_w+_E3Bl}~29EzYp_eeWH^%~EM-sr&0s>mu zws%G5!tDg5Q!I`58%PC-Q4iJxArt;9U8>1*?|-ONr|826?ZV|LCVo`S&vvVU8{`W$ zc8lMQo3y7FTv-Qb0kyE#BJNJbJKOAi;j{Ii5M5urx*Kbb1)l4&;UXjV0AN$e%*>q6 zQFL=dOaK+!biU4MAax)OUIM-sS108QknK<=tw^a+gA1^Eo}#(*60v>0Km>=btq+`! zv1JJJJcdqJ-=NI&`ugdJ(Q3^msOg#}ce~+i!@74@n3=AT z`E3^}GWu^9e*S#80h*Vyo#Ha-Gy9`WQd)&5X}{yMJpdN|qGc}ahsMAp@DvEJoZ6cW z8&rG&NU<#g_Op%#a=L_?L5c4fy;|_u0$>^Ule~adGSD z0ZbR;#t=1!SxtUHL4lnV(;n18l&cQS#C(yrc{MuiNkeY52nV9l7i*Q3myetkb6yPqD(ztK8>VKV3LaNm&00BoxhZ+phe}8dEMj`{$ z>!xZRv2|%CMoEQU9qg_hpqin{0>j0(PV-CpegxUU86+Q`c_A5DGah|;-G2R!4;oVa zO^ufLNnb4O4y%zu?1`I^K#*V^)b11?Ip?P@QV0=1bs3AzTXk^gQ@K~}(S&3or& zEw`O|FPE-JR;95bo&5gu6Ix+EOv(f^N)pc@woZ16`f+9TQNhSvkf2;Gp_lzNDGt}C z?6dqa<9Zw%rhyrW;8`H4BCWkAhaqGcGJIX4mV1L}U`DVSJlF9ZWek+`KkZ^XB=c?X zcXVXgnQKI!?bSK9?Emaf+1WYi)l%;O&CJnWAUQ2&+71%c5x1%fluyu`@AvTm)ixzD z5kT9glRkv@+IO{;ShGCQR=2r+wU>;2~sBpwFGP ztXU-BjrZm+&P1Ft1#J%BTz`{^<3w-k6tQ&it$oTz%nT26>O7Tm4M?0F?&BG2K+-h| zT!WX3IKP6TzQ3E7?!KYNV@Sp@Te)_H9Pl+o@g+3CBzX>P8NVMfW@$CVSXzDs>4h~0 zf=1-0PvB9so%Z}Y!diUm91NQ$9Zj3{k(o9CJ_@+5ml_LLO_WMmD(z0QDp7D~etiam z09#41?qC$aS!NxlXlg#>wEMww2*c^j0)x+UTQ3C#Hdc9s-WBT$dr9@}3?;-#40Dq^ zVq6(n&N)M92XP;2o&!!9^2kO9;ptH&9y zbcxox?H_lnsUhtDOCJi~^rSR$5@KQb1x$Bml}p^wfzao6tKA?fZ%R3`bBOHhFGbez@*FI!}->S@W>{BcToBBR+kD2r)fH zSf!hyR9NrwL8>kLK9athY?f7uB&8$lcEp*&cIMO7cK=xDxaJR)-s+)Wx*s@UMIW+!c`f5(p)vQ+vPD#ag}!}>-=~n7eqV-5AEP(tRk7~ zw%cnERaS;D-D0H;U8uloU_)hAu%E4e^`kc--o57q*=sVo<4QWs6l~4iM~Ie?MO}@MNt&#SZ>^^bD)l;!`d$U29yP?O=G_oNZJ~Jw-(>MEc@r_=~sVvJCUW zG_Wo(NQ&Ag`^NCGi#a!0_J!UtthJx5u8_nly>+hFzUGL)?%5;yQ!wt!_XGWK^ zR}5Ud>w5YFfYvLA#Pm=+2rzqo)15cyCA5L zAEf?aYRKJRi2}vXVEAWd`4n&*H5{%F+-40pb2#2#U0rGi)l4||k{o(FG!*D6T)Mf> zE6n~He(JQR-2(AdV5>7g%Wxi!e<71mZHZx>WuL`=*W~h)uC*IFIZOe>b35x4ZP?Oi z+V+Iwnt-i#I8}}UkI6Z*X*AzPDzPo!qlce~5&5qAb@^X*VK{t(`FCu*`wR6f3C}Z+ zP%c1o@(EbgI!L(Y2Y!@tLC*dN+8A6bF-Z0NHrNC$q$72gx=-`a#M|-&HQy4&Amz3H z{ZfNGfPBc_DQA!Q<|pEBZ`8+z`S#nH9V`#YEL7VZu9uVyq>-o@P^azgzfJ?n4R)c- z)D*Kx#r-M5xco_~zINelI-|U>vnY@K#bA<5obQv)`xS?qBXCn0AGhUSo139`!l^+r zdmVs5F+Zq<)Kpp)>%{TK02E&OUISY4ZQ{z4SJAX&e>kIDO_0&iKAFHkn$_kEj3Y)y zS<=9QRI@Edeq#78daaL`6w-R$8NsFJIJ-XtF4C}nq1$r9R~d07tv4TdogddabVY5n z5N{5FkKCr^5bj0^jzUCFIn~-z9%mc3o!}nxlzXMqVd}BttjGc|d5J6lQKf3A^`iDy?71Y0z*PYWa#X$T0yC;U zPuoWEIi~J0sv}(BF%_T5Us@?&9bn7Tqs|CM|7w>N*&rsSYow?wvq#K|!cNjqi-p!= zUGy&30PSj%TJb@BBHbChO`BJ&(^$G*o~>iKgK#J)MsR)#F+r{GR`OyMf6h0!o?){j zHe_;oBWBm)qN#3;6ze_vAd!RCUegRrOrFgCvD(w(gWi+zD%VvkRE!b^R@buDN^m1{ zYBWcXFK!Hpstj#GwptQRBD_i(ssJNKF}JN55;R>Y+w`ZAu!!3cE9zM@^Y)p z7|xtl#)RSrasWjKOA>JN^=vpPd4(t?35E=K<*kaQM$XFxujq@87@R<#?Wk z-kqtctgK9iLzyj&9cM-TPkR&SC9eH9Splwj%tgrtNnf}PX9F|k$(zIV&CM=`@JI&! zuLf1On33q=e2Mc1s0OIRzYi4kqZsi^AuC;sfz3t@U5x6_z1CAc{IjrkDN}64EmLf? z5q*9FGaO1qPgx14Ii-pK+!CI=5J0d^Uo9Y1-v%g;-o;<;6jJj#I^nKo>DbU8gSTbx zKg7huGN<1_@yPgNv`$F@A`dbx7OO68P-6>xk_c%6q0&muc^mUTmz84VY^(q3b0{;(1EIlm=Xu;{C~A(4TN34dcR|$V@5M4c%g@+nTWH?ie1(XS%882DOa= z>jyD=KZEVyyhi&&>o;!KS&(axy$1?HrN!27Qd-@T$?~OSei$U;o>l{NsxpDg*Ovta zahOTWXaTnyL2u`Gl80?gjHja&d`M7IUNQqZfzP^bm}B9+(O>8849t*_b$soa=lV+h zv;z5r`;=qsMT?-?)NW8;>jC3@Ro1{B*S&z{&8-#n?ePOYVO zli=rzc@N+JnW+TG^Pbow6G*eyI$+nkO_JdutSf@I|b?z83pRV zTTkFHA#DtS12uR1^-Lq^PR8}jJFD%*-t4Q$i`<jvN|%~F7FW#QyUsT6sgi4pfcz8JR>MYxV)npm9J`=Kw19bA7z?}1x`jHU%@LDxuW zR$C<4moz*u(C~beb*ncO^p^L}5BCJt2j}WtmVZUit|g{oTg?W`H=I~4q5}a(fg5T) z9Q@-Ew_-H)=(gNq5fTDFRDPUm=V5Y*E|?Dq@85ud_7h|NCc9pPUBDlWQgSIo%~#ui zORV;QK6w8g*Zc+krTwcsz4))rfTNf8J5@syB_}&onp2uL(vP8%NxTA*xDlS*hNx#BuTU&ka zladXU!LRu6>({Se1$+B5#ff7eZU62Y1#Xo*%ZPJsRvqQ7QIXT%`$cuKH$Oa z;DgrvEj)#LQMn%5V=cZ|Bn(pHF!QDT{Z+v4zj`MExq1_GBlX=Ccp2lPS9|ljGoz!2 z3x8;vOM?SxfLhA6B)jYc)af1esIL@Mfja=RlX}(xRN5dA(^oQ$soM#jRm+sN# z1I2%8XreycoJuG%krJ%-aR-Kuz`XHqz{`!P{8%qr~ZEV zaKKYnZ+;2EVd_E{Vn5z=nC{P7$d5RB)Q{JT=PV37Gt|&1)NKEV-Wx%k}?1f$!03qjFWml|*OK3u$e;OOU9@=o{gR01?T!M9_jO(f_m5U0njRl&T8@j?AyNe-y#@Q*Y*I zPcaTN!ffkJdt`K??n;rWr}>!$v%^3lKEv3IZco58zBtYSJAp?!e>-ikJ~AqvB{bCg z{2)2`M^KvJJxP7UE$>)6{^XOxwqrBgIgn>OcANGxy_OmAUdy596hSfm<~H-M>P*`} zW&menDQj160txuP1QM^L_uIWUmOf|X(7Whn_73K9ic9lCVRq}RfCE4|f1|mJnK5f- zmu-sY=)%ecC!tpU^`z#!!Ki@kdSZ~C3BSSm{oe-INWVu=sXGId-r-e@=}F^8Z3)-4}@ z#6*sQynJv7(7G6qIOh6~Ed*~IqhxZqUiAM6XTv(R6x7KEQqalSAvg2SMSTTxlddoC zzOyD#F#U1l=C<5)m}mhuv7Cz6?Vmo?*DFLUFRwm%g<~{8enxK|9CS(fh|(qTNzi55 zCIF7b4qV4-s-@!}_u-z7zAR%{n=V>m*;nhpuI@OK57#Tog=06rfUnnrxWlZ5Aql9q z=>Oa8-`DiA3CNu0>4bJ7G<5dq5NS-=6IX}!M}Gu&TiWPVMG?VjaDQX1)?o&?%@n)? z=ZPh*^rZ?Bm^ER?+49$fTZ9HM7Z>C&;ikDaRWq=O*X<>`KN*Y$QtnU+c{&#B#>CJ| ztk*_8;CC8j+p4qy%=GL;P?3d6Tzh(1D-Ec?3$;ATwDW+R_5o1_eC>*g;4Th<$5=3R zP=V`ig^&kg=a$-CT-2rSQEyD?Zp~BOe(Y%U9Ke#}gQ+Py$TNjK{?CGR%D z;Hap;^_1h|bkYa8_A0j9YkdThyXVp7yDMUh21=1Vh7GW;=0p)D(|2qRcY70n^;|qq z^k_K%-||G{Z)53qG}7$ty54-UzSQp2nqpY&cHI~1*=JD+QDp;z0|p#QuG1rf2GpoJ z0J>F*9s)+RgY)%E;QBJ1o2=~pB#KCSS5dl1gQ^nUVjW-xpwP4k?EEY;e~fMOMAAKa zwV{TMGU|Qsy}CM%ef0OLb=J<-$-d38Oa%S(A{Pq23JbL}(eS>QrOJ=_vs&4s@i^as5rf`EXrtEFypI$}!_&$(^ZFZ*# zL=V9|;EtTFw(&a7Q-+sj$ly;ATU&SokF0WH>_FyR>0G)PpmK4*fyLJ*`Re=IOPV2C zN>$zbYTz=uSJIAI6kQ51XWS1FE9~F$1$VVJ0T6!kMya>epH>93Rpnyt*yO7D$?{H#B1CZu%$VW3iz9<^*ieET-aZCI5@0^^7CM( z_;EdAG7TuV%qPFAk@3Y72vR_X=0p(~f4_zAM5U=hzB?7RH!-uFC?-E&9O8`T*B3iE6<7GOEV#O@3jsMz7*5O9pGbVks!X|)AhoRTttYf#y; z;`DXN*^dL8a^I?DfI>9}{Po${sI?^St!ek3+um)}N{nLAi_;k9GNT6X!(Pg*o^`y) z(X3w1$0?(n&d@st2kdIrQi$M9P7nPF&PS&~@O#>Q$ zOHb+)y9X~bm5Fqj=K`CKS%i*8BoZvj4!mr!Hus3J)Y8~?0zi2hAuBSztpfzn{yL~yMGXNQOCyw*1j4PXyO3GWT@=$2>~nswZu z=GDw~F0J_lNCCiYo&Z}(l@*`qAinrz<>~_7q|)L91r(-Mzj?;3!DA9iPR(462i{br zdtj6S7x?Cl=+O#u1UwKu9!vsmy`1gdQ6DP?*3bW|y)%!7y8r*a7O9l361ozKkc1Gj z&Q(YVB})jEErhbh$h44D_GBj{yRnUZX|rWt$4*(sPQzd@+^^5*`}=+S-S_>^y`6KP z)8}00T&HuAna}e6yxz~(^Z9sr?WN{!h)MHQgosf_#O!98zBc4ZF3KajrZ1lzF?^fY z14FDE&dS^3w>q=27-hVQ`R7+wYl+6X&ix}sGzfK?IlxxNnMK$^eVeR z-gAQn{S&0CGxQO@ufftB2CF+4y9wrv(TWd=NM`bzpz)XI&@VI2pYHz~C;~t&xN#@W zec!>r8r{d2izfR^0EF;pq7`wm!tH)vxjvYO2vNw}U!L#R(=*0UND#yW&!R6Y)R)DJ z7DKhZo1VVw0sVE@hEw?C&_L=>M9~8F_rx#2rQ&AB1+SBfHYWOM@LIbTYHmd&IQGp z+LISuqkFvYZCYpke)$VrPW5sd4>#7y3z(JfKPq3bK>xsbx+~in{NY9Rihk{rB*fa= zYB;~pBmo(K2k@Z4{^Q72O3$8uYI_Z(?4nnuA-~SOPfy`XnDX^;HmFzmi2=vPn`;Xb zf|`4AN;<_{RQh!D^P8Fh4*Z%Qyj1s=pIFdWQL(qTCkAq@Ezb>NRu_F3;pW<;Kzw1% zX1EFp3+pi{>`ZR~lA5Du0p^X3zWLaTgW=&;O676#!NJ}Ppqt?E4D9XDk%wJ*#Rl%d zaK%PQSmE84b+TrmB3P?)1sC)^Y=4e2AJmAphYfd%bq0z5yQ_knzi{}hGwsjVsrN+h zh`v5Rn*hxq(7t2fcm~VJ3~36YzexFlgxQ#pOfZ-#^%azql%^cTAWzA6{nh{`qGqN% zLM$Nxsrt5Z3?3fyLb(=7ijU?m1aiWbI^MIR*rqq%Mv~=$+u{r09(}V>JAB`JI<9uv zf3w~?{@;|sk)Wp%HLu^sltWKT&7#R1s4|kr2Hh7LBtY3fwiK(2Z3u9NGzA^PV2xtY zf3-92j+3SmRZ9kDukQ&ILcJIM@+}0qdpF4&YY?@&QyHuwZnqKZ<^KMRUZM&@nIJCb zcP22LgfjpNilt1O(B;er5gw>dIJqaLCLP`tQ!a+&vwo90JCcQmw*$swerv3Cz_ch zCU)P0`)VNCV2$KJfRr&8&lcTfmMO65%gFruWB9hE8phGoxu!C9y+EI4R&2(VFKr)u zIZ(EJk#^?hV*@1ztm+!&Tm+@pD9f>~=Btb1Hd0P*8)W5RXwPPSjBYYhJ51)Kk09FF zuzFlx+_Fd(y&sa(yL5AFBWz|=;yCfyi=M?4-+1c<9CzEtCtwBc5$kas#)U+G5e8if zZbY0*>}IgM4|R!MCFxlEv!7;XSUhamG+)JPkYD<G%0KL-A$kepNSy-5ncc6E%D&iEe30g}}|Jk#rT<&r$ zH?2$I0K3b1Kg1+It%uw?31J5hLO=Ch3SLP;LE&;<+oavI@<+Y-zCJ|{hNrN(x%iB! zessT7hOuN*K!OjXTMF;b5Ant>PLpeSL9OOc?wV=_12qF1fP(h$UAxl|!KGBb-bzsl zcs|__fiMTUXAtdIE8Lkbu!;YD%>~3Fp{0db&Q)FtP4(0|E$QPH-O6I@JIZBpe#nxh zLWMXE5f|Git70}iTLyaYhdm5kG>4A<`bv8{1cU)*W!%`*Bw`(3gW6+=v=MIK21LP~ z?844xq zZdL=5J2l2lE;QlO$$bvPRf>wftVyI7L{-kgOv5CNxgMPBLK@a~ARQ6>Jj=$%Y3bt= zRNuOf$5m`nAS%iqju$k9CCX1bt^G{l4?RU3`{Rg{LweBM=s5jJi0cc>)L-@;8&rIb z!}rfmMfg^m0-5Gqr!tlYA|)OA3U7bewJ+JY;(F35sl!(0Y5-V(aaLVf9ck6RutV(0 zv+XCMHQ!-2S5{UY>M@2;{_a$GfHlS3U=|*|o9NEsioS4Nkgw*^#iIA`V2PxkZL*G* zUPiXc#~ZETG43z1F+jX28Zs@}CNn*3(qKH!zEkF=?@u4YyT5a78MKTIifU-4j=;Hg zuut-09?_c_O*MZ4WB5o-L23h&jF+JtHuwln@Z06gin{Xnyo8Xc>5U?T5RNDIrj=;7 zWj`Ow-la%8^=K*gha)v?(wF>TWuHH}2c4#SfMcVU7c9r%6i6W-Kxf`y^h&xxP0vyT zX?34Y+X07#L5;xyG!x{`z|885A~3cdGOXid;%J>(L>>}jCQVYKD~BfABk?>}jtJlR z`ofo$<;;yDdqU%r9WJx``j{DV>Rd)@Dqku2-N+Cs`#RT!`eFo*7Z#WC<_~J2g3;0% zF@Q7pQ5oa5zJ<%s)P(q=fPn8Eb=MO_@{608&}YH}<12BRMON_8tt?!-GUrOHP1WYt zN;X(7B22c&c|AM&R$vNm*PU}cskN;sO0N{cU;9~0my>Le)WYrC3uAg`nCap6Jb-tL zIkYabwsP7~^S;fDRbKa*iv>rQDPVG*m>?D0&!6NJ!UXhuC1EwOKVnXr4B=-H z0Hz0_@mj*&?|(_K*Ohfs^M$W3&>a`1 z4Li}JQdro*LGGJBNj(}7SzF>2UxE7r>tEv4*{A_#Par`-ZfV z#9vu(Wo2WJ@HdA!P!3}wwdMQJ7sqfAsB5+N6;;0MFE>nWf5~JC zN6&11F3;YkZyL`yGX(hx#fe3Z6Hwc%sSl`d#U>|HVGWDdz>~@!R#1&=EqrkQKA8x1 z2irdEU~`;WBm*1R?=}iLGYAc!UGt3j@b1+dVU?4SbX}Qmh|J9qx6AJaU`bhTwDaVE zsQGKaxoM{&AgbvUel4rxM9X^8YKb&SCIiueBhR0K`{-3Vjy!9NY?%dc+RpU&vO$LO4d2H7eQVT83f^RJ6P)T)_|B)< zbiGg%>$(>7wBDMJuNDq_^!nli6xC6X8L)#g(qN)-QVLrel!#jQWHu#YY?|MN9Z6`h zni=S~B5g7=Xvjja?YhQHzx2cTfif_husq+Vtj;cC+V+8wSKLM)*@X&Kw2M#s{8mxj zJV;)D+P?4xLvW__=Ym&4E~hnK(GiXdne5CjeoJRSBOck&f${YM?`^x;zVY#2POe_( z*7vmFdjkvOrmxtwhk*VRaZsMGBMXCnG>IOLNZDR1oc==Y>rK=kHIpZ$-wS?>t4%})!8!KNx0+Q9%Io*tWzbTRnU*hqZAVbvH#y4#T)5LeKlPOtQ zFPT`yCR@JTy1Ui2&tnf1n(hYX3VI24OQYX>Swr|?lV6lmYCPbuFc!iuVfTDX4~+b| z{`XQ(ezb&;NRDAiSeOqZ#pT;=wZj8k3lUKVgd;c6W5pG!dx44oa4$rmNVyId^8AT~ zi0K}t5m@bgUZ?BKWLNhTU~fuF^~4&SPi7;ZoW|KfvvzH%@+GiVPD9f*kjvNuaV5gy z34O2bbiErlZiM9pv`p+>o!iD4%Mm!lLbdLi!%D$i7yDD_Kkb=cqB3Jg-Aut%2EGH) z(NjE1I(vD@9$@~LDt4MWAuoRKh{*db{y?kS&Do%NXEG51D%7D*B8ZigLq{VPhBK%! z;TJDrWVtx)<=VEw`|7h2t7A?9&XYP*&2i$r;MxLuOL0E;slMunQ>7;g++yrk92%n# zx5voH=In$L7e`^xocAwFG?~a^e6t*sxadq*hm2~{pq8(@MdSHsi$=$(e0SFZTi`aO zF(0+co$1bXNa`G39W;e9ycQY`IvIOki<=L~k1R-Ml4QWbybk$qIuN)X&fl`kg4|~y zmy%y0yB?oTI`Vc+Vc(?--Ga%EgzAB^wWY+w%4+aF#Y$IgD1VOpD(WJ&UnMFSL+A`L z+Wy{dY5C-IhLNoM3U4gb>qworOQnl3-RCnJLMdmc7RgH3-a|kQKmQ$h7<=g$pr&%c zo+C=4JK@8PoHAEXKqS;j(m^;5%@oQS1t?p`|5lwW7BDkRD#}?V4a9xlU&kgXRvKk5y&cZm042&-6m2 z9|M_eYKsG$noczJ35jki@Z27 zP{a4&=nlyJGI@F!koPbi6^}X_r;Am5JOWK=~CQYiV{2}_%nVxU6 z1J}l89Y43!DE7`aFPVEqvYdu{l#A11$Pe~bpz*ZtLj@&>P>w*xr);) z+aw(##QTdJK0f}ZYg=8UXW7yWi-6T&xs5?Wwrc3dz35EXVj^1tghB>)!n9 zaEBYsik)W36|3lwQ`ZpBWRol&u8g`d<`Ht~OI(sbK`QoeFL8!MJ0tRwF!FzTnvG0IZx#Pxq zoIIhauA+j>BTI?2ySZs?OD7F$%;E$Gre1owc3VpygV$Ir)p6-Oe$}2BCl3Y+Sg;J< zZKj;A`%6II6RNPbmWJ z(?`@;5=WT$!DafLwrpb}33365Z05&iji2qh)_X0HisaC*5RW;5olL&QD*hULNWCAQ z@U(ShBY6h2zW>xltq-f-(@-zoBJo60p?gNnmgm>bQg+`?poHY|z7Ls!n-+Xfm~)ng z*xA_y3#_FaUqFMP=+PQN)H18~Lnzh{hK$8g35NiM2`hv(Z*f%7Ix&a8c~zu%kXB{%GYkA}cq=Y*J+R6>7{*lcu`? z4G`l%(1&*Z-Mavedr^w(2Jv1@90|JG^{>L`_6Qu!k{GyU^aVnx0w-ZX#H8aWS39pJTE{w)gOwa+VyZ7(U9L^d{VM88djBl^SY7>^oKN5L2+?YImr{6l zLGd52sPJ{JB2@6v@TIu{)wheY8BpT%mc7*ng?q9iQlhQ(gNBA`u)oWG56yx$R>~fb zBJj42QNQVa+L#X`8(+30P+AAI!^=uzxGnC?(i|)z&U!gOe9ZY)Zl4I9=FvwFZ;XkN zSA@#5dS{lJP#O^F^97r_Z&eQt$bLqRMaiq8FG~OR{r+7o^6eSd3C-`Ht?^5fIOhx< zu0X^8BL1!7iU9O;=#aSWmCI)%Sp@X6-ocrHr4{dXGX|fags26}v+#hQN_-FR=efVg z=eUByJ!Qjpk6NWb=<`$RR|RN(H)de3*_yV7D0Ssq4nH?Ql*grou{{9Yd&*bE>A6$=i{2ts%4k(HPq5Uy1`iwml7>hDXX%t8Daw#R%+2 z#+#qfc^^0sRU_g4(4IK|JyOEL%x2(T?#y5Xx}d_TYvGJud1#shZ3f>#*frQUD>~03 z=%L}^1tZH-R7fNH8jAbcb?5CB>#YC>LXp41T^1qs3K|rS(IONJ?{CXM9OTSC#vjCn zaxr2gYZGTnKtcI&bmqPN8<_|lY)0N`zb&)u*3N1DgbG=70tx0~OYh*GKbKp%<+Yc& z4pv!RmM9cAJu%``A20fWy@B0G4M-F#7|K*dNnPx%a^$^@pq;X>Vz+kM9QM^nccY=o$RvPu9l>YTnLxVAC>1@_=VD&3D<Rj5pv_wZ-nj zmQaCX0Nzmk8?{jrI9GwP{~F5`n|B>E>?>dZeea&l-t2@SPuUZM3~Ih0 zZm1scK3E4E1p{0vREiC;c2E({V$dY2HJ|EDD9g(sHPo2(pCcTMIIRt z4t{yqADVc@i@(H)Io)AB6xp;R6`*z*Ykdw*lPeDNbc4ZJ5-#wnTNqQklyA+#DEi>e z1v@pPvv^>f;SI(`u3w&TSO$nTO-THi@^wEz51FFwldPaD;Xl6+(Zk7=rVXvWr5S!* zKRFhl6VyoYxpk{7o|4s_-q;mVQ84p7|Ou-1FTti}NkTpNr;j_Q7@a+&W5 zx33+TsE1U%QPxMmE31Su0FEU>gd2+HI1dUEQ@`*GVfrU-`lP>GSt2dTq_8a$>kvf2 zsmiI*jH8&n^E z7w^CnIWp~Y=FWd+TBmnfNn>k?X;Y<3L(h;5@d5$PQEuNiu<(N2OGn*3Ss0sQ^UF6n z(Yk}~tsv>quqRme2g{vQr|?4+%3ZJgjIxePtu{sv4RI>&M#pc-f|A2LuPz|jjIPmz zy?lk7@6R~lGnb7yxlw@peWoe=#QL)*IILgaD03VArub^aIaVU|<|+yVI-UKj`EI1b z2hhBT87Ox6db|v1~u2^9E{X5iX&y6a;FB!yb zSR$zRqYTR(I9D)e+rK(f@XLPROAx$`mG=fA3JIdChBij?Y8Vwe{=8$OGzxy$-LRbv z9<&=MF-*^(dG*&uEw2CKvt97!Lz#WUgeEqk1`j{@xnHGnC31^wS**rdR&LubXgGkz zswGvZ>Orh~ML?3--9e@2&h%`*J! zpG>OqefF#_6sW2XhCL{y_|I_;gafGQK61E4sxDY0erbhi1peDt!xAt0UL1OOStE18%)8Q@7gz7$KoR>Vp&F1L0pA>bn{hKiJr+q`dcoOrIjtIyU^AqL}3GK?Tmk|&au z9q9Yna@ZPQ5BL-a(8#11PcC^Dx$WHNQ!kRYWuMn{V8KTzSse|}}GVW14$ z1pNlE`m|1W&-65eUr%nv0U=T?dW-VWRf3|ut(NyLu-A>U3T@Q3C`kmK9NX(Q8-U8t z$wcN#Jk2#Z14O-+=6|c5F5wg6>aAm1e`8iiJMTM^W#VnY0cs+7!Jxp8Y6m+qI7d|O zVwHsx+L8cti|?OZ7o?mf2g=Yc#(o#}=j;@9PH*R2s+O)Ie-a#gRBT@fO33K0rv>2M z?`Wp1X?Km5;4Nl~ZBL^-g(~hrnWU$OoaBu7(PR1Pktz_!?GO;e# zVylXT>~xGU+F7fej^i@YoR+VS_q1)3GKoGHP^ zIk-gB5I=NUyA{5I-ge~oe-$)-yyq*YVEKiVBTYR8Lb9^5ln!0rDh9S6Khir3fr$$> ziI(!zgMR;CW!t~^Fs~2$C7-!pBV1RC(p0GrrFMeW#}nZ4yDX)HtMM{x(E7Rft7x^u zu0M=`dl7CO7oD{PUB%K)AAO^I?n>&(L$29||=-v{ZWg-zu>iOCul*dK@HgzcN@3 zdH;4Ql}1%m58NORP5aMT6mX}g5Q;gHFV&IOtvjcIx2&C}Cn{C!=Co<|{rGK-o|J;S zKc{nBT7r25Ze-nh(m7m=$qCMPut0*Ld47h})&kL%=LGsOajwsKyP1IK=Gu-gYeImN?S(T?SSYE@%5q} zscFVU#_7lvcBS&Sha*~7#Y$A2N!(g@WtrE-CWv5v;{d&Jos87+QdrrQTVNz=UMEB4 ze-mc~z`?!y*^ePvN2PN5u~KpC&SEF=-c^$EBi!vTJvb%*Ov5zTIYv;m8NqvlFlR;L~Tj-oFW`;_a`~zbltDw`--2xQ4D@Et;h(W@hyF6NjlHl1E|WhY{vR z+69I$=|*Mtqw$IfmtfkB6$m#VdY=Ym0_@TEl5BIqE1arrR}LPBxeBbNv{Sci@LXOQ zx($w4w^UF`8n{TxZ9MJ8dg(U zt&NYk?!78I9)DCk$YR4ZqA9#ZL;z!Wu~y-H53bCuf6dR>_o%sp?@?a$uhp^V12=zO zmL@TKin?^xHDHlLGO|(|N!g)mR75r6HG1&CNz%Asc8H_!2p?~w{9r=IaU%bMc z-ko^o{SUorKMj=4*{@$qDb81}P*$NIjGbExOxF{2o<=eV=|+#HyHqqy;Cjgy4R_H)@yp7!J6|5BOJUP=-S#{LcQ+D%&+V!!9ToAMeH~oS>9Q?5{ zCdO$DpI!CcRh-uAW6yo4`_e%9n7BBg0X$zFOEaL-bD{p`<&eswI$QHo3MQvjRv&dA10-c&`TDz5$pQq0l5@rECDIUf(#V1~zf=@1XXbQJR-2M1?X$I)y9jOq7 zztfV}0vP_bD@PiPm5!F>N$7=Wbn5BsCvA@r2 z=g@CYnFt8F1I2@-WqFA{H*Xzc0FRGCj#{Mc008fv<-O+G$mlO}FF z^l_K>=HWfS<~BcMjb)R0h&8_Uc_2&}nv{QwKKSw3OIaEEtQKriP~ZKMg)SwyG%?rO zDMC2%>=6*rI;^{mVP&SLnBlFH5(E_AK;hZMoHWE8Jg#< zFPCx?w|O*ds#ezA4r7;%PcSHeX4n^Cx&Yc-7XbPivKvv7*RDAbnE9R8oNI$1ZkTA( zKZ(LHe`FglV04N;oKm}I=iW^rCa(V|0e(T_#u}W8#~K_w-Yb;5463Q3m;2QsjUG9* z@wl*Kwvvnzc8%Y9O1sT_D=^EpJt=f=;S<17>>>d|*}8Xj6xgM&ABZ{ad1++F_MnQ8 zmw*3z{?=xT0#K_#PiL6~j?4c}bYWcD9=P18U|4d<(tzzSGASwL$SX40{yw2GO5m7jk}YKwTdrR*U^UY+jOjOE7da{ES`#2(pdNEY8SH2~=$2-=r)lH4 zl%`?k;As*;0c_l~db-nc^lP}K?9!$6- zOIb|5CW}70PZs?R6H@d0rnbZ*)3XfLUV+KxxXXb70f)Fdp-D1QCxr8$4E;@LL}mzH zc@2-qh=ozGqHh=Vc)ia~Oadn7(fSoo??uZt0F_G2Hb{ty4!VoZ$;ZI=p6T)QY?5O= zdt6TLM4WL2A{b>D^FB24=v084@VLZ)AQM-H4+4;=HVxW9Yp3p{(@hC77zxf|VJo|J z!O^iLJ}!=1HFL`ouV0})FO!l=spfz;jVo4npG?Q&PizWuG@I4AiFb+}En7G_e=HBG zhL%4_aGB#)bz9y@!`{v9p7~7)7>hL=8{%6o;F;76hqm4tmjp4Y%;D%j`l^Q#AifyRn;P9Si(UK2ng+AJ z=Qibea1ROKGbNFsljew9#(wE*w5*ig`v6y)_GILn+r4@6KyhTpJZdCK3tmp6b>5yb zYxgc*oa+4kT^9Y^yKaqp+NSTkZQob}$Qc})OTC_DPrp#auHhr14lNuy)U|C_fH9em zX<@N#v`#l;b$vn1T5h=y>E9X^X=do(y^FJIh|o@h0UKB9;}wO4VV>OZLeno}5KxI% zpa~x;2p1DdRGq2K(<2FZRc0mBafj646u_o#Mi zdveRtOp=D(AY{s_{hH*YZF*W0RYR>PQA5^S&83D&3%C+RIJMA-sGN6vp@-c?#bKPO ze{F_VJu(%tz?MlsKVG3FUY)Q!Xkh{K6M^>fjp24<^-rT2u@(PPyuvV5CmoUgmg|+e z?c<}Oke7htg}w*JW`J1(3|wL2*CTqdtdh{Aj^tzpHYvv%^7(pe+D|W;5aK!?AB4f) zzFis=)x8rBf@$4y&>Z!=JZu5aFEX=asduh)p;5ZK8*$-kmOc#RRD7wGss)*oZ7tkH5a5c(vF7gS@Zj&oBc@dE$A>e5Hj2w<`xARH#BAg!cX=rZ|Ff>>!+teA3= z5RqI!uf5|R4;b1rhoQoL$qNkCUKd^6rUD~pLW13Lel_v@-$FP#3b(#}zgyrXpr$t~vg(V8f)5x#9;9N!sqwSN;{~O%;Zx z#SX0$qoPi>hR9>d0l40%O>LfQ_`z4iGb6e7YY%mM^C@$I=j=8rc>4_sptju?D?%z> zm^NJvZL%i};|$TxhK$kYfQl&GB7v);`S?f#Tee2!wkhrk$6vhoeq+8rUpR(R{6q|^ zd?lnNqPMz+tF8e9GAjA3L_16vey=sw058oB=I>uq(K@{j)?r(V>Z<`06>_B48C`FizMYHj2x&WpWA)B`4**hj+6}x5?=xW7rNl>`X zYo$-nCSj=N8{&)K3_rRp`76#ZuYKoRGbKJ4q0+di8~8)epa44LABv4jch2wUPO1^x84jrfpwg>L=JDaq zl~H;xeSY8f5WgDo_^m15^{H!pu%PcfmQujS(kVpM+a`htkrT}!=^nLjq71T4lGSEk zsXUU&sNR13YHe%WR~d2!C(Ld`Et_Fw$oj1_zC*faYlGZyRvR60fi-l8cZ<+YI=W2R zs2JwBF1X9Gjh$RRb@GK3MQR((c5olT#6mbSZdxKz9&J?~$N^Y?O+nh=GqH4lNLkL+f)#GKW&N)1Nadh=_^b{V2#m<5GJluDy4jxGe!oWc zev#{}?{*V1ukOi9zAyd#{dtK@=QfJ!bhW0o(adN5!}t1x#2y?wt-D%8M`!YPx*XQnNBtvtk!(fo74e*PUQ^Z9m~`*!utXH`Ar`W+57y1Cq)L7qnpK10UdV4!qFdcz5Ps z>rM?F^5_4LzvQ1U_UD5BS*89wz<<^?SO-qQsKr0)`JdO^pV#}J$KX%3_ovGJ^EQCD z;h#;KGBQ$Q8)ZFx1-_>N7LJmW>O~hX7E26k+Z@g0%yepM8vd& z#iT^e!GHW`MWoK2-Lrj(&#>3;*F0PoTO diff --git a/Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.pdf b/Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f2552d3183a0ac913c1afb2e319765a830f75660 GIT binary patch literal 12775 zcmc(Gby$>L*Dr$9kRl)`F(@f9L3ej|#{ffjmw=KA0@B?f-HoJ#gc1VMrF3_52A}u& zKHv8_=lae+=Q{Jp%wB7+9c!(7)?Vw{znex$OoAE0!UkXkf`RtNRzN;J00?H|U;%@& zgAoJ}Bq|I9vq0H_AQRYM4FQ3FNw9;}O0$F9^o9pFHa63oQ~?qmn}yYZU~xhE~{Tz(T!07%W!#?sFGZ%RbO z-UFzMmH|PpsxEK`AU8Jvr2V_a1^}tRo$XznOyJJG#{bDv@9R<3#$G++jEKz*3@bq{IBph3qb3AeS0LEDgcY8j>R!A@HG zfwG7iH4QbYH0Dy;{QNiPg>QF$U$4^Bs&C3#1s1lPUwyNm<=lIU#lW4pZL~>Gt$@LV z9gX&JeZ%s#FcQ9$8p%U~ti{#fc1MgK3tj*_RT4BTNvgcNrK~rvg&jT8UJ{15e;1{C zFpYO{i}o7nIdC|wja-?;(*NamlwG9Z$7mKgQD7$2dH`VO{cB$Cm3`M+ z--r9tM-STFcclQgxajna9bgA<^*e-X2n8ztOGi=+o-73mz6G!xG?;N~^0TnCOnS68JUX}EF(mm)nH zT00}YgEt957@nuUi$4tMd=trpS>OM`)8Oj??K2R%aC=7A1OK3oJLxmJOU>t8hwk9- z^Ax{=gP(s|lA`l}LG}QJ!VALJ;!7)86iQskRw3@^b3BBZWu_SZ z%a3k5LTY>4N4QGB#1ZE~kIor!ZWG6&a9`4Ma*_~)PAT-o1{#y6{- za$!M=?^Y?`?A!eQgIj$O${;#6?Di|eTirLGg-_2x`*%mg*SHsVFYd~j?lf=j>?Jqx z@Ix2e=G(|_1>HVABU`%ZMNwQw=el-U&)R2vb8V=}`or*9DY~=2pu?46F){8tLjs!I z$LZ@LMi5xk4?{054f0)7=LW3aDc(Er{I-JE<*)r;z}%I!&dbBlDN&JcB5~ThPs`2+ zP{T5&3~A|!+d>-_R&Hpz_KQ#V1inX|(uWxGGCXH_;BO38vIp?d>_>C8KM6N9Ku?^s z|BB+@DMg4&iQH~-iq4e{CTv4{B}sr3c&l;~-);m!!au@OCPVssD;kT0%kA=zTjxH|AznWpWa8PyjqI&Yb^q{{+|il$oGkk+cJ$k{18?^fAbGS_+I5D~J?Vg)ic%$O%3 z3AE9#BDJ{bER!+P6Z06VWfP3OFn6oEhuxwXxwuZAI**;tm2KQ6Zhz@g%4aDgpD0?G z*H(`&9q9AwbvX)qR5oRYRK?W#&4qU_OxLH+xCH*)5JQr*OpBb zb!CY_+sMUVvYhgh1~)k=DSnts#ARra|xeDLZBBE5R4-##YDMw|T^W{{lyu-@S;5;b3 zz;lT-Rvtx)m@U{MAIWl*>tt3=1qpyo#V9Hg9@BE+$8M|%3Qpk}`;3KH(ctIp(__8k zpW44@6i&n(E)bf$h~jJZmhW*X>5|TF%S?z?x{X=vcE5=4MSDGMY$ubslp&Fg6Ek#; zjncY5wpj9*Dp!Y*R)23{PzB-wBDD4;(Pv7nb`^wKB z#-r*NiG3JsRHJ`59?3gPF&bX~Ls5FQ8=%=5F)a@{P2(d8mvaddjo)=7|FU#j; zea0C~v>(NHTp*c&^}du>K?fzXAclkR6B7o6a;)}~dhW=)4|<9`nOtR6e8zAuh#4}D z%`)p@p17y%ClT+|aFD}YvOaU}G3g_`rPZ7}NS={p2BrU{l$iJ)y0LtzPH?#~*81V` zeqH-I;oLb*vV8UB(+|RIFLh7Yt~?2qn-i`xSI~#1A7kM%hEBs0Wb;RaT#%F&W1TGD zI+8~vDewkF=^R2b6htPs*WkY_=Gpj@ah)t0rts-kfEr2|4EYz-EX)la%N-5_26X9u zUMdppYdf_AtCexb0^iI0x5R^2oYOxYDxC@NzJ)uaPDmex;xa2HB5%)K<%l)*x%RH2 zO_4uItCn2RE0YiH(zZ)^#mT}r9nKpj!cTQEFsYx_B#LJ*M_C{`KaYCViq+&5@F0ou zWc^jyWo$Wlu5H8k2e#`0ja#e*`ngJ+^uDhO?}U$1dBXx|j_4#8HrIX*9v40o z#La9a^)!nBNvVoen0F-CGx#_ERAw%=Dbbe;pD)mr*Sr=zdf~vRx{6B0oErVQdADKM zv-k0x!e!hDVQY~CgRx1Dh&hSv0TNUvn=9KR*-COLBUujb^%M8GiZ3Pwz*H6-4uq^!~KbF_)j% zQYRTQil|xohJ9d|)>Ky(R*13p6Q>y)doU@8zeP}!NB79xa?_{iw0ic=1Jr+Hb%XQi zy@;~#?Pa6T|12{RTn>6%pmNH6xh+9s{%Id+EnWYkf-PaG+r z2%5{WgrP1xQ`)K=dofZf;(%V)lVjKMOjOx{*e%sTFB{xR7(x{~FJo_8IaQ9)EXTQO zA!NpJ72#0HRKDE-u~?;td?iX$>riFz6*}=M*>1SKkvz<_%Hp2$&OghTvVE7drh^?o zf!z%5FP3kZcsMc3wzuUGDOd4%UqVsULFRJ3^d&2i;v_{>R4zNXXk)&JYQrRv0@mDGh zGSevX0?4iyZ}BO~Xj*31j;8uPF<9~46bG=gzplNWrOVh+(T`#LwyW-)(=yNApyuPf zt*&J<8?Ruxq5mzUrEECby6I`jT>GG}+{<=I`!WD$px)>>iNZ~;95>hRx0UAdCjkA0nVdd&(XYMiYf3%4B-gc%WwNC`4m%N7JFD|HYLV&B$Rg}`+A2BnQkYDR zqB=Xk^15NgSu~|r^GJJ=v=W>z&c=%+gQkh)q#s1Y)QGu197~t|?%QaGBEUd~xBpP7 zb=ITbib*OPDMAy2DrYuDEqOidNMauiv}s`F8|Iz#O}NH3TIkN!Ij$wf%fL&Ql&3iIO|z!G((zP@{fR2U0-3{i z3J_u=_D5F1%0C%DOBjobrafpCob=O zbK$K#lRH^)4ZP|HZyH#W)ypT`|GVo z{H%4L9jInD=AjNo4F`$jl+C%*uKBk7k9LdkGLn^#Ve;GEoC_bB=zAXKcy(J|eR5G> zaG}qWm|8<&>Vb0)U*s~4Z5|b_$HGmjp>U;fM5SjVJ|afsV1(yw{pNVKCPxm9k*dRt2?*7AcdpVDX|$DAzuQs>`HI*NI) zu6Ii-JX6T#&NgCi-TZy`IZiHhi-JQNhrs^wY;Iu6o!Fc1!xe*o!+w!Nwe0Q1%fmS> z7Pb!qVeMaA*}vK8B_g%h5F04x-q<{^Kd?a_HdC49tqIWoG#R}@uxcm-y8sjvR{45* z?+_aP9w$E+E>cS3q8i_OWI^Whkr%5fjUT@vCE2}_WbQ+q!)=5eH*P-MN>tI*IvyEi9-b!(FCy0R zlp=<-Kqbk3d9YxR9R}B9C~~^cD)&_0n=Czg zL>%7bTGP2Y^Y&f8P4C&u7n4%O844UJAIP%1=uY*du|y=$Vh_13JO#Bkm?3_dIaCF3 zu2h8zTrbGwJh1jDSlt;qHmn*DfvQvjp(}GyAGA$ zTJh;5JOx4a5X!^esGw9mXli)gL|RR?T?&Rg^hN0iHJSz?|9K zgN=_ZuL9b(`ow7Uq->9SoV1{uG@o||;3mD=DN-`c*GKZ?Aor2o<%>y<29>%e z+SZtR*Ahbl4w7#GA-^=f6A&@#ssz@Hm#jf*yGK1+Y?2RuRg4!lcd^z!hQ>)!UJ3GH zp189P7(Bi-D6h|CTMnr0p1z>_+2eaT_1;#+v_iV44jGejjipG^EpU{Cy6}_NEy)41 z*~FAe*Tn89Rjhsyef5VhcQ^O;X|ZFgJa4nP&mE`B=>W{NBdo}X#C((lXP!4)LB}mI z8&ouP2R%fNOVARRW_7`^@O&w8E#3FX**RrB>92h^QWxzGMsDRvw3pUgsmRVpBo}dv z{Ib(*Jgg3n6(>~}tMhc5~7MenqZ~fUm4f@a9s?TvHf76GS)t#49c}re8tW zSbsRY^I)?FJ!1gs$f5D2G!f}~L2T$}KRs|ayvo~NUF26`Ztz&n>ha1X(dx2G=MTdSMf152N2uXRFQP7f^Cg$h*aq@PHrJqVY zXNyRqOvG}}=9A7|wyL!mdB1T>ubFc-Y3+s07t0Q4%a;k}vQ_fAEK2IE;|y#Jm-wQ?4XZdvwy?WDSD$b zw5RYhrS9ag>|!vYtog#LhJSOS_h1dj?^{g)jndFZiq;QemM;RF(-MjL`?a5#tgtZK z0+m6$^IwhfFCo?H&MO2TqJ=5!#ko#vP1rg2jv2hfPO51OFz}?C@OhF|%y~0k_S-oc z9_P=Z)be-L#`c=FJS(b#*0QMc2fU|q&Zvox6tBRxLB(+{ka1O5diurw`2AJR&XpML zR~-SP^`I_uVw#0wzA6pnuZE%8rN&Vy9n|5|`8!b47qf=@@3e+oOxL@#oLn?ig=%e5 z0C^@B4$~vo$96B!&)s8-sfEAIZztD@@@B-vQg=M8-^wVttKF0-upT z(T-&AJbY%jo5aW9jz?9vMprY`i2yr&6t?_q$bh2*#ueuXt`& z`+P;XvN02slR@V5m8}Pj$$9~r-)TZIk2R&M92Hf4y6l`*=#ad4v2?vR?&{A7XwlS| zD(#wUg8P6ad5L(O)!EE$ivnbg^>8{}UPl(VdGP!RB~iK)OSAYycF~uX^fOF0Aqzvw z;qk$b`f{}-^EKpZOgjpLKR6e+OIcOj%UE7`?>*ns|Di2Zzp#7M!+nU^RD6XG%wI9b zl>Akv5;^B(?FXCNAjnRAwp5MRABbkuMq50uKJsL&(k5|AUs{As9Z`B_^yM4|1TlohhQ>p%g}6+ZT@7; zl_mzC%}k_0qxKm0Ns9>vG>@d)-^<2V{XKd8;ZGYHyW z5vtWk$slE>RfssCVxUji{E@Yf@Am^uNKMLBf+>f|NLe#xT?A4CF}0UhG|_5XK8UR{qLdz5TlUN3lm$Z+E=xL=K^?&bw~| zA7}@L9e&S_6-g9XpMOpE+YyX$77m zI3Xf8nXi6uP{DS{Fp^bWgrq;1ck5Q#h8+xefTLpB!Yf#DQ2D}p-_K_rXUom;;**&D zOtASe;bVQ&rR0`@x&4|Q!v^=YUeV3=rNMP&0QV`i{E@P2Xh1Qkj?>iKjD=iX#;cAn z6+1)vnHSOLax2UMe&e53?FCLrA791U2c0hlF3ic%t$7T%vW^iCr5dLj@brfFJt(&1 z@o3+~_hT>KE6rA1m3iN&?RlKsvI5vEB+QGNAqR29ea4Jp^fVY_$mOy^sc4lNqy?$P zXc>zp!k(K-cYpO;$C;k3cq3-^a8}{$qbaXC_&DDo3C}x0wn z4Oc`i;cSS`$UhV_+Qpk9^kzo zu*-`aI&%f87)m?pSucLvu(fuY5U^$1=r?CxbbZ@gp}T4xd(_okg)tpT6R_?r9NM!} z)WoT!Jw~kf=FoRvtAFG%u5W~g>uS_ouLyiD!#Z+<;xhBIDB8P%j7gr@$0J4jasuQ( zH_R|@rKUA?j#skmsw8qDM!JDlX89K9RD$ojzlLU`>%yypcVNNv;KK z69`Te+U{_r1mb)9zIx{x=^tCqi!N)FKjH2gC#gLYv&ZacgiY?u8Z8SIZagcUv9_9<)-H|Z{H5(J7%OanehbP90en^Hq zjlu-oM+G;l>C5*1siIiEWu)*Huo(+*tmO2_4W~ckQWCS-(V#xgsLn!E((|?aaXkxgW04FbvB}U2TplP<>4gcWDDaZbV(3D>lCa(>5)4*j~_nvWkLIv z4Nb@wbR&4R<_{R*BWS^AhM)CFc}_QGnwW>Zs)mzc6@v`kjPEP+C3xstY}zQ7HpIsA zSuIUI!G8{t%l@nnZXQU_vDVf`lcrMexZKtD#>$oKBHgB#G5b+&So_%0rENrmbB_S` zFw^TG?l|u=3BfE=-rPmVQ2(vg5IWC<)AV5pn=6`pknO{3by&;{X&8BS)idZdjB>+H zVIG@rEFrVYhFpwb10@>NJ1$R)^l)aO#CM*+UV*VPuyIB_s!QR}OW80Sb&`tDsIc1} z3qL+$A}`hbC!fJ{ih-0z$F#lZ%@ZkRUQ~|_%?f3TEKSl+8SH?wvUShU=~{JdSl-G> z5S(w5(rE+CLk?2?^J)5oF;TmCuGd0%O4JDqvDjGzL+>;ceaEpDSJKo|)w?E^{2g=` zt15}AVee+bYXqzkUdfc8iWrm|Fg1`tl#_klv1VmZRhosmm!lZzF#K3UChrK2HxwYL zd_`SS!(ot>3=IpDm09(yk6AIq|KeTQy5uTtZ+m7_MpHFK>d4C_z?HgItg~LC)*qy4 z(`9;0wGzL8bJs(sSMQ>#VEopq5ZkZHhbw*dJe!4rb>aijIK|uO?+S%5)(Jg6K7Qpd zhAuV2@zrwzGs#WZ3`=>A4Zf+YCXy`U$X+jF3j+x=n`Xx6YP#*HsuKC}@rtXwS<k`@FqfTX?ab2|3ddxS><2fyQE*zdnSfvE44t zn%gKUxAV>JJG(xwtFxbBGCa){K82_(+@D@e%gTFk&!YU)Bo8WUq2VcNr0^9=H;ujVLo#=M6#dV;e6ByPssFmmm$0{U z5raFMI9WQl*gFA0_p}1c7J+S$kdPJ=6J->YmzRbhuB#Ck0&`~|;tKm-;x7;bGbh4fZ4c!2!I6weIV>?0=IJka&RLgMPUw7a7%Lw1j)q;0NpQh-^UEO@050d*;twg z+nL+I5gY^qfqbyl0CFM#6I%Zo#m0(&Qixi>oK)d1Kza}i^uD;4Fv{Y%B3VI`*7Xd07Y3pmMqgDtQs9*1g}Hms7tI z6r7Fqex}}-i7nKS2kp;%9{ZJBtHdGwHO{Hlg`eS>rF<=`c2lz2(_cM>I(gCj3SKlO z9nu9Qcw(Zc>kDeRx|fLcBa0^Bg=Gub0{)qqQhT{xti%w8F?K!as`v9~BjQ zr0@jh5H-T!$^U6umWv>+#ME;F{Lr1hlIWd6b`SZ8zPw(V+}eB{0sJxhrYno>!Frw6 zi}7{l=O7-hX2&?_Ef;20L}oE&$HJx88O^QeU?^?mp?xH!H>(vz|Jd00@lS5&&83F? zaa5Q33{CrjNjw2R?z`iCd7U)*nXvRy;s+L*FKLk5_iNfnJ9=XaGv{?4Lpqmi@03 zzSLJ@_=r!xF&GjcoL_#Z{F;|2T#3~beFmt5N)sCleF|&sGRk0x#A?%cn2(d-wy&D9 z(({l+CqtMK7YCfs!}OZ(jja$Cj@S}L2KzB2_vv+>1zjeJF2P>FBX9eFM*$bcqYaT2 zidEYxtwBKvQVe=EP_%4Jsbbu0jbIUb3y(e+$%{}GiKx-ufQp`|W!Vb)>4M7ozCFADpM&E88Sh+Q(A{Xk2DKe!}GYjPZh~Pq-bU8+TkEVJnYS4lsSupZs8!ba?;{X$mj_Wv$lhk4F)YayJzX zW%L%Ep3r$uyN`0b4gF_Shd}@MGye_IGKV8#CnCThBCa#=_um}>UiuSN1^^=PYfkni z_rX;c(G-&ag4Ez1E(kyxqUU#P{2fMA?n!YE7fDqY1d0rJ56%0{61BIncT#nLnZSP| z^OQtYfx3U=;DCr=?`CNNSCJIazek+iFZCBx4tNi&x*z`=(*`%Sg#9-jjvaxr;$nj$ z!keg*y~A%lgq@8Afn?)AghO^NL_maavmins;;ezPuyS(TpEph}|965)FsJ*&=iXHR z7AgN>I%x-l<^B~CA)FBI|2Zb^Xb;$}a1hR2F=ChiI|OJT7{ zsS6s8mWYmN2soYbmgbj}`ToOmuqMooNdOlQubjmb^lPgIe_c3MJ=vV|sPF6*hh(wJ zJ`c!#wN1qQCoFQ%-h9%s?n??wWoy#iG0FktfE1Rf+|x(4bL842o%Tx8%7d!tk{-4H z++cPvp+!dXT^-MELZgkYr}k>3W{cjZ@^=M$>h2v|1 z6hfnqkv=sU%;3XMK#VB0ZgI`|p|Wy9_CbendI#AlKGA^{meK{ip7ew>&Egt8>4R2e z(vK{j8n%Z{->f~%$A|Pd`|>A>$+Xb}J*ZTSn+p7ir|X96em!U3s%i3bW_~i%Vwpd$ z$97gXh}W$Z@X`{sM7=#2Fq`cv>lu|P{*(WUv)nZ1bPUSInHG@;J0W)=aW`NS-D*}1aq@fbI@7vl+X)?lU6Y+ zms}T$tF)TWfJ+rnDxA!uLYcd574ms(X^|hl&~l{5vZOx}$;S1PQ^QuEcVmjD#PJZD@+dW07|hL0hMErTVPqVH zH3UBUDtu&&Iz?;`BjDp9hhtQVjAMijAXT@p?|meZ z=AKf{3|1yW1nXKw62gvwhN3FqLlowIOnvgk4fV83hV#YlKp6NzbsEv&2mBBd`t5Xk zaSi7Hb=mVb7$M%!WVzuK-r@oZDtOb}c->S>g(ux~IYCJAI;8IA*!y#YZ9yfXCvEg4y#{}siWJugEw4;USAqz3CLw`w>wU%kvGVv zPih-H3)c@rZj{hkT2+|ziiO<~ZSxV;Bp9cN6gd=RWTZ^AtxB0%TLdn&ei280J7VyK zq@resSbl+{n^oMY0FY78SO;(7h*wlr*1Wka#3EqC@Vevt8FjViZL$4kxuQFmxQ@RB zebK+hNRG)xDD}H9o#>ppywd_I9XVfB`)ACa8dSW*v{hglzt9Kqof?cSCJ`GpYdPfJ zYC<%=gApAYZ?$D!<*fIBIeM;kd9`QHgFm*f0%r9BJvdUVEPPmlQohuE)5|Lw`at2w zYUt0_*Dju=hsB@2<%MoW9?3Y?Pev>k(X`px8zDHf$>`G|`=K=A<<&Q=R+%l6dZg2| zI2j9$XPrKemqo;gr9VqV144)QqpseMv}5 zVr-7BNkS$;ft48)gg-G}Pe}j_h z>29@L5;c~UvP0>E=wr;#Cv@);JfeQ!z$be}=tyL#6rT~Ts{8eB2YNkr;OW>w^>JYa zjBjn>#M-gm7`{_7WM8e{D@sn-D=UvJQJB*%xck;GsMdMY77)+oKtBAifJv|En6ojf z^HzvNr|ZmTp&)j{n~KnpaAo8$83#5C^#Y0RG)|<3)w2SMBTRlVJtXkpD8j4zcER(O zU(k*$_HyK+sdB7M4Ko%Lup_nnNF-!t-zLo%z)LUoXn!#@v&%@8r!-u2P=|4>5{vZN zncs_a?kTbYv-+RZrv$|BBQ`eKX9?|Gef^N}hTu+yK4fT*PK_+Yh}2z1JUjVHqUIb$ z_zCFDBVt0vw4KJy2w#3_NV`FK@(d;7pJ~MZK8tX^Pa|9rCnut4lC?BNR6oGq`GyK2 zPxzyr_!F`JR|+BuLsWS7=J$wca|De29|!NBXnIiuARSSD0_hQlFOZW3QTrfjJVbJ0 z>S}_(um2nOx2UDPo!EUcLNCSx1w)`!OZ}O!j&C> z0R8{#1N{99Gz0#{gMeAt5isxj576#!9u&fksI~r$cTXV7tN-9Z*#F661OMlIU@#)H z`Nvoe?tiSoh0yLl<+wOG|1p*u%!=^Dzwd<`%z;R{{*8xt^MLg~_XmMOA^*89g2(X( z&&3IbsJWd0_pfEBT6)3n?FUk^w?{l2f2D;WX*)A}1n~V|NfzQw1DKP`Z(Bp4tca?g LhDKab0`R{88VA&3 literal 0 HcmV?d00001 diff --git a/Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.png b/Triangulation/doc_tex/Triangulation_ref/fig/insert-increase-dim.png new file mode 100644 index 0000000000000000000000000000000000000000..2efa5a045830715485551eb2926d8abbce9f455a GIT binary patch literal 7143 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 TBiaoCD-^tQ-;U~S(Wm|iv$E-- literal 0 HcmV?d00001 diff --git a/Triangulation/doc_tex/Triangulation_ref/intro.tex b/Triangulation/doc_tex/Triangulation_ref/intro.tex index 3b80f048ffc..940191e3be5 100644 --- a/Triangulation/doc_tex/Triangulation_ref/intro.tex +++ b/Triangulation/doc_tex/Triangulation_ref/intro.tex @@ -29,7 +29,7 @@ with. A triangulation is a collection of vertices and full cells that are linked together through incidence and adjacency relations. Each full cell gives -access to its its incident vertices and to its its adjacent +access to its incident vertices and to its adjacent full cells. Each vertex gives access to one of its incident full cells. The vertices of a full cell are indexed in positive diff --git a/Triangulation/examples/Triangulation/delaunay.cpp b/Triangulation/examples/Triangulation/delaunay.cpp index 4d3228ce1c0..d53d923ace1 100644 --- a/Triangulation/examples/Triangulation/delaunay.cpp +++ b/Triangulation/examples/Triangulation/delaunay.cpp @@ -50,7 +50,7 @@ int main(int argc, char **argv) std::cout << " adding "< out(zone); c = t.locate(*++rand_it, lt, f, ft, v); - // previously inserted vertex v is a hint for point location (if defined) + // previously inserted vertex v is used as hint for point location (if defined) T::Facet ftc = t.compute_conflict_zone(*rand_it, c, out); std::cout< "< // Now, compute the conflict zone of v->point() in // the dark side. This is precisely the set of full_cells // that we have to glue back into the light side. - Dark_face dark_f = dark_side.make_empty_face(); + Dark_face dark_f = Face(dark_side.ambient_dimension()); Dark_facet dark_ft; typename Dark_triangulation::Locate_type lt; dark_s = dark_side.locate(v->point(), lt, dark_f, dark_ft); diff --git a/Triangulation/include/CGAL/Triangulation.h b/Triangulation/include/CGAL/Triangulation.h index 4a2e1d391b4..9754bec403d 100644 --- a/Triangulation/include/CGAL/Triangulation.h +++ b/Triangulation/include/CGAL/Triangulation.h @@ -121,11 +121,6 @@ public: // FACETS OPERATIONS - Face make_empty_face() const - { - return tds().make_empty_face(); - } - // works for Face_ = Facet and Face_ = Rotor. // NOT DOCUMENTED for the Rotor case... template< typename Face_ > diff --git a/Triangulation/include/CGAL/Triangulation_data_structure.h b/Triangulation/include/CGAL/Triangulation_data_structure.h index a46c1ed66a0..52d04256edc 100644 --- a/Triangulation/include/CGAL/Triangulation_data_structure.h +++ b/Triangulation/include/CGAL/Triangulation_data_structure.h @@ -301,11 +301,6 @@ public: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FACETS OPERATIONS - Face make_empty_face() const /* Concept */ - { - return Face(ambient_dimension()); - } - // works for Face_ = Facet and Face_ = Rotor. // NOT DOCUMENTED for the Rotor case... template< typename Face_ > diff --git a/Triangulation/test/Triangulation/tds.cpp b/Triangulation/test/Triangulation/tds.cpp index b0f193c08b1..9e54902e018 100644 --- a/Triangulation/test/Triangulation/tds.cpp +++ b/Triangulation/test/Triangulation/tds.cpp @@ -71,7 +71,7 @@ void test(const int d, const string & type) // << " ( current dimension is " << tds.current_dimension() << " )"; faces.clear(); std::back_insert_iterator out(faces); - tds.incident_upper_faces(vit, d, out); + tds.incident_faces(vit, d, out); typename Faces::iterator fit = faces.begin(); while( fit != faces.end() ) {