Merge pull request #8259 from loic-dubois/Hyperbolic_surface_triangulation_2-dubois

Hyperbolic surface triangulation 2 (new package)
This commit is contained in:
Sébastien Loriot 2025-04-03 19:18:58 +02:00
commit 6188aae5e5
56 changed files with 8525 additions and 7 deletions

View File

@ -71,6 +71,7 @@
\package_listing{Triangulation_on_sphere_2} \package_listing{Triangulation_on_sphere_2}
\package_listing{Periodic_2_triangulation_2} \package_listing{Periodic_2_triangulation_2}
\package_listing{Hyperbolic_triangulation_2} \package_listing{Hyperbolic_triangulation_2}
\package_listing{Triangulation_on_hyperbolic_surface_2}
\package_listing{Periodic_4_hyperbolic_triangulation_2} \package_listing{Periodic_4_hyperbolic_triangulation_2}
\package_listing{Triangulation_3} \package_listing{Triangulation_3}
\package_listing{TDS_3} \package_listing{TDS_3}

View File

@ -22,7 +22,6 @@
@article{ cgal:afh-pdecm-02, @article{ cgal:afh-pdecm-02,
author = "P. K. Agarwal and E. Flato and D. Halperin", author = "P. K. Agarwal and E. Flato and D. Halperin",
title = "Polygon Decomposition for Efficient Construction of {Minkowski} Sums", title = "Polygon Decomposition for Efficient Construction of {Minkowski} Sums",
@ -130,6 +129,21 @@
,update = "04.04 kettner" ,update = "04.04 kettner"
} }
@book{cgal:b-gdg-83,
title={The Geometry of Discrete Groups},
author={Beardon, A.F.},
series={Graduate texts in mathematics},
year={1983},
publisher={Springer}
}
@book{cgal:b-gscrs-92,
title={Geometry and Spectra of Compact Riemann Surfaces},
author={Peter Buser},
year={1992},
publisher={Springer}
}
@article{ cgal:bbp-iayed-01 @article{ cgal:bbp-iayed-01
,author = "H. Br{\"o}nnimann and C. Burnikel and S. Pion" ,author = "H. Br{\"o}nnimann and C. Burnikel and S. Pion"
,title = "Interval arithmetic yields efficient dynamic filters ,title = "Interval arithmetic yields efficient dynamic filters
@ -689,6 +703,33 @@ Mourrain and Monique Teillaud"
keywords = "Convex hull problem, Frame, Linear programming, Data envelopment analysis, Redundancy" keywords = "Convex hull problem, Frame, Linear programming, Data envelopment analysis, Redundancy"
} }
@inproceedings{despre2020flipping,
title={Flipping geometric triangulations on hyperbolic surfaces},
author={Despr{\'e}, Vincent and Schlenker, Jean-Marc and Teillaud, Monique},
booktitle={36th International Symposium on Computational Geometry},
year={2020},
url={https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.SoCG.2020.35}
}
@article{despre2022experimental,
title={Experimental analysis of {Delaunay} flip algorithms on genus two hyperbolic surfaces},
author={Despr{\'e}, Vincent and Dubois, Lo{\"\i}c and Kolbe, Benedikt and Teillaud, Monique},
year={2022},
url={https://inria.hal.science/hal-03665888v1/document}
}
@article{aigon2005hyperbolic,
title={Hyperbolic octagons and {Teichm{\"u}ller} space in genus 2},
author={Aigon-Dupuy, Aline and Buser, Peter and Cibils, Michel and K{\"u}nzle, Alfred F and Steiner, Frank},
journal={Journal of mathematical physics},
volume={46},
number={3},
year={2005},
publisher={AIP Publishing},
url = {https://doi.org/10.1063/1.1850177}
}
@article{cgal:dl-cginc-19, @article{cgal:dl-cginc-19,
author = {Despr\'{e}, Vincent and Lazarus, Francis}, author = {Despr\'{e}, Vincent and Lazarus, Francis},
title = {Computing the Geometric Intersection Number of Curves}, title = {Computing the Geometric Intersection Number of Curves},

View File

@ -230,6 +230,7 @@ def protect_accentuated_letters(authors):
.replace("ş", r"{\c{s}}") .replace("ş", r"{\c{s}}")
.replace("%", "") .replace("%", "")
.replace("đ", r"{\-d}") .replace("đ", r"{\-d}")
.replace("ï", r"{\"i}")
) )
try: try:
res.encode("ascii") res.encode("ascii")

View File

@ -170,7 +170,7 @@ public:
/// @} /// @}
/// \name /// \name
/// The following functions must be provided only if the methods of `Hyperbolic_Delaunay_triangulation_2` /// The following functions must be provided only if the methods of `CGAL::Hyperbolic_Delaunay_triangulation_2`
/// that return elements of the Voronoi diagram are instantiated: /// that return elements of the Voronoi diagram are instantiated:
/// @{ /// @{
Construct_hyperbolic_segment_2 construct_hyperbolic_segment_2_object(); Construct_hyperbolic_segment_2 construct_hyperbolic_segment_2_object();

View File

@ -15,7 +15,7 @@ namespace CGAL {
<img src="header.png" style="max-width:50%; width:50%;"/> <img src="header.png" style="max-width:50%; width:50%;"/>
</center> </center>
This package enables the computation of Delaunay triangulations of This package enables the computation of hyperbolic Delaunay triangulations of
point sets in the Poincar&eacute; disk model of the hyperbolic plane. point sets in the Poincar&eacute; disk model of the hyperbolic plane.
\section HT2_Poincare_model The Poincar&eacute; Disk Model of the Hyperbolic Plane \section HT2_Poincare_model The Poincar&eacute; Disk Model of the Hyperbolic Plane

View File

@ -6,6 +6,12 @@
### General Changes ### General Changes
- The minimal supported version of Boost is now 1.74.0. - The minimal supported version of Boost is now 1.74.0.
### 2D Triangulations on Hyperbolic Surfaces (new package)
- This package enables building and handling triangulations of closed orientable hyperbolic surfaces.
It offers functions for the generation of the triangulation from a convex fundamental domain,
the Delaunay flip algorithm and the construction of a portion of the lift of the triangulation
in the Poincaré disk. A method is offered that generates such domains in genus two.
### [Polygon Mesh Processing](https://doc.cgal.org/6.1/Manual/packages.html#PkgPolygonMeshProcessing) ### [Polygon Mesh Processing](https://doc.cgal.org/6.1/Manual/packages.html#PkgPolygonMeshProcessing)
- Added the function `CGAL::Polygon_mesh_processing::discrete_mean_curvature` and `CGAL::Polygon_mesh_processing::discrete_Guassian_curvature` to evaluate the discrete curvature at a vertex of a mesh. - Added the function `CGAL::Polygon_mesh_processing::discrete_mean_curvature` and `CGAL::Polygon_mesh_processing::discrete_Guassian_curvature` to evaluate the discrete curvature at a vertex of a mesh.
- Added the function `CGAL::Polygon_mesh_processing::angle_sum` to compute the sum of the angles around a vertex. - Added the function `CGAL::Polygon_mesh_processing::angle_sum` to compute the sum of the angles around a vertex.

View File

@ -0,0 +1,54 @@
// Copyright (c) 2016 GeometryFactory SARL (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Andreas Fabri
//
// Warning: this file is generated, see include/CGAL/license/README.md
#ifndef CGAL_LICENSE_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_H
#define CGAL_LICENSE_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_H
#include <CGAL/config.h>
#include <CGAL/license.h>
#ifdef CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE
# if CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
# if defined(CGAL_LICENSE_WARNING)
CGAL_pragma_warning("Your commercial license for CGAL does not cover "
"this release of the 2D Triangulations on Hyperbolic Surfaces package.")
# endif
# ifdef CGAL_LICENSE_ERROR
# error "Your commercial license for CGAL does not cover this release \
of the 2D Triangulations on Hyperbolic Surfaces package. \
You get this error, as you defined CGAL_LICENSE_ERROR."
# endif // CGAL_LICENSE_ERROR
# endif // CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
#else // no CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE
# if defined(CGAL_LICENSE_WARNING)
CGAL_pragma_warning("\nThe macro CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE is not defined."
"\nYou use the CGAL 2D Triangulations on Hyperbolic Surfaces package under "
"the terms of the GPLv3+.")
# endif // CGAL_LICENSE_WARNING
# ifdef CGAL_LICENSE_ERROR
# error "The macro CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE is not defined.\
You use the CGAL 2D Triangulations on Hyperbolic Surfaces package under the terms of \
the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR."
# endif // CGAL_LICENSE_ERROR
#endif // no CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_COMMERCIAL_LICENSE
#endif // CGAL_LICENSE_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_H

View File

@ -106,6 +106,7 @@ Three Three
Triangulation_2 2D Triangulation Triangulation_2 2D Triangulation
Triangulation_3 3D Triangulations Triangulation_3 3D Triangulations
Triangulation dD Triangulations Triangulation dD Triangulations
Triangulation_on_hyperbolic_surface_2 2D Triangulations on Hyperbolic Surfaces
Triangulation_on_sphere_2 2D Triangulation on Sphere Triangulation_on_sphere_2 2D Triangulation on Sphere
Visibility_2 2D Visibility Computation Visibility_2 2D Visibility Computation
Voronoi_diagram_2 2D Voronoi Diagram Adaptor Voronoi_diagram_2 2D Voronoi Diagram Adaptor

View File

@ -17,9 +17,7 @@ namespace CGAL {
This package enables the computation of Delaunay triangulations of the Bolza This package enables the computation of Delaunay triangulations of the Bolza surface, which is the most symmetric surface of genus 2. The Bolza surface is a hyperbolic closed compact orientable surface. For triangulations on general hyperbolic surfaces, we refer to the package \ref Chapter_Hyperbolic_Surface_Triangulations "2D Triangulations on Hyperbolic Surfaces".
surface, which is the most symmetric surface of genus 2. The Bolza surface is
a hyperbolic closed compact orientable surface.
A triangulation of the Bolza surface can be seen as a periodic A triangulation of the Bolza surface can be seen as a periodic
triangulation of the hyperbolic plane. triangulation of the hyperbolic plane.

View File

@ -11,4 +11,5 @@ Circular_kernel_2
Triangulation Triangulation
Hyperbolic_triangulation_2 Hyperbolic_triangulation_2
Number_types Number_types
Periodic_2_triangulation_2 Periodic_2_triangulation_2
Triangulation_on_hyperbolic_surface_2

View File

@ -0,0 +1,26 @@
cmake_minimum_required(VERSION 3.12...3.31)
project( Triangulation_on_hyperbolic_surface_2_Demo )
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
include_directories(${CMAKE_BINARY_DIR})
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
# CGAL and its components
find_package(CGAL REQUIRED COMPONENTS Core Qt6)
find_package(Qt6 QUIET COMPONENTS Widgets)
if (NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND)
message(STATUS "This project requires the Qt6 library, and will not be compiled.")
return()
endif()
# ui files, created with Qt Designer
qt6_wrap_ui(UIS drawing_window_description.ui)
add_executable( Triangulation_on_hyperbolic_surface_2_demo Triangulation_on_hyperbolic_surface_2_demo.cpp window.cpp ${UIS})
target_link_libraries(Triangulation_on_hyperbolic_surface_2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets )
cgal_add_compilation_test(Triangulation_on_hyperbolic_surface_2_demo)

View File

@ -0,0 +1,43 @@
#include "window.h"
#include <CGAL/Exact_rational.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_factory_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
using namespace CGAL;
typedef Simple_cartesian<Exact_rational> Kernel;
typedef Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef Hyperbolic_fundamental_domain_factory_2<Traits> Factory;
typedef Triangulation_on_hyperbolic_surface_2<Traits> Triangulation;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char** argv)
{
// 1. Generate the triangulation
Factory factory;
Domain domain = factory.make_hyperbolic_fundamental_domain_g2(time(NULL));
Triangulation triangulation = Triangulation(domain);
triangulation.make_Delaunay();
// 2. Draw the triangulation
QApplication app(argc, argv);
app.setApplicationName("Hyperbolic surfaces triangulation 2 Demo");
DemoWindow window;
window.item().draw_triangulation(triangulation);
window.show();
QStringList args = app.arguments();
args.removeAt(0);
return app.exec();
}

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>720</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Hyperbolic flips demo window</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QGraphicsView" name="graphicsView">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>771</width>
<height>671</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,269 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud
#include "window.h"
DemoWindowItem::DemoWindowItem()
: CGAL::Qt::GraphicsItem()
{
// Clear
edges_.clear();
// Prepare the pens
poincare_disk_pen_.setStyle(Qt::SolidLine);
poincare_disk_pen_.setWidth(8);
poincare_disk_pen_.setBrush(Qt::black);
edges_pen_.setStyle(Qt::SolidLine);
edges_pen_.setWidth(6);
edges_pen_.setBrush(Qt::blue);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DemoWindowItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem*,
QWidget*)
{
// 1. Draw the poincaré disk
QRectF circle_rect = QRectF(-poincare_disk_radius_in_pixels_-3,
-poincare_disk_radius_in_pixels_-3,
2*poincare_disk_radius_in_pixels_+6,
2*poincare_disk_radius_in_pixels_+6);
painter->setPen(poincare_disk_pen_);
painter->setBrush(QBrush());
painter->drawEllipse(circle_rect);
// 2. Draw the edges
painter->setBrush(QBrush());
painter->setPen(edges_pen_);
for (std::size_t i=0; i<edges_.size(); i++) {
draw_edge(painter, edges_[i].first, edges_[i].second);
}
}
QRectF DemoWindowItem::boundingRect() const {
return QRectF(-poincare_disk_radius_in_pixels_-3,
-poincare_disk_radius_in_pixels_-3,
poincare_disk_radius_in_pixels_+6,
poincare_disk_radius_in_pixels_+6);
}
void DemoWindowItem::modelChanged() {} // Only used by Qt : we don't need to fill it
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DemoWindowItem::draw_triangulation(Triangulation& triangulation)
{
typedef std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,
Point, Point, Point> > RealizationVector;
RealizationVector realized_triangles;
realized_triangles = triangulation.lift();
Point point_1, point_2, point_3;
for (typename RealizationVector::iterator it = realized_triangles.begin(); it != realized_triangles.end(); ++it) {
point_1 = std::get<1>(*it);
point_2 = std::get<2>(*it);
point_3 = std::get<3>(*it);
edges_.push_back(std::make_pair(point_1, point_2));
edges_.push_back(std::make_pair(point_2, point_3));
edges_.push_back(std::make_pair(point_3, point_1));
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DemoWindowItem::draw_point(QPainter* painter, Point position)
{
// First convert the point in doubles, well-scaled
double point_x = poincare_disk_radius_in_pixels_ * CGAL::to_double(position.x());
double point_y = poincare_disk_radius_in_pixels_ * CGAL::to_double(position.y());
// Then draw a small circle
QRectF circle_rect = QRectF(point_x-1, point_y-1, 3, 3);
painter->drawEllipse(circle_rect);
}
void DemoWindowItem::draw_edge(QPainter* painter, Point source, Point target)
{
// First convert the points coordinates to doubles
double src_x = CGAL::to_double(source.x());
double src_y = CGAL::to_double(source.y());
double tar_x = CGAL::to_double(target.x());
double tar_y = CGAL::to_double(target.y());
// 0. If src and tar are too colinear or too close from each other then draw a line
double determinant = src_x*tar_y - src_y*tar_x; // determinant of the matrix whose columns are the vectors src and tar : indicates colinearity
double distance_squared = (src_x-tar_x)*(src_x-tar_x) + (src_y-tar_y)*(src_y-tar_y);
if ((std::abs(determinant) < computation_treshold_squared) || (distance_squared < computation_treshold_squared)) {
// src and tar are too colinear or too close from each other
draw_line(painter, src_x, src_y, tar_x, tar_y);
return;
}
// 1. Compute the center of the circle supporting the geodesic between src and tar
// 1.a Inverse src and tar with respect to the unit circle and find the euclidean midpoints of the segments between respectively
// src and its inversion, and tar and its inversion
double src_norm_2 = src_x*src_x + src_y*src_y; // Can't be too close to zero because determinant was not
double tar_norm_2 = tar_x*tar_x + tar_y*tar_y; // Can't be too close to zero because determinant was not
double src_inv_x = src_x / src_norm_2;
double src_inv_y = src_y / src_norm_2;
double tar_inv_x = tar_x / tar_norm_2;
double tar_inv_y = tar_y / tar_norm_2;
// coordinates of the euclidean midpoints of the segments [src, src_inv] and [tar, tar_inv]
double src_mid_x = (src_x + src_inv_x) / 2;
double src_mid_y = (src_y + src_inv_y) / 2;
double tar_mid_x = (tar_x + tar_inv_x) / 2;
double tar_mid_y = (tar_y + tar_inv_y) / 2;
// 1.b Solve a system to find the intersection (center_x, center_y) of the bisectors of the two segments [src, src_inv] and [tar, tar_inv]:
// (center_x \\ center y) = (a & b \\ c & d)^{-1} \times (u_x \\ u_y)
// 1.b.i define the system
double a = src_x;
double b = src_y;
double c = tar_x;
double d = tar_y;
double u_x = a*src_mid_x + b*src_mid_y;
double u_y = c*tar_mid_x + d*tar_mid_y;
// 1.b.ii solve the system (just a matrix inversion)
double det = a*d-b*c; // Can't be too close to zero...
double center_x = (d*u_x - b*u_y) / det;
double center_y = (-c*u_x + a*u_y) / det;
// 2. draw the arc supported by the circle whose center is (center_x, center_y) and whose extremities are src and tar
draw_arc(painter, src_x, src_y, tar_x, tar_y, center_x, center_y);
}
void DemoWindowItem::draw_line(QPainter* painter,
double point_1_x, double point_1_y,
double point_2_x, double point_2_y)
{
// Convert to doubles and scale by the radius of the poincaré disk
double src_x = poincare_disk_radius_in_pixels_ * point_1_x;
double src_y = poincare_disk_radius_in_pixels_ * point_1_y;
double tar_x = poincare_disk_radius_in_pixels_ * point_2_x;
double tar_y = poincare_disk_radius_in_pixels_ * point_2_y;
// Actual drawing
QLineF line (src_x, src_y, tar_x, tar_y);
painter->drawLine(line);
}
void DemoWindowItem::draw_arc(QPainter* painter,
double point_1_x, double point_1_y,
double point_2_x, double point_2_y,
double center_x, double center_y)
{
// Draws the arc supported by the circle whose center is (center_x, center_y) and whose extremities are src and tar
// 1. Scale by the radius of the poincaré disk
double src_x = poincare_disk_radius_in_pixels_ * point_1_x;
double src_y = poincare_disk_radius_in_pixels_ * point_1_y;
double tar_x = poincare_disk_radius_in_pixels_ * point_2_x;
double tar_y = poincare_disk_radius_in_pixels_ * point_2_y;
double xc = poincare_disk_radius_in_pixels_ * center_x;
double yc = poincare_disk_radius_in_pixels_ * center_y;
// 2. Define the radius of the circle and the box [xm, xM] \times [ym, yM] bounding the circle
double circle_radius = sqrt((point_1_x-center_x)*(point_1_x-center_x) + (point_1_y-center_y)*(point_1_y-center_y));
double xm = poincare_disk_radius_in_pixels_ * (center_x - circle_radius);
double xM = poincare_disk_radius_in_pixels_ * (center_x + circle_radius);
double ym = poincare_disk_radius_in_pixels_ * (center_y - circle_radius);
double yM = poincare_disk_radius_in_pixels_ * (center_y + circle_radius);
// If the source and the target are too close from each other (less than 10 pixels) or if the circle is very big then just draw a line
double dist_sq = (src_x-tar_x)*(src_x-tar_x) + (src_y - tar_y)*(src_y-tar_y);
double rad_sq = (xM-xc)*(xM-xc) + (yM-yc)*(yM-yc);
if ((dist_sq < 100) || (rad_sq > 1000 * dist_sq)) {
QLineF line (src_x, src_y, tar_x, tar_y);
painter->drawLine(line);
return;
}
// 3. Compute angles (needed because we will draw using QPainter::drawArc)
// src_angle is the argument, in degrees, of point_1 - center
// tar_angle is the argument, in degrees, of point_2 - center
double src_angle = deg_angle(src_x - xc, src_y - yc);
double tar_angle = deg_angle(tar_x - xc, tar_y - yc);
src_angle = 360 - src_angle; // Because of y-axis inversion
tar_angle = 360 - tar_angle; // Because of y-axis-inversion
// Compute the sweep angle (see QPainter::drawArc)
double sweep_angle = tar_angle - src_angle;
while (sweep_angle > 180)
sweep_angle -= 360;
while (sweep_angle < -180)
sweep_angle += 360;
// 4. Actual Drawing
QRectF bbox_rect (xm, ym, xM-xm, yM-ym);
painter->drawArc(bbox_rect, src_angle*16, sweep_angle*16);
}
double DemoWindowItem::deg_angle(double x, double y)
{
// To avoid problems when further division by x (ok since x^2 + y^2 not too small) :
if (x*x < computation_treshold_squared) {
if (y>0) return 90;
return -90;
}
double angle = 180. * std::atan(y / x) / M_PI;
if (x < 0) {
return angle + 180.;
}
return angle;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DemoWindow::DemoWindow() : DemosMainWindow()
{
setupUi(this); // Method automatically generated by the ui file and here inherited from Ui::MainWindow. Builds the window and the contents for us...
this->graphicsView->setScene(&scene_); // ... in particular graphicsView is already constructed : we just put our scene in it and then do things within the scene
scene_.setItemIndexMethod(QGraphicsScene::NoIndex);
scene_.setSceneRect(-600, -600, 1200, 1200);
item_ = new DemoWindowItem();
scene_.addItem(item_);
this->graphicsView->scale(0.5, -0.5); // Y-axis inversion
setWindowTitle("Hyperbolic surfaces triangulation 2 Demo");
}
DemoWindowItem& DemoWindow::item()
{
return *item_;
}
void DemoWindow::keyPressEvent(QKeyEvent*) {}

View File

@ -0,0 +1,107 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud
#ifndef CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_DEMO_WINDOW
#define CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_DEMO_WINDOW
// Qt headers
#include <CGAL/Qt/utility.h>
#include <CGAL/Qt/GraphicsItem.h>
#include <CGAL/Qt/DemosMainWindow.h>
// UI generated header
#include "ui_drawing_window_description.h"
#include <CGAL/Exact_rational.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
typedef CGAL::Simple_cartesian<CGAL::Exact_rational> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef Traits::Hyperbolic_point_2 Point;
typedef CGAL::Triangulation_on_hyperbolic_surface_2<Traits> Triangulation;
class DemoWindowItem
: public CGAL::Qt::GraphicsItem
{
Q_OBJECT // Qt macro for Qt objects
// (Q_OBJECT does not support templates)
private:
typedef CGAL::Bbox_2 Bbox_2; // "Bounding box": just a box type used for drawing
// Edges to draw
std::vector<std::pair<Point,Point> > edges_;
// Pens for drawing
QPen poincare_disk_pen_;
QPen edges_pen_;
// radius of the poincaré disk
const int poincare_disk_radius_in_pixels_ = 600;
// Approximation treshold: used to decide when to simplify a computation (ex: draw a line
// instead of an arc if an hyperbolic segment is very small)
const double computation_treshold = 0.001;
const double computation_treshold_squared = computation_treshold*computation_treshold;
public:
// Initializer
DemoWindowItem();
// Qt methods
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
QRectF boundingRect() const;
void modelChanged();
// Drawing method
void draw_triangulation(Triangulation& triangulation);
private:
// Sub-methods for drawing edges and vertices
void draw_point(QPainter* painter, Point position);
void draw_edge(QPainter* painter, Point source, Point target);
void draw_line(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y);
void draw_arc(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y, double center_x, double center_y);
double deg_angle(double x, double y);
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class DemoWindow
: public CGAL::Qt::DemosMainWindow,
public Ui::MainWindow
{
Q_OBJECT // Qt macro for Qt objects
// (Q_OBJECT does not support templates)
private:
QGraphicsScene scene_;
DemoWindowItem* item_;
public:
DemoWindow();
DemoWindowItem& item();
// Events handling
void keyPressEvent(QKeyEvent* event);
};
#endif // CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_DEMO_WINDOW

View File

@ -0,0 +1,14 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses
\cgalModels{ComplexNumber}
\tparam FT is the field type and must be a model of `FieldNumberType`.
*/
template <class FT>
class Complex_number {
};
} // namespace CGAL

View File

@ -0,0 +1,116 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses
represents a fundamental domain of a closed orientable hyperbolic surface.
The domain is given as a polygon \f$ P \f$ represented by the list of its vertices in the Poincaré disk model,
together with a pairing of the sides of \f$ P \f$.
The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$.
The side pairings are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side.
\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`.
\sa `Hyperbolic_fundamental_domain_factory_2`
*/
template<class Traits>
class Hyperbolic_fundamental_domain_2
{
public:
/// \name Types
/// @{
/*!
Point type.
*/
typedef typename Traits::Hyperbolic_point_2 Point;
/// @}
/// \name Creation
/// @{
/*!
Default constructor
*/
Hyperbolic_fundamental_domain_2();
/*!
Constructor from vertices and pairings ranges.
\tparam PointRange a model of the concepts `RandomAccessContainer` whose `value_type` is `Point`.
\tparam PairingRange a model of the concepts `RandomAccessContainer` whose `value_type` is `std::size_t`.
*/
template<class PointRange, class PairingRange>
Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings);
/// @}
/// \name Access Functions
/// @{
/*!
returns the number of vertices (equivalently, the number of sides) of the domain.
\pre <code> Hyperbolic_fundamental_domain_2< Traits >::is_valid() </code>
*/
std::size_t size() const;
/*!
returns the i-th vertex.
\pre <code> is_valid() </code>
*/
const Point& vertex(std::size_t i) const;
/*!
returns the index of the side paired to the i-th side.
\pre <code> is_valid() </code>
*/
std::size_t paired_side(std::size_t i) const;
/*!
returns the isometry that maps the side paired to side \f$ i \f$ to side \f$ i \f$.
\pre <code> is_valid() </code>
*/
Hyperbolic_isometry_2<Traits> side_pairing(std::size_t i) const;
/// @}
/// \name Validity
/// @{
/*!
checks that the number of vertices is even, that there are as many side pairings as vertices,
and that the vertices all lie within the open unit disk.
*/
bool is_valid() const;
/// @}
};
} // namespace CGAL
/// \name Input/Output
/// @{
/*!
\brief inserts the domain in a stream.
The format of the output is the following.
The first line prints the number \f$n\f$ of vertices of the domain.
For \f$ i=0 \f$ to \f$ n-1 \f$ the index of the side paired to side \f$ i \f$ is printed on a separate line.
For \f$ i=0 \f$ to \f$ n-1 \f$ the i-th vertex is printed on a separate line.
\pre <code> is_valid() </code>
*/
std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2<Traits>& domain);
/*!
\brief extracts the domain from a stream.
The format of the input must be the same as the format of the output of 'operator<<()'.
*/
std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2<Traits>& domain);
/// @}

View File

@ -0,0 +1,38 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses
Factory class, whose only purpose is to construct random fundamental domains of
closed orientable hyperbolic surfaces.
The function `make_hyperbolic_fundamental_domain_g2()` constructs such a domain for
a surface of genus two.
\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`.
*/
template<class Traits>
class Hyperbolic_fundamental_domain_factory_2
{
public:
/// \name Creation
/// @{
/*!
Constructor.
*/
Hyperbolic_fundamental_domain_factory_2();
/// @}
/// \name Generation of a domain in genus two.
/// @{
/*!
randomly generates a convex domain of a closed orientable hyperbolic surface of genus two from a seed.
*/
Hyperbolic_fundamental_domain_2<Traits> make_hyperbolic_fundamental_domain_g2(unsigned int seed);
/// @}
};
} // namespace CGAL

View File

@ -0,0 +1,105 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses
represents an isometry in the Poincaré disk model.
The isometry \f$ f \f$ is represented by a list \f$ (c_0, c_1, c_2, c_3) \f$ of complex numbers,
so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ z \f$ in the open unit disk.
Functionalities are offered to compose isometries, and apply an isometry to a point.
\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`.
*/
template<class Traits>
class Hyperbolic_isometry_2
{
public:
/// \name Types
/// @{
/*!
Complex number type.
*/
typedef typename Traits::Complex Complex_number;
/*!
Point type.
*/
typedef typename Traits::Hyperbolic_point_2 Point;
/// @}
/// \name Creation
/// @{
/*!
Default constructor to the identity.
*/
Hyperbolic_isometry_2();
/*!
Constructor from coefficients.
*/
Hyperbolic_isometry_2(const Complex_number& c0,
const Complex_number& c1,
const Complex_number& c2,
const Complex_number& c3);
/// @}
/*!
sets the isometry to the identity.
*/
void set_to_identity();
/*!
sets the coefficients of the isometry.
\warning The implementation does not check that the resulting transformation is an isometry.
*/
void set_coefficients(const Complex_number& c0,
const Complex_number& c1,
const Complex_number& c2,
const Complex_number& c3);
/*!
sets a particular coefficient of the isometry.
\warning The implementation does not check that the resulting transformation is an isometry.
*/
void set_coefficient(int index, const Complex_number& coefficient);
/// \name Access Functions
/// @{
/*!
returns the index-th coefficient.
*/
const Complex_number& get_coefficient(int index) const;
/// @}
/// \name Operations
/// @{
/*!
evaluates the isometry at point \f$ p \f$.
*/
Point evaluate(const Point& p) const;
/*!
evaluates the isometry at point \f$ p \f$.
*/
Point operator()(const Point& p) const;
/*!
returns the composition of two isometries.
*/
template<class Traits>
Hyperbolic_isometry_2<Traits> operator*(const Hyperbolic_isometry_2<Traits>& iso1,
const Hyperbolic_isometry_2<Traits>& iso2);
/// @}
};
} // namespace CGAL

View File

@ -0,0 +1,13 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2TraitsClasses
\tparam HyperbolicTraits must be a model of `HyperbolicDelaunayTriangulationTraits_2`.
\cgalModels{HyperbolicSurfaceTraits_2}
*/
template<class HyperbolicTraits>
class Hyperbolic_surface_traits_2 : public HyperbolicTraits {};
} // namespace CGAL

View File

@ -0,0 +1,258 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses
This item defines attributes of edges that are of type `Complex_number` reprensenting cross-ratios.
\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`.
\cgalModels{GenericMapItems}
*/
template<class Traits>
struct Combinatorial_map_with_cross_ratios_item
{
template <class CMap>
struct Dart_wrapper
{
typedef Cell_attribute<CMap, Complex_number<typename Traits::FT> > Edge_attrib;
typedef std::tuple<void, Edge_attrib, void> Attributes;
};
};
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses
represents a triangulation of a closed orientable hyperbolic surface.
The class provides functions such as the generation of the triangulation from a convex fundamental domain,
the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane.
\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`.
\tparam Attributes must be a model of `GenericMapItems` whose edges are
decorated with complex numbers to represent cross ratios.
*/
template<class Traits, class Attributes = Combinatorial_map_with_cross_ratios_item<Traits> >
class Triangulation_on_hyperbolic_surface_2
{
public:
/// \name Types
/// @{
/*!
Type of combinatorial map whose edges are decorated with complex numbers.
*/
typedef Combinatorial_map<2, Attributes> Combinatorial_map_with_cross_ratios;
/*!
Combinatorial map dart descriptor type.
*/
typedef typename Combinatorial_map_with_cross_ratios::Dart_descriptor Dart_descriptor;
/*!
Combinatorial map dart const descriptor type.
*/
typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor;
/*!
Range of one dart for each vertex (that is 0-cell) of the combinatorial map.
*/
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> Vertex_range;
/*!
Range of one dart for each edge (that is 1-cell) of the combinatorial map.
*/
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> Edge_range;
/*!
Range of one dart for each face (that is 2-cell) of the combinatorial map.
*/
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> Face_range;
/*!
Range of one dart for each vertex (that is 0-cell) of the combinatorial map.
*/
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<0> Vertex_const_range;
/*!
Range of one dart for each edge (that is 1-cell) of the combinatorial map.
*/
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> Edge_const_range;
/*!
Range of one dart for each face (that is 2-cell) of the combinatorial map.
*/
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range;
/*!
Point type.
*/
typedef typename Traits::Hyperbolic_point_2 Point;
/*!
stores a dart \f$ d \f$ of the combinatorial map, belonging to a triangle \f$ t \f$,
and stores the three vertices of a lift of \f$ t \f$ in the hyperbolic plane.
*/
struct Anchor
{
typename Combinatorial_map_with_cross_ratios::Dart_descriptor dart;
typename Traits::Hyperbolic_point_2 vertices[3];
};
/// @}
/// \name Creation
/// @{
/*!
Default constructor.
*/
Triangulation_on_hyperbolic_surface_2() {};
/*!
Constructor from a convex fundamental domain: triangulates the polygon of
the domain. (The triangulation is defined by adding an internal edge
between domain.vertex(size-1) and the other vertices. The anchor has the
three vertices of indices size-1, 0 and 1 and the dart is the one between
the vertices of indices size-1 and 0.)
*/
Triangulation_on_hyperbolic_surface_2(const Hyperbolic_fundamental_domain_2<Traits>& domain);
/*!
Constructor from a decorated combinatorial map and an anchor.
*/
Triangulation_on_hyperbolic_surface_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& an_anchor);
/// @}
/// \name Assignment
/// @{
/*!
\pre <code> other.is_valid() </code>
*/
Triangulation_on_hyperbolic_surface_2& operator=(Triangulation_on_hyperbolic_surface_2 other);
/// @}
/// \name Access Functions
/// @{
/*!
returns the decorated combinatorial map.
*/
Combinatorial_map_with_cross_ratios& combinatorial_map();
/*!
returns whether the triangulation has an anchor or not.
\pre <code> is_valid() </code>
*/
bool has_anchor() const;
/*!
returns the anchor.
\pre <code> is_valid() && has_anchor() </code>
*/
Anchor& anchor();
/*!
returns the anchor.
\pre <code> is_valid() && has_anchor() </code>
*/
const Anchor& anchor() const;
/*!
returns the range of vertices.
*/
Vertex_range vertices_range();
/*!
returns the range of edges.
*/
Edge_range edges_range();
/*!
returns the range of faces.
*/
Face_range faces_range();
/*!
returns the range of vertices.
*/
Vertex_const_range vertices_const_range() const;
/*!
returns the range of edges.
*/
Edge_const_range edges_const_range() const;
/*!
returns the range of faces.
*/
Face_const_range faces_const_range() const;
/// @}
/// \name Delaunay Flip Algorithm
/// @{
/*!
returns whether the edge supported by the dart is Delaunay flippable or not. An edge \f$ e \f$
is Delaunay flippable if the imaginary part of its cross ratio is positive.
\pre <code> is_valid() </code>
*/
bool is_Delaunay_flippable(Dart_descriptor dart) const;
/*!
flips the edge supported by the dart.
\pre <code> is_valid() </code>
*/
void flip(Dart_descriptor dart);
/*!
determines if the triangulation is a valid Delaunay triangulation.
*/
bool is_Delaunay() const;
/*!
applies the Delaunay flip algorithm: flips Delaunay-flippable edges until there is no such edge anymore.
\pre <code> is_valid() </code>
*/
int make_Delaunay();
/// @}
/// \name Lifting
/// @{
/*!
lifts the triangulation in the hyperbolic plane.
Returns, for every triangle \f$ t \f$ of the triangulation, one of the darts of \f$ t \f$ in the combinatorial map of the triangulation, together with a triple \f$ p,q,r \f$ of points in the hyperbolic plane.
The points \f$ p,q,r \f$ are the vertices of a lift of \f$ t \f$ in the hyperbolic plane.
If the center parameter is set to true, then one of the vertices of the anchor is translated to the origin \f$ 0 \f$.
\pre <code> is_valid() && has_anchor() </code>
*/
std::vector<std::tuple<Dart_const_descriptor, Point, Point, Point>> lift(bool center=true) const;
/// @}
/// \name Validity
/// @{
/*!
checks that the underlying combinatorial map \f$ M \f$ has no boundary and calls the is_valid method of \f$ M \f$.
If there is an anchor, then checks that the dart descriptor of the anchor does indeed point to a dart of \f$ M \f$,
and checks that the three vertices of the anchor lie within the open unit disk.
*/
bool is_valid() const;
/// @}
};
} // namespace CGAL

View File

@ -0,0 +1,63 @@
namespace CGAL {
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2InputOutput
inserts the triangulation in a stream.
The format of the output is the following.
Each dart of the triangulation is given an index between \f$ 0 \f$ and \f$ n-1 \f$, where \f$ n \f$
is the number of darts of the triangulation.
The first line contains the number \f$ n \f$ of darts.
The next line contains either 'yes' or 'no' and tells whether the triangulation has an anchor.
If the triangulation has an anchor, then the four next lines print the index of the dart of the anchor,
and the three vertices of the anchor.
Then, for every triangle \f$ t \f$, the indices of the three darts of \f$ t \f$ are printed on three distinct lines.
Finally, for every edge \f$ e \f$, the indices of the two darts of \f$ e \f$ are printed on two distinct lines, followed by a third line on which the cross ratio of \f$ e \f$ is printed.
\pre <code> Triangulation_on_hyperbolic_surface_2<Traits>::is_valid() </code>
*/
std::ostream& operator<<(std::ostream& s, const Triangulation_on_hyperbolic_surface_2<Traits>& triangulation);
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2InputOutput
extracts the triangulation from a stream.
The format of the input should be the same as the format of the output of
the '<<' operator for Triangulation_on_hyperbolic_surface_2.
*/
std::istream& operator>>(std::istream& s, Triangulation_on_hyperbolic_surface_2<Traits>& triangulation);
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2InputOutput
inserts the domain in a stream.
The format of the output is the following.
The first line prints the number \f$n\f$ of vertices of the domain.
For \f$ i=0 \f$ to \f$ n-1 \f$ the index of the side paired to side \f$ i \f$ is printed on a separate line.
For \f$ i=0 \f$ to \f$ n-1 \f$ the i-th vertex is printed on a separate line.
\pre <code> Hyperbolic_fundamental_domain_2< Traits >::is_valid() </code>
*/
std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2<Traits>& domain);
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2InputOutput
extracts the domain from a stream.
The format of the input must be the same as the format of the output of
the '<<' operator for Hyperbolic_fundamental_domain_2.
*/
std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2<Traits>& domain);
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2InputOutput
inserts the isometry in a stream.
*/
std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2<Traits>& isometry);
} // namespace CGAL

View File

@ -0,0 +1,113 @@
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2Concepts
\cgalConcept
Describes a complex number type over a `FieldNumberType` for its real and imaginary parts.
\cgalRefines{Field}
\cgalHasModelsBegin
\cgalHasModels{CGAL::Complex_number}
\cgalHasModelsEnd
*/
class ComplexNumber
{
public:
/// \name Types
/// @{
/*!
Number type for real and imaginary parts: must be a model of `FieldNumberType`.
*/
typedef unspecified_type FT;
/// @}
/// \name Creation
/// @{
/*!
Default constructor, sets the both the real part and the imaginary part to \f$ 0 \f$.
*/
ComplexNumber();
/*!
Constructor, sets the real part to <code> real_part </code> and the imaginary part to \f$ 0 \f$.
*/
ComplexNumber(const FT& real_part);
/*!
Constructor, sets the real part to <code> real_part </code> and the imaginary part to <code> imaginary_part </code>.
*/
ComplexNumber(const FT& real_part, const FT& imaginary_part);
/*!
Constructor, sets the real part to <code> real_part </code> and the
imaginary part to <code> imaginary_part </code>. FT must be
constructible from U and V.
*/
template<class U,class V>
ComplexNumber(U&& real_part, V&& imaginary_part);
/// @}
/// \name Getter and Setter
/// @{
/*!
sets the real part to <code> real_part </code>.
*/
void real(const FT& real_part);
/*!
sets the imaginary part to <code> imaginary_part </code>.
*/
void imag(const FT& imaginary_part);
/*!
returns the real part.
*/
FT real() const;
/*!
returns the imaginary part.
*/
FT imag() const;
/// @}
/// \name Operations
/// @{
/*!
Copy operator.
*/
ComplexNumber operator=(const ComplexNumber& other) const;
/*!
writes the complex in a stream.
*/
std::ostream& operator<<(std::ostream& s, const ComplexNumber& z);
/*!
reads the complex from a stream.
*/
void operator>>(std::istream& s, ComplexNumber& z);
/// @}
/// \relates ComplexNumber
/// @{
/*!
returns the square of the modulus.
*/
FT norm(ComplexNumber z) const;
/*!
returns the conjugate.
*/
ComplexNumber conj(ComplexNumber z) const;
/// @}
};

View File

@ -0,0 +1,26 @@
/*!
\ingroup PkgHyperbolicSurfaceTriangulation2Concepts
\cgalConcept
This traits class must have a type for complex numbers.
\cgalRefines{HyperbolicDelaunayTriangulationTraits_2}
\cgalHasModelsBegin
\cgalHasModels{CGAL::Hyperbolic_surface_traits_2}
\cgalHasModelsEnd
*/
class HyperbolicSurfaceTraits_2
{
public:
/// \name Types
/// @{
/*!
represents a complex number, model of `ComplexNumber`,
over the field `HyperbolicSurfaceTraits_2::FT` for its real and imaginary parts.
*/
typedef unspecified_type Complex;
/// @}
};

View File

@ -0,0 +1,12 @@
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
EXTRACT_PRIVATE = NO
PROJECT_NAME = "CGAL ${CGAL_CREATED_VERSION_NUM} - 2D Triangulations on Hyperbolic Surfaces"
IMAGE_PATH += ${CGAL_PACKAGE_DOC_DIR}/fig/cover.svg
# custom options for this package
#EXTRACT_ALL = true
#HIDE_UNDOC_MEMBERS = true
#HIDE_UNDOC_CLASSES = true

View File

@ -0,0 +1,60 @@
/// \defgroup PkgHyperbolicSurfaceTriangulation2Ref 2D Triangulations on Hyperbolic Surfaces Reference
/// \defgroup PkgHyperbolicSurfaceTriangulation2Concepts Concepts
/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref
/// \defgroup PkgHyperbolicSurfaceTriangulation2MainClasses Main Classes
/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref
/// \defgroup PkgHyperbolicSurfaceTriangulation2TraitsClasses Traits Classes
/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref
/// \defgroup PkgHyperbolicSurfaceTriangulation2InputOutput Input/Output Functions
/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref
/*!
\addtogroup PkgHyperbolicSurfaceTriangulation2Ref
\cgalPkgDescriptionBegin{2D Triangulations on Hyperbolic Surfaces,PkgHyperbolicSurfaceTriangulation2}
\cgalPkgPicture{cover.svg}
\cgalPkgSummaryBegin
\cgalPkgAuthors{Vincent Despré, Loïc Dubois, Marc Pouget and Monique Teillaud}
\cgalPkgDesc{This package enables building and handling triangulations of closed orientable hyperbolic surfaces. It offers functions for the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm and the construction of a portion of the lift of the triangulation in the Poincaré disk. A method is offered that generates such domains in genus two.}
\cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref}
\cgalPkgSummaryEnd
\cgalPkgShortInfoBegin
\cgalPkgSince{6.1}
\cgalPkgDependsOn{\ref PkgCombinatorialMaps}
\cgalPkgBib{cgal:y-t2}
\cgalPkgLicense{\ref licensesGPL "GPL"}
\cgalPkgDemo{2D Triangulations on Hyperbolic Surfaces,nofilefornow.zip}
\cgalPkgShortInfoEnd
\cgalPkgDescriptionEnd
\cgalClassifedRefPages
\cgalCRPSection{Concepts}
- `HyperbolicSurfaceTraits_2` is the concept for the template parameter of most classes of the package.
- `ComplexNumber` describes a complex number type.
\cgalCRPSection{Classes}
- `CGAL::Triangulation_on_hyperbolic_surface_2` represents a triangulation of a closed orientable hyperbolic surface. It offers functions for the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm and the construction of a portion of the lift of the triangulation in the Poincaré disk.
- `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface.
- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex domains of surfaces of genus two.
- `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point.
Models for `HyperbolicSurfaceTraits_2` and `ComplexNumber` are provided: `CGAL::Hyperbolic_surface_traits_2` and `CGAL::Complex_number`.
\cgalCRPSection{Input/Output Functions}
- `operator<<` and `operator>>` are overloaded for several classes of the package.
*/

View File

@ -0,0 +1,161 @@
\page Chapter_Hyperbolic_Surface_Triangulations Triangulations of Hyperbolic Surfaces
namespace CGAL {
/*!
\mainpage User Manual
\anchor Chapter_Hyperbolic_Surface_Triangulations
\cgalAutoToc
\authors Vincent Despré, Loïc Dubois, Marc Pouget and Monique Teillaud
<center>
<img src="header.svg" style="max-width:80%; width:80%;"/>
</center>
This package introduces a data structure and algorithms for triangulations of closed orientable hyperbolic surfaces. The triangulation is represented by an enriched CGAL::Combinatorial_map with complex number attributes on edges.
Such a triangulation can be constructed from a surface given by a convex fundamental domain (see Section \ref Section_Hyperbolic_Surface_Triangulations_domains "Fundamental Domains and Triangulations"). A method is offered that randomly generates such domains for surfaces of genus two. On the other hand, the package works for any genus surface that may be provided by the user either as a fundamental domain or as an already computed triangulation.
Functionalities are offered such as the Delaunay flip algorithm and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane.
For the case of the Bolza surface, which is the most symmetric surface of genus two, we refer the user to the specific package \ref Chapter_2D_Periodic_Hyperbolic_Triangulations "2D Periodic Hyperbolic Triangulations".
\section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic Surfaces
We assume some familiarity with basic notions from covering space theory and from the theory of hyperbolic surfaces. See for instance \cgalCite{cgal:b-gdg-83}\cgalCite{cgal:b-gscrs-92}.
The <em>Poincaré disk</em> \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$.
In this package, every hyperbolic surface \f$ S \f$ is closed (compact and without boundary) and orientable.
The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi: \mathbb{D} \to S \f$ is a local isometry.
For a point \f$ x \in S \f$, the infinite set \f$ \pi^{-1}(x) \f$ consists of lifts of \f$ x \f$, denoted \f$ \widetilde x \f$. This notion extends to paths and triangulations of S that can be lifted in \f$ \mathbb{D} \f$.
\subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental Domains and Triangulations
Let \f$ S \f$ be a hyperbolic surface. For representing \f$ S \f$, we cut it into topologically simple pieces.
For a graph \f$ G \f$ embedded on \f$ S \f$, a face is a connected component of \f$ S \setminus G \f$.
A graph \f$ G \f$ embedded on \f$ S \f$ defines a <em>cellular decomposition</em> of \f$ S \f$ if every face is a topological disk.
In this document, every edge of a graph \f$ G \f$ embedded on \f$ S \f$ is a geodesic on \f$ S \f$.
We consider two types of cellular decompositions of \f$ S \f$:
<ul>
<li>Decompositions with only one face, and
<li>Triangulations.
</ul>
A decomposition of \f$ S \f$ that have only one face is a classical representation of the surface.
Cutting \f$ S \f$ open along the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$ that is a <em>fundamental domain</em> for \f$ S \f$.
Each edge of \f$ G \f$ is split into a pair of edges in \f$ P \f$.
Every hyperbolic surface admits a fundamental domain \f$ P \f$ that is <em>convex</em>, meaning that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$.
A decomposition defined by the graph \f$ G \f$ is a <em>triangulation</em> of \f$ S \f$ if every face of \f$ G \f$ is a triangle: it is bounded by three edges of \f$ G \f$.
Observe that this definition allows for triangulations with only one vertex.
A triangulation of \f$ S \f$ can be obtained from a convex fundamental domain \f$ P \f$ of \f$ S \f$ by triangulating the interior of \f$ P \f$, and by gluing back the boundary edges that are paired in \f$ P \f$.
The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ can be triangulated naively by insertion of any maximal set of pairwise interior disjoint arcs of \f$ P \f$.
\subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of Convex Fundamental Domains
In order to perform fast and exact computations with a fundamental domain, every vertex must be a complex number whose type supports fast and exact computations. Under this constraint, it is still a research problem to generate domains of surfaces of genus greater than two. In genus two, this package generates fundamental domains whose vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of hyperbolic surfaces genus two.
\section Subsection_Hyperbolic_Surface_Triangulations_Representation Representation
\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Domains Data Structure for Domains
We represent every fundamental domain as a polygon in the Poincaré disk, given by the list of its vertices in counter-clockwise order and by the list of its side pairings.
This package can generate a random convex fundamental domain \f$ P \f$ of a surface of genus two, with eight vertices \f$ z_0, \dots, z_7 \in \mathbb{C} \f$.
The vertices and the sides are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is \f$ A \f$, the side between \f$ z_4 \f$ and \f$ z_5 \f$ is \f$ \overline{A} \f$ and so on as on \cgalFigureRef{THS2-octagon}. The side pairings are \f$ A \f$ with \f$\overline{A} \f$ , \f$ B \f$ with \f$ \overline{B} \f$ , \f$ C \f$ with \f$ \overline{C} \f$ and \f$ D \f$ with \f$ \overline{D} \f$.
These octagons are symmetric, i.e. \f$ z_i = -z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight.
Such octagons are described in \cgalCite{aigon2005hyperbolic}.
\cgalFigureAnchor{THS2-octagon}
<center>
<img src="octagon.svg" style="max-width:30%; width:30%; display: inline-block;"/>
</center>
\cgalFigureCaptionBegin{THS2-octagon}
Fundamental convex polygonal domain of a genus two surface.
\cgalFigureCaptionEnd
\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Triangulations Data Structure for Triangulations
Our representation is edge-based instead of the usual CGAL::TriangulationDataStructure_2 used for instance in the package \ref Chapter_2D_Periodic_Hyperbolic_Triangulations "2D Periodic Hyperbolic Triangulations". This edge-based representation is more intrinsic to the surface and can handle non-simplicial triangulations, for instance a triangulation with only one vertex.
We represent a triangulation \f$ T \f$ of a hyperbolic surface by an instance of CGAL::Combinatorial_map whose edges have complex number attributes that are cross ratios (defined shortly in the following).
While the triangulation \f$ T \f$ is unambiguously determined by the combinatorial map and its cross ratios, the internal representation of \f$ T \f$ contains an additional data: the anchor, to be able to lift the triangulation in the Poincaré disk \f$ \mathbb{D} \f$.
The anchor is a lift \f$ \widetilde t \f$ in \f$ \mathbb{D} \f$ of a triangle of \f$ T \f$. The anchor is represented by the three vertices \f$ \widetilde v_0, \widetilde v_1, \widetilde v_2 \f$ of \f$ \widetilde t \f$ in \f$ \mathbb{D} \f$, and by the dart in the combinatorial map of \f$ T \f$ corresponding to the oriented edge \f$ v_0v_1 \f$.
A lift function is provided that computes a lift of each triangle of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$, it starts from the anchor and then recursively constructs lifts of neighboring triangles using the cross ratios. See \cgalCite{despre2022experimental} for details.
The attribute of an edge \f$ e \f$ of \f$ T \f$ is the complex number \f$ R_T(e) \in \mathbb{C} \f$ called the <em>cross ratio</em> of \f$ e \f$ in \f$ T \f$, defined as follows.
Consider the lift \f$ \widetilde T \f$ of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$.
In \f$ \widetilde T \f$, let \f$ \widetilde e \f$ be a lift of \f$ e \f$, see \cgalFigureRef{THS2-crossratio}.
Orient \f$ \widetilde e \f$ arbitrarily, and let \f$ z_0 \in \mathbb{D} \f$ and \f$ z_2 \in \mathbb{D} \f$ be respectively the source and target vertices of \f$ \widetilde e \f$.
In \f$ \widetilde T \f$, consider the triangle on the right of \f$ \widetilde e \f$, and let \f$ z_1 \in \mathbb{D} \f$ be the vertex distinct from \f$ z_0 \f$ and \f$ z_2 \f$ of this triangle.
Similarly, consider the triangle on the left of \f$ \widetilde e \f$, and let \f$ z_3 \in \mathbb{D} \f$ be the vertex distinct from \f$ z_0 \f$ and \f$ z_2 \f$ of this triangle.
Then \f$ R_T(e) = (z_3-z_1)(z_2-z_0) / ((z_3-z_0)(z_2-z_1)) \f$.
This definition does not depend on the choice of the lift \f$ \widetilde e \f$, nor on the orientation of \f$ \widetilde e \f$.
See \cgalCite{despre2022experimental} for details.
\cgalFigureAnchor{THS2-crossratio}
<center>
<img src="crossratio.svg" style="max-width:20%; width:20%; display: inline-block;"/>
</center>
\cgalFigureCaptionBegin{THS2-crossratio}
Computation of the cross ratio of an edge.
\cgalFigureCaptionEnd
\subsection Subsection_Hyperbolic_Surface_Triangulations_Delaunay Delaunay Flip Algorithm
Let \f$ T \f$ be a triangulation of a hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the <em>Delaunay criterion</em> if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive.
This definition is equivalent to the usual formulation for the triangulation lifted in \f$ \mathbb{D} \f$: there exists a disk containing \f$ \widetilde e \f$ and that does not contain any other vertices of \f$ \widetilde T \f$ in its interior.
Then \f$ T \f$ is a <em>Delaunay triangulation</em> if every edge of \f$ T \f$ satisfies the Delaunay criterion.
If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then \f$e \f$ is called Delaunay flippable, and then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateral, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateral.
This operation is called a Delaunay <em>flip</em>.
When a flip occurs, the cross ratios of the involved edges are modified via simple formulas.
The <em>Delaunay flip algorithm</em> flips edges that do not satisfy the Delaunay until no more edges violate the criterion, with no preference on the order of the flips.
This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cgalCite{despre2020flipping}.
\section Section_Hyperbolic_Surface_Triangulations_Software_Design Software Design
The concept `ComplexNumber` describes a complex number type modeled by `CGAL::Complex_number`. Complex numbers are used to encode the cross ratios, for the coefficients of isometries and implicitly to work with points in the Poincaré disk.
Most classes of the package are templated by the concept `HyperbolicSurfaceTraits_2`. It is a refinement of `HyperbolicDelaunayTriangulationTraits_2` and is modeled by `CGAL::Hyperbolic_surface_traits_2`. It defines the geometric objects (points, segments...) forming the lifted triangulation in the Poincaré disk.
The package offers three main classes:
- `CGAL::Triangulation_on_hyperbolic_surface_2` represents a triangulation of a hyperbolic surface. It offers functions for the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm and the construction of a portion of the lift of the triangulation in the Poincaré disk.
- `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain of a hyperbolic surface.
- `CGAL::Hyperbolic_fundamental_domain_factory_2` generates random convex fundamental domains of surfaces of genus two.
The secondary class `CGAL::Hyperbolic_isometry_2` defines isometries in the Poincaré disk together with operations to work with them.
\section Visualization_Triangulation_lift Visualization of a Triangulation
The function `CGAL::Triangulation_on_hyperbolic_surface_2::lift()` computes the lift of each triangle in the hyperbolic plane, enabling its visualization (see \cgalFigureRef{THS2-demo-output}). This package contains a demo (found in the folder Triangulation_on_hyperbolic_surface_2/demo), which can be used to display triangulations.
\cgalFigureAnchor{THS2-demo-output}
<center>
<img src="demo-output.png" style="max-width:25%; width:25%; display: inline-block;"/>
</center>
\cgalFigureCaptionBegin{THS2-demo-output}
Lift, in the Poincaré disk, of a Delaunay triangulation of a genus two hyperbolic surface with one vertex.
\cgalFigureCaptionEnd
\section Section_Hyperbolic_Surface_Triangulations_Example Example
The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, saves and prints the Delaunay triangulation.
\cgalExample{Triangulation_on_hyperbolic_surface_2/Triangulation_on_hyperbolic_surface_2.cpp}
\section Section_Hyperbolic_Surface_Implementation_History Design and Implementation History
This package implements the Delaunay flip algorithm described in the hyperbolic setting by Vincent Despré, Jean-Marc Schlenker and Monique Teillaud in \cgalCite{despre2020flipping} using the data structure for representing triangulations presented in \cgalCite{despre2022experimental}).
It also implements the generation of domains described by Vincent Despré, Loïc Dubois, Benedikt Kolbe and Monique Teillaud in \cgalCite{despre2022experimental}, based on results of Aline Aigon-Dupuy, Peter Buser, Michel Cibils, Alfred F Künzle and Frank Steiner \cgalCite{aigon2005hyperbolic}.
The code and the documentation of the package were written by Loïc Dubois, under regular discussions with Vincent Despré, Marc Pouget and Monique Teillaud.
The authors acknowledge support from the grants <a href="https://sos.loria.fr/">SoS</a> and <a href="https://perso.math.u-pem.fr/sabourau.stephane/min-max/min-max.html">MIN-MAX</a> of the French National Research Agency ANR.
*/
} /* namespace CGAL */
\\\\\\\\\\\\

View File

@ -0,0 +1,7 @@
Manual
Stream_support
Number_types
Combinatorial_map
Hyperbolic_triangulation_2
Algebraic_foundations
Periodic_4_hyperbolic_triangulation_2

View File

@ -0,0 +1,3 @@
/*!
\example Triangulation_on_hyperbolic_surface_2/Triangulation_on_hyperbolic_surface_2.cpp
*/

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="29.702mm" height="29.753mm" version="1.1" viewBox="0 0 29.702 29.753" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-188.95 -154.1)">
<g transform="matrix(.20048 0 0 .20048 135.37 157.17)" fill="#387ba5" fill-opacity=".77869">
<path d="m303.35 107.68c0-0.0548 0.12154-0.51486 0.27008-1.0223 0.54238-1.8529 1.0251-4.7658 1.2488-7.5353 0.77845-9.6387-2.4399-19.925-8.6418-27.62-4.1357-5.1315-9.7772-9.3038-15.943-11.791l-1.5121-0.60999 1.2041-0.12588c9.0412-0.9452 16.414-2.247 24.403-4.3085 25.544-6.5917 49.386-19.908 68.343-38.172 1.3584-1.3087 2.4698-2.3258 2.4698-2.2601 0 0.11466-71.07 92.71-71.589 93.271-0.13929 0.15067-0.25326 0.2291-0.25326 0.17427z" style="paint-order:stroke markers fill"/>
<path d="m307.49 103.65c0.10123-0.30066 71.692-93.431 71.765-93.358 0.0337 0.0337-0.14638 0.91896-0.4002 1.9672-0.80987 3.3447-1.1046 6.4228-0.98697 10.31 0.1141 3.772 0.40795 5.9032 1.2532 9.089 1.2593 4.7463 3.3765 9.1448 6.4514 13.403 1.4411 1.9955 6.1056 6.66 8.1011 8.1011 2.8078 2.0277 6.4441 4.0473 9.0809 5.0436 1.3666 0.51638 1.3452 0.52535-2.024 0.84478-8.7824 0.83265-21.157 3.4063-29.841 6.2064-17.614 5.6796-32.31 13.23-46.585 23.935-5.5238 4.1424-9.8889 7.8619-14.57 12.415-1.2735 1.2387-2.2838 2.1582-2.2451 2.0433z" style="paint-order:stroke markers fill"/>
<path d="m279.62 57.228c6.7309-6.3226 8.4229-16.445 4.1211-24.654-0.5439-1.038-0.65797-1.3865-0.43259-1.3217 0.16836 0.0484 1.4006 0.42613 2.7382 0.83935 22.487 6.9465 47.301 5.0322 68.67-5.2976 5.4396-2.6296 11.014-6.0134 15.492-9.4033 1.0133-0.76718 1.8767-1.3605 1.9187-1.3185 0.1936 0.19361-7.4037 6.8331-11.526 10.073-20.351 15.994-44.519 26.582-70.438 30.859-2.6172 0.43189-10.946 1.4864-11.743 1.4868-0.0791 3e-5 0.46116-0.56822 1.2006-1.2628z" style="paint-order:stroke markers fill"/>
<path d="m308.91 35.473c-4.9666-0.26297-11.282-1.1144-15.191-2.0482l-1.4967-0.35753 1.6838 0.1302c0.92609 0.0716 4.1253 0.12885 7.1094 0.1272 5.8126-3e-3 7.9444-0.19858 12.535-1.1488 5.6889-1.1775 10.591-2.8772 15.812-5.4824 12.884-6.4286 22.97-16.639 29.301-29.661 0.6503-1.3377 1.1852-2.3901 1.1886-2.3386 0.0424 0.63061 1.477 4.1014 2.1788 5.2714 1.0818 1.8035 3.2325 4.159 4.853 5.3154 1.3882 0.99063 4.2237 2.3423 5.7867 2.7586 1.6605 0.44221 4.5005 0.7392 5.6908 0.5951l1.0444-0.12642-0.93545 0.96737c-0.51449 0.53206-1.8194 1.7456-2.8999 2.6968-13.525 11.907-30.168 19.658-48.024 22.366-5.5812 0.84626-13.145 1.2258-18.636 0.93509z" style="paint-order:stroke markers fill"/>
<path d="m295.03 32.644c-1.029-0.0903-2.797-0.32103-3.9289-0.5128l-2.058-0.34867 2.5257-0.024c19.963-0.1899 37.162-13.719 41.884-32.949 0.60873-2.4788 1.132-5.7143 1.1687-7.2269 0.0122-0.50129 0.0754-1.1598 0.14053-1.4634 0.11632-0.5422 0.13142-0.52968 0.85672 0.71054 1.8886 3.2293 5.0478 5.6566 8.9899 6.9073 1.1256 0.3571 1.7303 0.41564 4.303 0.41658 2.6198 9.5e-4 3.1677-0.0536 4.39-0.43744 1.6543-0.51947 3.3094-1.3232 4.5618-2.2152 0.49885-0.35531 0.94168-0.61133 0.98406-0.56894 0.14094 0.14094-2.14 4.5896-3.5691 6.961-2.8454 4.7216-5.5839 8.2162-9.5394 12.173-10.836 10.839-24.506 17.191-40.045 18.606-2.4172 0.22008-8.0012 0.20521-10.664-0.0284z" style="paint-order:stroke markers fill"/>
<path d="m311.87 100.46c24.287-22.748 55.993-37.318 88.68-40.75 1.5435-0.16208 3.0722-0.32856 3.3971-0.36996 0.56079-0.0714 0.51564-4e-3 -0.89105 1.3404-4.2222 4.0338-6.3413 9.0217-6.3413 14.925 0 3.5689 0.63202 6.2444 2.2208 9.4012 0.42725 0.84891 0.70486 1.5435 0.61693 1.5435-0.0879 0-0.63903-0.16485-1.2246-0.36633-10.756-3.7005-24.507-5.3029-36.879-4.2974-17.552 1.4263-34.61 7.8554-48.677 18.346-1.0853 0.80944-2.0269 1.4677-2.0924 1.4628-0.0655-5e-3 0.47024-0.56089 1.1905-1.2356z" style="paint-order:stroke markers fill"/>
<path d="m322.63 122.25c-1.1923-4.6522-4.7222-8.9444-9.2166-11.207-2.4131-1.2149-4.3331-1.6885-7.4004-1.8256l-2.6705-0.11931 2.2963-2.0852c2.9864-2.7118 4.6062-4.0591 7.3368-6.102 11.999-8.9773 26.046-14.979 40.796-17.432 5.8985-0.98063 7.9274-1.1282 15.435-1.1228 6.1077 4e-3 7.462 0.0595 10.463 0.42579 3.4328 0.41902 7.5827 1.1219 9.5505 1.6175 1.0167 0.25608 1.0011 0.25828-0.93041 0.13155-3.7374-0.24522-11.519-0.12398-14.011 0.2183-7.5455 1.0362-13.634 2.8497-20.133 5.9963-6.6245 3.2075-11.676 6.7348-16.896 11.797-5.4232 5.26-9.4978 10.871-12.95 17.832l-1.4174 2.8582z" style="paint-order:stroke markers fill"/>
<path d="m347.82 128.15c-0.27054-0.774-1.6634-2.7539-2.7149-3.859-2.8204-2.9642-6.3108-4.5429-10.513-4.7549-3.4651-0.17482-6.3876 0.60202-9.29 2.4694-0.69802 0.44911-1.299 0.78667-1.3356 0.75012-0.11712-0.11712 1.3569-3.113 2.6711-5.4287 4.5544-8.0256 10.914-15.103 18.358-20.43 8.7832-6.2853 18.926-10.214 29.918-11.59 3.6092-0.45164 10.801-0.45042 14.406 2e-3 4.3716 0.54924 4.4279 0.59328 0.93544 0.73278-3.7392 0.14937-6.1792 0.4925-9.5304 1.3403-12.332 3.1197-22.56 11.407-28.183 22.835-2.6048 5.2938-4.0142 10.491-4.4392 16.37-0.0913 1.2633-0.19219 1.8208-0.28262 1.5622z" style="paint-order:stroke markers fill"/>
<path d="m349.09 123.5c0.0604-0.61739 0.3253-2.0907 0.5887-3.274 1.7436-7.8333 5.7888-15.249 11.386-20.873 6.3892-6.4196 14.443-10.596 23.403-12.137 3.8092-0.65509 9.6013-0.71368 13.082-0.13233 1.0227 0.1708 1.0005 0.18801-0.99349 0.76913-0.75221 0.21922-2.1432 0.79589-3.0911 1.2815-5.4545 2.7943-9.2644 7.9754-10.327 14.044-0.52246 2.9832-0.25789 6.806 0.65421 9.4528 0.20944 0.60777 0.38081 1.1311 0.38081 1.163 0 0.0319-0.52619-0.30804-1.1693-0.75541-5.5874-3.8867-13.225-4.9365-19.825-2.7251-6.1161 2.0491-11.158 6.8369-13.651 12.963l-0.54769 1.346z" style="paint-order:stroke markers fill"/>
<path d="m400.07 56.276c-6.312-3.1736-11.615-7.8934-15.388-13.695-6.1173-9.4081-7.8724-21.339-4.7161-32.058l0.32483-1.1032 0.50853 1.5709c1.7758 5.4858 5.8193 9.3916 11.531 11.138 1.5119 0.46233 1.9535 0.51156 4.6908 0.52295l3.0217 0.0126-0.30895 0.39026c-4.2591 5.3801-5.8764 9.6589-5.8986 15.606-0.0116 3.0995 0.23144 4.7304 1.1035 7.4058 1.2228 3.7516 2.9366 6.5207 5.8086 9.3854 1.0574 1.0547 1.8239 1.9163 1.7032 1.9147-0.12066-2e-3 -1.1921-0.49198-2.381-1.0897z" style="paint-order:stroke markers fill"/>
<path d="m403.52 57.074c-4.4758-3.3516-7.7078-8.6495-8.7797-14.392-0.4263-2.2836-0.28926-6.9855 0.26825-9.2035 0.74273-2.9549 2.2068-6.0344 4.0099-8.4345 0.40789-0.54294 0.76883-0.95997 0.80208-0.92671 0.0333 0.0333-0.0732 0.47748-0.23652 0.98717-0.18628 0.58125-0.30383 1.659-0.31536 2.8912-0.0317 3.3946 1.1278 6.138 3.5641 8.4321 1.5262 1.4372 3.0724 2.2968 5.0329 2.7982 0.79571 0.20351 1.4702 0.39342 1.4988 0.42202s-0.40046 0.40208-0.95345 0.82996c-2.1775 1.6848-4.0517 4.6168-4.7857 7.4866-0.68471 2.6772-0.42909 6.4094 0.60425 8.8225 0.19351 0.45188 0.31838 0.85507 0.27748 0.89597s-0.48501-0.23315-0.98692-0.60899z" style="paint-order:stroke markers fill"/>
<path d="m375.76 8.0098c-2.1331-0.21584-4.2576-0.84039-6.1739-1.815-3.889-1.9779-6.818-5.2163-8.3829-9.2685-0.275-0.71206-0.78444-2.4728-0.78444-2.7113 0-0.0475 0.221 0.0787 0.49111 0.28033 1.5661 1.1693 3.6844 1.7966 5.6285 1.6668 2.034-0.1358 3.8513-0.91335 5.4219-2.3198 0.36008-0.32244 0.53188-0.42966 0.49756-0.31053-0.22041 0.76493-0.29355 1.4914-0.29619 2.9415-3e-3 1.8094 0.16819 2.8645 0.70008 4.3071 1.0682 2.8972 3.1862 5.3736 5.7792 6.7572l0.77604 0.41411-0.57928 0.0605c-0.58205 0.0608-2.4666 0.0593-3.0775-3e-3z" style="paint-order:stroke markers fill"/>
<path d="m352.95-5.1551c-1.6364-0.16378-3.182-0.6732-4.5698-1.5061-1.8872-1.1326-3.4073-2.8638-4.2977-4.8942-0.17643-0.40233-0.4921-1.2796-0.4921-1.3675 0-0.019 0.1079 0.0791 0.23978 0.21806 0.68995 0.72697 1.5708 1.2066 2.5862 1.4081 0.47379 0.094 1.2744 0.10087 1.7215 0.0147 0.88069-0.16975 1.6731-0.54848 2.3294-1.1134 0.21206-0.18252 0.56089-0.55906 0.71538-0.77222l0.0682-0.0941 0.0761 0.392c0.40384 2.081 1.6256 3.9287 3.3748 5.104 1.1745 0.78914 2.5439 1.255 3.9534 1.3448l0.3638 0.0232-0.45964 0.22443c-0.98564 0.48127-2.0845 0.80898-3.2611 0.97257-0.45671 0.0635-1.8912 0.0914-2.3482 0.0457z" style="paint-order:stroke markers fill"/>
<path d="m358.09-6.9613c-2.6894-0.40329-4.9323-2.1911-5.9209-4.7196-0.20071-0.51332-0.47014-1.574-0.39982-1.574 0.0111 0 0.0919 0.0515 0.17961 0.11452 0.45389 0.32609 0.93109 0.46171 1.544 0.43882 0.61804-0.0231 1.1034-0.21317 1.5268-0.598l0.17649-0.16041v0.29928c0 0.5908 0.14475 1.4237 0.36298 2.0886 0.36443 1.1104 0.97552 2.1048 1.8004 2.9299 0.45611 0.45623 0.72719 0.67764 1.2318 1.0061l0.35511 0.23116-0.26284-3e-3c-0.14456-2e-3 -0.41167-0.0257-0.59357-0.053z" style="paint-order:stroke markers fill"/>
<path d="m358.26-7.976c-0.82489-0.67115-1.5474-1.6118-1.9707-2.5657-0.38207-0.86095-0.56519-1.6586-0.61329-2.6716l-0.0224-0.47086 0.19402 0.10509c0.28202 0.15275 0.70346 0.1699 1.0188 0.0415 0.052-0.0212 0.0581-0.0139 0.039 0.0463-0.0446 0.14055-0.0231 1.3691 0.0311 1.7742 0.11843 0.88569 0.37127 1.7237 0.75836 2.5136 0.22377 0.45661 0.58167 1.0447 0.82023 1.3477 0.0537 0.0682 0.0852 0.12358 0.07 0.12304-0.0152-5.3e-4 -0.16153-0.10997-0.32524-0.24317z" style="paint-order:stroke markers fill"/>
<path d="m359.59-7.4969c-0.14539-0.18862-0.34861-0.4849-0.47845-0.69756-0.64425-1.0552-1.0443-2.2587-1.1576-3.4823-0.036-0.3885-0.0432-0.98603-0.0158-1.3051l4e-3 -0.0452 0.042 0.0539c0.13006 0.16701 0.32417 0.323 0.52852 0.42471 0.15749 0.0784 0.30866 0.12605 0.48639 0.15334 0.11969 0.0184 0.32768 0.0183 0.44794-1.5e-4 0.11393-0.0175 0.24649-0.0521 0.34542-0.0903 0.0451-0.0174 0.082-0.0287 0.082-0.0251-1e-5 4e-3 -0.0116 0.071-0.0259 0.14974-0.12535 0.69477-0.21252 1.4411-0.25163 2.1544-0.0178 0.3254-0.0212 0.43916-0.0246 0.83313-6e-3 0.66289 0.0173 1.2125 0.0775 1.8464 5e-3 0.0524 8e-3 0.0996 7e-3 0.10483-1e-3 6e-3 -0.0268-0.0229-0.0668-0.0749z" style="paint-order:stroke markers fill"/>
<path d="m360.08-7.7899c-0.0199-0.25251-0.037-0.53364-0.0467-0.76887-0.0109-0.26356-0.0109-1.0439 1e-5 -1.314 0.0333-0.82524 0.11582-1.592 0.25667-2.3842 0.0178-0.10005 0.0324-0.18563 0.0326-0.19017 1.2e-4 -5e-3 3e-3 -0.0133 7e-3 -0.0195 6e-3 -9e-3 0.0181-2e-3 0.0557 0.0284 0.15329 0.12501 0.34366 0.21513 0.55068 0.26067 0.11139 0.0245 0.32787 0.0305 0.45056 0.0124 0.0947-0.0139 0.22406-0.0485 0.29472-0.0788 0.036-0.0154 0.039-0.0156 0.0349-2e-3 -2e-3 8e-3 -0.0421 0.13533-0.0879 0.28313-0.39278 1.2653-0.88266 2.6747-1.3622 3.9191-0.0499 0.1296-0.10656 0.27657-0.12581 0.32659-0.0192 0.05-0.0376 0.0939-0.0408 0.0974-3e-3 4e-3 -0.012-0.0727-0.0197-0.1695z" style="paint-order:stroke markers fill"/>
<path d="m360.69-7.8687c0.45508-1.1636 1.061-2.919 1.4592-4.2271 0.0325-0.10687 0.0608-0.19928 0.0628-0.20536 2e-3 -7e-3 0.0235 6e-3 0.0621 0.0393 0.12109 0.10448 0.25081 0.17479 0.39403 0.21355 0.0735 0.0199 0.0949 0.0219 0.23596 0.0223 0.13447 3.7e-4 0.15446 2e-3 0.15014 0.0128-3e-3 7e-3 -0.0155 0.0403-0.0283 0.0744-0.42954 1.1429-1.0638 2.3374-1.7737 3.3404-0.19663 0.27779-0.54968 0.74414-0.56336 0.74414-3e-3 0-2e-3 -7e-3 1e-3 -0.0145z" style="paint-order:stroke markers fill"/>
<path d="m361.71-8.4372c1e-3 -5e-3 0.0718-0.11245 0.15655-0.23978 0.66607-1.001 1.1984-2.0428 1.6186-3.1674l0.0713-0.19079 0.0248 0.0158c0.0848 0.054 0.21071 0.0999 0.30276 0.11026 0.0267 3e-3 0.0486 8e-3 0.0486 0.0121 0 4e-3 -0.0298 0.0776-0.0661 0.16441-0.47747 1.1394-1.1224 2.1612-1.9313 3.0598-0.11667 0.1296-0.22832 0.24651-0.22504 0.23565z" style="paint-order:stroke markers fill"/>
<path d="m360.94-7.1081c0.079-0.0618 0.29169-0.24129 0.41177-0.34751 0.95239-0.84244 1.7588-1.8454 2.378-2.9576 0.15471-0.27789 0.37643-0.72836 0.49836-1.0125l0.0158-0.0369 0.0315 0.0519c0.2047 0.33698 0.53575 0.57055 0.92788 0.65466 0.10193 0.0219 0.33816 0.0312 0.44075 0.0174 0.0382-5e-3 0.071-8e-3 0.073-6e-3 0.01 0.01-0.24518 0.42566-0.38166 0.62284-0.48961 0.70737-1.0863 1.3183-1.7771 1.8196-0.64191 0.46577-1.391 0.84365-2.1388 1.079-0.15025 0.0473-0.47739 0.13793-0.49717 0.13777-6e-3 -5e-5 2e-3 -0.0103 0.0176-0.0227z" style="paint-order:stroke markers fill"/>
<path d="m362.19-6.4238c-0.29931-0.0199-0.59663-0.0601-0.91689-0.12394-0.15868-0.0316-0.29152-0.0605-0.2952-0.0642-4e-3 -4e-3 0.0257-0.0149 0.0653-0.025 0.95446-0.2431 1.7578-0.59582 2.5359-1.1134 0.45909-0.30541 0.79563-0.58237 1.2085-0.99454 0.50916-0.50835 0.93086-1.0535 1.2626-1.6321l0.0898-0.15664 0.057 0.10848c0.28503 0.54222 0.81945 0.9121 1.4372 0.99469 0.18318 0.0245 0.46345 9e-3 0.64786-0.0349 0.0764-0.0184 0.14238-0.0298 0.14669-0.0255 4e-3 4e-3 -0.0501 0.0873-0.12083 0.1844-0.39294 0.53919-0.86931 1.0323-1.3884 1.4371-0.19132 0.14922-0.61039 0.42812-0.82845 0.55137-1.1804 0.66715-2.5608 0.98358-3.901 0.89423z" style="paint-order:stroke markers fill"/>
<path d="m364.53-5.1603c-0.79172-0.0454-1.6212-0.22535-2.3482-0.50948-0.25342-0.0991-0.61688-0.26405-0.7276-0.33031l-0.0744-0.0445 0.0744 9e-3c0.0409 5e-3 0.16371 0.0204 0.27285 0.0339 1.9235 0.23857 3.8689-0.28048 5.4044-1.4419 0.6869-0.51958 1.3198-1.1987 1.7648-1.8939 0.0678-0.10597 0.12727-0.19293 0.13207-0.19324 5e-3 -3.2e-4 0.0294 0.047 0.0547 0.10507 0.19645 0.45094 0.63699 0.82348 1.1378 0.96213 0.27183 0.0753 0.6688 0.0736 0.95613-4e-3 0.0371-0.0101 0.0336-1e-3 -0.0402 0.10346-1.2203 1.7266-3.1234 2.8748-5.2177 3.1481-0.44173 0.0576-0.97839 0.0791-1.3891 0.0556z" style="paint-order:stroke markers fill"/>
<path d="m365.4-4.6673c-0.15609-5e-3 -0.35147-0.0155-0.35542-0.0192-3e-3 -2e-3 0.0645-6e-3 0.14909-8e-3 0.91789-0.0216 1.9012-0.23047 2.7905-0.59264 1.206-0.49113 2.2981-1.2896 3.1333-2.2908 0.2929-0.35112 0.54642-0.71232 0.77776-1.1081 0.0336-0.0575 0.0665-0.1151 0.0731-0.12803l0.012-0.0235 0.0307 0.0295c0.0992 0.0954 0.24034 0.16987 0.36538 0.19293 0.0233 4e-3 0.0424 0.01 0.0424 0.0123 0 0.0172-0.24455 0.40245-0.36029 0.56756-0.27734 0.39568-0.53895 0.70588-0.89621 1.0627-0.1976 0.19736-0.33397 0.32275-0.51776 0.47604-1.2108 1.01-2.7012 1.6357-4.2681 1.7919-0.31935 0.0318-0.69519 0.0462-0.97637 0.0373z" style="paint-order:stroke markers fill"/>
<path d="m367.84-4.5174c8e-3 -3e-3 0.0725-0.0222 0.14324-0.0432 1.8517-0.55041 3.4729-1.7474 4.546-3.3565 0.10723-0.16078 0.18683-0.2882 0.27184-0.43516 0.0887-0.15339 0.0778-0.14105 0.1055-0.11943 0.0313 0.0244 0.0707 0.0467 0.12402 0.0701 0.0247 0.0108 0.0441 0.0228 0.0431 0.0266-5e-3 0.0186-0.1734 0.29029-0.27312 0.44037-0.25096 0.37773-0.50495 0.69999-0.81557 1.0348-0.11441 0.12333-0.37116 0.37732-0.48807 0.48282-0.55714 0.50278-1.1434 0.90487-1.8066 1.2391-0.47031 0.237-0.92289 0.41373-1.4355 0.56053-0.17466 0.05-0.49623 0.12754-0.41497 0.10003z" style="paint-order:stroke markers fill"/>
<path d="m378.59 6.9134c-2.1172-1.2715-3.7001-2.998-4.7484-5.1789-0.40465-0.8419-0.64858-1.516-0.85475-2.362-0.27566-1.1312-0.33039-1.6094-0.33185-2.8999-2e-3 -1.3721 0.0982-2.1413 0.42446-3.274l0.0741-0.25724 0.10478 0.2887c0.2994 0.82489 1.0665 1.5071 1.9424 1.7274 0.42242 0.10624 1.2332 0.0715 1.5912-0.0681 0.14148-0.0552 0.26949-0.10039 0.28445-0.1004 0.015-1e-5 -0.0543 0.23626-0.15387 0.52504-0.22976 0.6662-0.38143 1.2649-0.51393 2.0286-0.14316 0.82517-0.15557 2.8885-0.0222 3.6905 0.3715 2.2339 1.1928 4.1109 2.5428 5.8114 0.1889 0.23796 0.32608 0.43264 0.30485 0.43264-0.0212 0-0.31103-0.1636-0.64399-0.36357z" style="paint-order:stroke markers fill"/>
<path d="m348.26-2.2297c-5.4297-0.23646-10.353-3.4331-12.785-8.3008-0.27412-0.54864-0.51711-1.0964-0.49582-1.1176 7e-3 -7e-3 0.0309 4e-3 0.0535 0.0238 0.0754 0.0664 0.54455 0.32511 0.77448 0.42706 0.44898 0.19906 0.94675 0.34746 1.42 0.42332 0.31849 0.0511 1.0663 0.0695 1.3955 0.0344 1.6519-0.1761 3.12-1.0588 4.0276-2.4219 0.0942-0.14149 0.1901-0.29671 0.21307-0.34494 0.023-0.0482 0.0482-0.0877 0.056-0.0877 8e-3 0 0.0333 0.0921 0.0565 0.20463 0.1081 0.52335 0.36999 1.3317 0.62523 1.9299 1.3398 3.1402 4.0582 5.5212 7.3168 6.4086 0.65828 0.17927 1.0892 0.26318 1.7856 0.34771 0.56665 0.0688 1.7922 0.075 2.3538 0.012 1.0678-0.11987 2.0204-0.35092 2.9687-0.7201 0.16005-0.0623 0.29489-0.10938 0.29965-0.10462 0.022 0.022-0.66417 0.52543-1.1519 0.84515-2.0115 1.3185-4.3608 2.1456-6.7703 2.3833-0.73637 0.0727-1.3938 0.0904-2.1429 0.0578z" style="paint-order:stroke markers fill"/>
<path d="m378.68 5.6725c-1.3229-1.9966-1.9822-4.2858-1.9252-6.6846 0.0326-1.3729 0.25679-2.548 0.72768-3.8143l0.17009-0.45741 0.0997 0.12668c0.31961 0.40619 0.70826 0.60623 1.1778 0.60623 0.17664 0 0.23147 0.0104 0.21772 0.0413-0.63666 1.4319-0.93843 2.4612-1.132 3.8613-0.0838 0.60594-0.10134 2.1372-0.0322 2.8112 0.13321 1.2991 0.46238 2.605 0.92484 3.6691 0.0825 0.18988 0.14409 0.35118 0.13682 0.35845-7e-3 7e-3 -0.17158-0.22577-0.36513-0.51788z" style="paint-order:stroke markers fill"/>
<path d="m379.98 6.9186c-0.18314-0.31431-0.52263-1.028-0.69691-1.465-1.0312-2.5858-1.1544-5.3805-0.35446-8.0393 0.12672-0.42118 0.46006-1.3195 0.4816-1.2978 6e-3 6e-3 0.048 0.11022 0.0939 0.23203 0.0912 0.24233 0.2502 0.508 0.41946 0.70077 0.25447 0.28982 0.74751 0.58462 1.1348 0.67856 0.24442 0.0593 0.64637 0.0804 0.84149 0.0442 0.0962-0.0178 0.17027-0.0232 0.16454-0.0119-0.56061 1.105-0.84253 1.7619-1.1515 2.6829-0.32313 0.9632-0.56148 1.9562-0.70652 2.9435-0.14016 0.95405-0.20883 2.3221-0.15853 3.1585 0.0164 0.27285 0.0265 0.50048 0.0224 0.50585-4e-3 5e-3 -0.0447-0.0542-0.0902-0.13229z" style="paint-order:stroke markers fill"/>
<path d="m380.53 6.6112c-0.0339-0.57225 1e-3 -1.9016 0.0662-2.4933 0.16578-1.5133 0.54917-3.057 1.0966-4.4151 0.20919-0.51903 0.75063-1.674 0.78474-1.674 9e-3 0 0.0736 0.1079 0.14273 0.23978 0.14753 0.28142 0.44489 0.59447 0.7059 0.74316 0.32792 0.18679 0.57119 0.2508 0.96622 0.25422 0.19554 2e-3 0.35553 7e-3 0.35553 0.0123 0 5e-3 -0.12144 0.19051-0.26987 0.41207-1.3153 1.9632-2.6462 4.4739-3.5676 6.7303-0.10964 0.26851-0.21187 0.51796-0.22716 0.55435-0.0183 0.0436-0.0365-0.0805-0.0533-0.36381z" style="paint-order:stroke markers fill"/>
<path d="m381.32 6.4624c0.01-0.0273 0.1176-0.2798 0.23979-0.56116 0.89423-2.0591 2.0614-4.1955 3.3328-6.1002l0.34092-0.51076 0.0788 0.14853c0.15069 0.28406 0.57728 0.57439 0.84394 0.57439 0.0437 0 0.0879 0.0136 0.0982 0.0303 0.0162 0.0262-4.7627 6.2856-4.9007 6.4189-0.0456 0.0441-0.0494 0.0441-0.0337 0z" style="paint-order:stroke markers fill"/>
<path d="m381.33 7.516c0.0917-0.0975 0.33729-0.35607 0.5457-0.57471 1.5998-1.6783 3.2788-3.5776 4.7463-5.3693l0.36208-0.44204 0.0202 0.24422c0.0652 0.78709 0.54225 1.4882 1.2587 1.8498 0.21963 0.11087 0.62127 0.22815 0.7875 0.22995l0.11642 1e-3 -0.18191 0.17004c-0.50758 0.4745-1.3202 1.1044-2.067 1.6023-1.5372 1.0247-3.3735 1.8468-5.1594 2.3098-0.25466 0.066-0.49278 0.12808-0.52916 0.13793-0.0448 0.0121-0.0123-0.0393 0.10062-0.15929z" style="paint-order:stroke markers fill"/>
<path d="m383.92 8.5984c-0.37038-0.0279-0.83907-0.0858-1.2178-0.15053-0.56108-0.0959-1.3648-0.2958-1.2962-0.32244 0.0193-8e-3 0.15084-0.0415 0.29232-0.0755 0.53088-0.12775 1.2593-0.3541 1.8943-0.58863 2.0682-0.76389 4.0731-1.9832 5.7296-3.4845 0.12863-0.11657 0.23642-0.2096 0.23954-0.20671 3e-3 3e-3 0.0212 0.0939 0.0402 0.20224 0.0924 0.52775 0.33778 0.98084 0.74082 1.368 0.44993 0.43222 0.96081 0.64458 1.6451 0.68382l0.28024 0.0161-0.23302 0.17427c-1.856 1.388-4.1201 2.2237-6.4623 2.3852-0.40827 0.0282-1.2709 0.0275-1.6527-1e-3z" style="paint-order:stroke markers fill"/>
<path d="m387.38 10.858c-1.6902-0.15371-3.3363-0.67153-4.7979-1.5093-0.27139-0.15556-0.99947-0.629-0.98633-0.64137 4e-3 -4e-3 0.1605 0.0282 0.34701 0.0718 0.42409 0.0991 0.89702 0.17947 1.4522 0.24678 0.3735 0.0453 0.54939 0.0524 1.3308 0.0536 0.91981 1e-3 1.1314-0.0109 1.8241-0.10661 2.2062-0.30481 4.4225-1.2665 6.1388-2.6637l0.1637-0.13326 8e-4 0.37672c5.3e-4 0.31777 9e-3 0.40784 0.0543 0.57551 0.24305 0.90176 0.98636 1.5626 1.9053 1.6939l0.18766 0.0268-0.25545 0.16467c-1.6693 1.076-3.5176 1.7007-5.4915 1.856-0.40477 0.0318-1.4681 0.0253-1.8733-0.0116z" style="paint-order:stroke markers fill"/>
<path d="m389.95 13.091c-2.6479-0.14241-5.1475-1.1237-7.1841-2.8204-0.30469-0.25383-0.7204-0.64095-0.70492-0.65643 5e-3 -5e-3 0.15029 0.0716 0.3222 0.17078 2.5182 1.4534 5.5792 1.9323 8.4969 1.3292 1.4687-0.30357 2.9517-0.92726 4.225-1.7768l0.38886-0.25947 0.0157 0.20023c0.0428 0.5471 0.24258 0.99858 0.59996 1.356 0.22669 0.22669 0.52483 0.4108 0.81664 0.50429 0.0707 0.0227 0.13674 0.0486 0.14666 0.0575 0.0238 0.0215-0.49722 0.33122-0.9465 0.56258-1.4195 0.73099-3.0062 1.182-4.6024 1.3082-0.44707 0.0353-1.1632 0.0464-1.574 0.0243z" style="paint-order:stroke markers fill"/>
<path d="m399.81 20.987c-0.60207-0.33109-1.0105-0.63477-1.4749-1.0968-0.37773-0.37574-0.54354-0.57457-0.81435-0.97661-0.54977-0.81614-0.89564-1.7279-1.0357-2.7301-0.0613-0.43854-0.0555-1.2826 0.0118-1.7189 0.0839-0.5437 0.22535-1.0626 0.41764-1.5318 0.10164-0.24801 0.34933-0.7314 0.48396-0.94448l0.10174-0.16104 0.0161 0.11427c0.0605 0.42964 0.2621 0.84914 0.56542 1.1768 0.37303 0.40291 0.89375 0.64363 1.4623 0.67598l0.27189 0.0155-0.16963 0.22702c-0.53823 0.7203-0.8904 1.5719-1.0328 2.4975-0.0572 0.37159-0.0564 1.1686 1e-3 1.5435 0.16872 1.0932 0.61411 2.0428 1.3482 2.8744 0.0918 0.10402 0.15808 0.18911 0.14726 0.18909-0.0108-2e-5 -0.14596-0.0695-0.30031-0.15436z" style="paint-order:stroke markers fill"/>
<path d="m400.92 21.057c-0.52146-0.58412-0.88984-1.2663-1.0744-1.9895-0.11002-0.43124-0.13769-0.66179-0.13881-1.1565-1e-3 -0.45306 0.011-0.5874 0.0841-0.94258 0.11542-0.56036 0.34464-1.1269 0.64235-1.5875l0.10687-0.16537 5.3e-4 0.10749c2e-3 0.46673 0.23502 0.99086 0.58694 1.3201 0.24725 0.23129 0.58555 0.40945 0.88635 0.46679 0.0585 0.0111 0.11562 0.0251 0.12706 0.0311 0.0142 7e-3 -0.0184 0.0599-0.10318 0.16609-0.57618 0.72164-0.93443 1.5963-1.0432 2.547-0.0307 0.2679-0.0254 0.93046 9e-3 1.1545 0.0103 0.0665 0.0164 0.12792 0.0136 0.1364-3e-3 8e-3 -0.0467-0.0311-0.0974-0.0879z" style="paint-order:stroke markers fill"/>
<path d="m401.45 20.744c-0.0775-0.99578 0.18384-2.0044 0.73266-2.8277 0.14398-0.21597 0.3362-0.46801 0.35692-0.46801 6e-3 0 0.0272 0.0409 0.0475 0.0909 0.0741 0.18212 0.20434 0.35394 0.35779 0.47202 0.0935 0.0719 0.31572 0.18943 0.35825 0.18943 0.0116 0 0.0211 4e-3 0.0211 8e-3s-0.11628 0.12165-0.2584 0.26045c-0.38046 0.37155-0.63677 0.6778-0.91008 1.0874-0.2253 0.33767-0.44625 0.75096-0.60119 1.1245-0.0396 0.0955-0.077 0.17958-0.083 0.18683-6e-3 7e-3 -0.0157-0.0486-0.0216-0.12402z" style="paint-order:stroke markers fill"/>
<path d="m402.15 20.504c0-0.0334 0.24916-0.46636 0.39192-0.6811 0.28731-0.43212 0.68064-0.884 1.0544-1.2114l0.14824-0.12982 0.045 0.0991c0.0247 0.0545 0.0825 0.13877 0.12839 0.18728l0.0834 0.0882-0.11126 0.0813c-0.44333 0.32389-0.92835 0.7507-1.397 1.2293-0.18873 0.19274-0.34314 0.34446-0.34314 0.33715z" style="paint-order:stroke markers fill"/>
<path d="m402.59 21.125c0.4923-0.40782 0.99191-0.78862 1.5187-1.1575l0.34673-0.24283 0.0211 0.0823c0.0312 0.12193 0.0982 0.24828 0.18289 0.34514 0.0601 0.0687 0.0705 0.0891 0.0519 0.10142-0.0601 0.0398-0.79634 0.40432-1.032 0.51099-0.3828 0.17325-1.1867 0.49578-1.2357 0.49578-9e-3 0 0.0567-0.0608 0.14648-0.13522z" style="paint-order:stroke markers fill"/>
<path d="m402.56 21.722c0.0227-0.01 0.16999-0.0659 0.32721-0.1248 0.56382-0.21129 1.3056-0.54359 1.8385-0.82358 0.13158-0.0691 0.24049-0.12569 0.24204-0.12569 2e-3 0 8e-3 0.0336 0.014 0.0746 0.0177 0.11798 0.12784 0.31938 0.23218 0.42456l0.0925 0.0932-0.17017 0.0656c-0.50689 0.19531-0.99205 0.31802-1.5592 0.39439-0.22457 0.0302-1.0796 0.0485-1.017 0.0218z" style="paint-order:stroke markers fill"/>
<path d="m403.61 22.266c-0.10004-8e-3 -0.24143-0.0241-0.31419-0.0361l-0.1323-0.0217 0.1323-0.0124c0.83554-0.0784 1.4942-0.23548 2.157-0.51455 0.11856-0.0499 0.2231-0.0907 0.23231-0.0907 9e-3 0 0.0168 0.013 0.0169 0.0289 2.5e-4 0.0433 0.0712 0.18704 0.12225 0.24743l0.0449 0.0531-0.0585 0.0245c-0.11238 0.0469-0.47605 0.16017-0.64312 0.20021-0.49851 0.11947-1.0434 0.16193-1.5575 0.12137z" style="paint-order:stroke markers fill"/>
<path d="m405.56 24.848c-1.4948-0.13339-2.7998-0.96151-3.5381-2.2452-0.0434-0.0755-0.0751-0.14107-0.0705-0.14573 5e-3 -5e-3 0.0744 0.0246 0.15489 0.065 0.20545 0.1031 0.57359 0.24624 0.80788 0.31413 0.46316 0.13421 0.83308 0.19182 1.3146 0.20475 0.53525 0.0144 0.98803-0.0367 1.4769-0.16649 0.17783-0.0472 0.2102-0.0519 0.2014-0.0292-6e-3 0.0149-0.0283 0.0882-0.05 0.16299-0.17513 0.60285-0.0112 1.2558 0.42681 1.7002l0.11938 0.12111-0.0579 9e-3c-0.11089 0.0179-0.62128 0.0238-0.78548 9e-3z" style="paint-order:stroke markers fill"/>
<path d="m407.17 29.355c-1.0234-0.0845-2.0588-0.44432-2.9018-1.0086-1.2307-0.82375-2.1616-2.1094-2.5288-3.4926-0.1486-0.5597-0.18755-0.84755-0.20501-1.5151l-0.0169-0.64492 0.18538 0.293c0.74243 1.1735 1.8308 1.9366 3.1989 2.2429 0.29716 0.0665 0.43286 0.0769 1.0095 0.0769h0.66618l-0.062 0.12163c-0.0341 0.0669-0.10234 0.25293-0.15157 0.41341-0.0807 0.26297-0.0896 0.3424-0.0903 0.80441-7.9e-4 0.58477 0.0361 0.76722 0.24688 1.2185 0.28988 0.62054 0.81266 1.1524 1.3866 1.4107l0.14676 0.066-0.0979 0.021c-0.12985 0.0278-0.39028 0.0255-0.78577-7e-3z" style="paint-order:stroke markers fill"/>
<path d="m408.24 38.752c-5.8-1.3445-9.4745-7.1075-8.2371-12.919 0.15655-0.73523 0.43702-1.5884 0.74395-2.2631l0.22522-0.49505 0.0789 0.72656c0.10006 0.92134 0.27705 1.5598 0.64436 2.3246 1.1149 2.3213 3.3727 3.7229 6.0021 3.7258l0.78041 8e-4 -0.43386 0.51263c-0.47486 0.56107-1.0165 1.5731-1.1948 2.2324-0.1665 0.61558-0.20317 1.9475-0.0715 2.5973 0.29339 1.448 1.1604 2.7715 2.3584 3.6004l0.16229 0.11229-0.19844-1e-3c-0.10914-5.3e-4 -0.49609-0.0702-0.8599-0.15448z" style="paint-order:stroke markers fill"/>
<path d="m405.1 57.389c-0.75905-1.5676-1.1834-3.1161-1.336-4.875-0.0504-0.58132-0.0202-2.1619 0.0513-2.6799 0.1363-0.98813 0.31684-1.7862 0.59507-2.6305 0.85796-2.6035 2.4998-4.9008 4.6839-6.5541 0.43181-0.32685 0.95699-0.68191 0.97783-0.66107 9e-3 9e-3 -0.0357 0.16271-0.0983 0.34261-0.20281 0.58264-0.23625 0.80621-0.23663 1.5821-2.7e-4 0.55527 0.012 0.7509 0.0612 0.97565 0.20358 0.93033 0.6654 1.7922 1.311 2.4467 0.58005 0.58802 1.29 1.0193 2.0429 1.2411l0.24042 0.0708-0.44286 0.17162c-4.3838 1.6989-7.3758 5.8901-7.5576 10.587l-0.021 0.54348z" style="paint-order:stroke markers fill"/>
<path d="m405.88 57.168c-2.5e-4 -0.19175 0.0875-0.92379 0.15398-1.2849 0.41853-2.2726 1.4685-4.3095 3.061-5.9381 1.1207-1.1461 2.3243-1.9649 3.8047-2.5883 0.23581-0.0993 0.95418-0.3617 0.99023-0.3617 4e-3 0-0.0165 0.0447-0.0466 0.0994-0.12192 0.2216-0.18234 0.47566-0.19371 0.81441-9e-3 0.2709-3e-3 0.34807 0.0403 0.52619 0.10592 0.43385 0.37689 0.84973 0.72186 1.1079l0.17031 0.12748-0.38594 0.0996c-0.97093 0.25067-2.0322 0.68133-2.9258 1.1873-0.33056 0.18717-0.98357 0.61643-1.2979 0.8532-1.7525 1.32-3.1319 3.1131-3.9502 5.1352l-0.14197 0.35079z" style="paint-order:stroke markers fill"/>
<path d="m413.8 46.249c-1.3392-0.24582-2.5178-1.1241-3.1346-2.3359-0.4318-0.84831-0.57468-1.7894-0.41736-2.7491l0.0285-0.17363 0.0206 0.16536c0.20257 1.6267 1.397 2.9738 2.982 3.363 0.21182 0.052 0.51217 0.10134 0.61711 0.10134h0.0589l-0.0724 0.13643c-0.0398 0.075-0.0927 0.2034-0.11752 0.28525-0.0404 0.13333-0.0451 0.17467-0.0454 0.39688-2.7e-4 0.29874 0.029 0.42877 0.15203 0.67386 0.0445 0.0887 0.0726 0.16042 0.0624 0.15944-0.0102-1e-3 -0.0706-0.0113-0.13426-0.0231z" style="paint-order:stroke markers fill"/>
<path d="m413.4 44.068c-0.66542-0.17175-1.1696-0.45651-1.6387-0.92545-0.65038-0.65019-0.99924-1.4661-1.026-2.3994l-9e-3 -0.29765 0.0803 0.1819c0.37748 0.85498 1.1021 1.5168 1.981 1.8093 0.22807 0.0759 0.54772 0.14362 0.75458 0.15985l0.14273 0.0112-0.0556 0.0934c-0.23872 0.40074-0.22051 0.97464 0.0435 1.37l0.0359 0.0537-0.0471-7.9e-4c-0.0259-2.7e-4 -0.14383-0.0257-0.26207-0.0562z" style="paint-order:stroke markers fill"/>
<path d="m413.14 42.056c-0.80366-0.2071-1.4632-0.73517-1.8364-1.4704-0.0966-0.19036-0.19104-0.42766-0.17608-0.44262 4e-3 -4e-3 0.0585 0.0368 0.12036 0.0914 0.5016 0.44342 1.1971 0.73339 1.8942 0.78972 0.0796 6e-3 0.1447 0.0136 0.1447 0.0159 0 2e-3 -0.0108 0.0348-0.024 0.0722-0.0925 0.26219-0.051 0.63788 0.0978 0.8849 0.0322 0.0534 0.0585 0.0999 0.0585 0.10335 0 0.0168-0.10881-5.3e-4 -0.27908-0.0445z" style="paint-order:stroke markers fill"/>
<path d="m412.84 40.511c-0.47001-0.0975-0.92859-0.32155-1.2809-0.62573-0.0511-0.0441-0.0898-0.0834-0.0859-0.0873 4e-3 -4e-3 0.10026 0.0119 0.21422 0.0349 0.36453 0.0738 0.62256 0.0953 1.0668 0.0889 0.396-6e-3 0.40216-5e-3 0.39212 0.0273-6e-3 0.0182-0.0142 0.10005-0.0191 0.1819-8e-3 0.13914 4e-3 0.22595 0.0529 0.38448 0.0109 0.0352 7e-3 0.0371-0.0689 0.0361-0.0443-5.3e-4 -0.16633-0.0189-0.27126-0.0407z" style="paint-order:stroke markers fill"/>
<path d="m407.63 36.255c-0.36614-0.80099-0.53037-1.7317-0.45709-2.5903 0.1089-1.2761 0.66515-2.4483 1.5817-3.3331 0.19293-0.18626 0.47051-0.41484 0.65002-0.53528 0.15749-0.10566 0.16532-0.10751 0.16532-0.039 0 0.14781 0.10789 0.38016 0.24275 0.52277 0.0479 0.0506 0.0854 0.0925 0.0834 0.0932-2e-3 5.2e-4 -0.0892 0.0581-0.19383 0.12783-0.27219 0.18138-0.52309 0.3876-0.76073 0.62524-0.91446 0.91445-1.4403 2.1196-1.4981 3.4333-0.0231 0.52518 0.0701 1.225 0.22724 1.7065 0.0187 0.0574 0.0307 0.1078 0.0266 0.11194-4e-3 4e-3 -0.0344-0.0512-0.0672-0.12304z" style="paint-order:stroke markers fill"/>
<path d="m410.11 38.638c-0.2819-0.20203-0.62452-0.52696-0.84388-0.80031-1.1914-1.4846-1.2842-3.5652-0.22948-5.1428 0.16014-0.23954 0.3597-0.49274 0.36822-0.4672 3e-3 0.01-5e-3 0.0611-0.0187 0.11424-0.0689 0.27097-0.0779 0.77731-0.0186 1.0475 0.19454 0.88611 0.81896 1.5829 1.6538 1.8454 0.0818 0.0257 0.15215 0.0491 0.15621 0.052 4e-3 3e-3 -0.0488 0.0627-0.11754 0.13287-0.4256 0.43492-0.71222 0.95078-0.85653 1.5415-0.0688 0.28187-0.0901 0.47163-0.0889 0.79375 1e-3 0.31418 0.0279 0.53371 0.0977 0.8021 0.023 0.0884 0.0387 0.16386 0.035 0.1676-4e-3 4e-3 -0.0655-0.0353-0.13729-0.0867z" style="paint-order:stroke markers fill"/>
<path d="m410.64 38.358c-0.0494-0.1663-0.0779-0.55481-0.0598-0.81514 0.0269-0.38679 0.11549-0.70627 0.29656-1.0692 0.13495-0.27051 0.27542-0.47282 0.47764-0.68794l0.14533-0.1546 0.0301 0.1227c0.0386 0.1576 0.13437 0.3481 0.23291 0.46336 0.0784 0.0917 0.26074 0.24822 0.2892 0.24822 0.0373 0 9e-3 0.0329-0.0796 0.0912-0.57073 0.37729-1.0588 1.0246-1.2771 1.6939-0.0317 0.0972-0.0485 0.12995-0.0552 0.10749z" style="paint-order:stroke markers fill"/>
<path d="m411.3 37.999c0-2e-3 0.0142-0.0292 0.0315-0.0611 0.23904-0.44014 0.59099-0.81243 1.014-1.0726 0.0373-0.0229 0.0691-0.0417 0.0707-0.0417 2e-3 0 6e-3 0.0154 0.01 0.0341 0.0132 0.0666 0.0469 0.15097 0.0828 0.20704 8e-3 0.013 0.0149 0.025 0.0147 0.0266-1.9e-4 2e-3 -0.0323 0.0188-0.0713 0.0382-0.40207 0.19906-0.80067 0.49676-1.1142 0.83216-0.0208 0.0223-0.0378 0.0391-0.0378 0.0374z" style="paint-order:stroke markers fill"/>
<path d="m411.7 38.579c4e-3 -3e-3 0.0286-0.0237 0.0558-0.0466 0.21423-0.18019 0.45619-0.34551 0.71084-0.48568 0.0849-0.0468 0.2753-0.1407 0.27964-0.13801 2e-3 1e-3 4e-3 8e-3 4e-3 0.0154 5e-5 0.0174 0.0174 0.0929 0.0291 0.12688 7e-3 0.0208 0.0335 0.0802 0.0442 0.0998 7.9e-4 1e-3 -3e-3 4e-3 -9e-3 5e-3 -0.0164 4e-3 -0.20248 0.0689-0.31831 0.11074-0.23538 0.0851-0.6006 0.2301-0.77256 0.30669-0.0264 0.0118-0.033 0.0134-0.023 6e-3z" style="paint-order:stroke markers fill"/>
<path d="m411.9 38.99c0.0278-0.0162 0.41353-0.17242 0.58291-0.23603 0.1831-0.0688 0.46264-0.16748 0.46514-0.16426 5.3e-4 5.3e-4 4e-3 0.0183 8e-3 0.0394 8e-3 0.0473 0.0232 0.0944 0.0445 0.14282 9e-3 0.0203 0.0157 0.0374 0.0151 0.0378-2e-3 2e-3 -0.22416 0.0469-0.29265 0.0598-0.23183 0.0438-0.47797 0.0821-0.71891 0.11181-0.11054 0.0137-0.11277 0.0138-0.10378 9e-3z" style="paint-order:stroke markers fill"/>
<path d="m409.24 53.044c0.0207-0.0232 0.2267-0.21128 0.34147-0.31174 0.93053-0.8145 1.9631-1.4647 3.1016-1.9531 0.77662-0.33314 1.6533-0.59918 2.4555-0.74518 0.0547-0.01 0.10531-0.0194 0.11254-0.0209 0.0128-3e-3 0.0131-2e-3 0.0131 0.0433 0 0.05 0.0122 0.1304 0.0255 0.16812l8e-3 0.0237-0.12654 0.022c-1.0564 0.18322-2.086 0.50274-3.0644 0.95099-0.17675 0.081-0.58469 0.28561-0.7542 0.37833-0.65168 0.35645-1.2508 0.75579-1.83 1.2197-0.10004 0.0801-0.27358 0.22492-0.27784 0.23181-2e-3 3e-3 -6e-3 6e-3 -0.01 6e-3s-1e-3 -6e-3 5e-3 -0.0125z" style="paint-order:stroke markers fill"/>
<path d="m406.17 58.256c0-0.0247 0.26979-0.58363 0.40893-0.84728 0.33971-0.64371 0.86854-1.4362 1.3283-1.9906 0.54375-0.65571 1.1836-1.2842 1.8346-1.8018 0.91783-0.72987 1.9888-1.3477 3.0923-1.7841 0.45859-0.18132 1.4198-0.48621 1.475-0.46783 0.01 3e-3 -0.0245 0.0538-0.0766 0.11222-0.28953 0.32448-0.51334 0.79117-0.59859 1.2482-0.0465 0.24925-0.0431 0.71369 7e-3 0.96288 0.10304 0.51199 0.35255 0.98002 0.71801 1.3469l0.1606 0.1612-0.0531 9e-3c-0.0292 5e-3 -0.17589 0.0279-0.32596 0.051-2.1317 0.3282-4.1999 0.9917-6.135 1.9682-0.56264 0.28392-1.2511 0.67319-1.6991 0.96066-0.075 0.0482-0.13642 0.0804-0.13642 0.0716z" style="paint-order:stroke markers fill"/>
<path d="m406.59 58.56c0.0182-0.0139 0.16974-0.10737 0.33678-0.20779 2.2722-1.3659 4.8146-2.2757 7.4321-2.6594 0.32154-0.0471 0.29997-0.0582 0.21707 0.11122-0.13074 0.26717-0.1863 0.4911-0.20042 0.80776-0.0254 0.56991 0.19788 1.1274 0.60946 1.5217l0.10561 0.10118-0.55442 0.011c-2.6792 0.0534-5.6919 0.18176-7.6155 0.32453-0.11823 9e-3 -0.24846 0.0157-0.28939 0.0155-0.0702-5.3e-4 -0.0725-2e-3 -0.0413-0.0257z" style="paint-order:stroke markers fill"/>
<path d="m415.1 60.361c-2.6272-0.15163-5.3197-0.57922-7.7804-1.2356l-0.33073-0.0882 0.10748-0.0107c0.13477-0.0134 0.99415-0.0659 1.7859-0.10913 1.8892-0.10322 3.847-0.1732 5.8448-0.20889l0.62757-0.0112-0.0605 0.0841c-0.14097 0.19623-0.23477 0.45916-0.25331 0.71011-0.0186 0.25159 0.0524 0.54925 0.1838 0.7704 0.0315 0.0529 0.0572 0.0994 0.0572 0.10335 0 4e-3 -0.0205 6e-3 -0.0455 4e-3s-0.0864-5e-3 -0.13643-8e-3z" style="paint-order:stroke markers fill"/>
<path d="m414.9 61.654c-2.3453-0.25141-4.5511-0.82744-6.7098-1.7522-0.16607-0.0712-0.29869-0.1326-0.29472-0.13658 4e-3 -4e-3 0.15101 0.0267 0.32675 0.0683 2.2078 0.52154 4.6386 0.87419 6.8147 0.9887 0.21627 0.0114 0.40062 0.0253 0.40966 0.0309 0.0104 6e-3 6e-3 0.0343-0.011 0.0751-0.08 0.18908-0.097 0.45698-0.0417 0.65647l0.0309 0.11127-0.0846-2e-3c-0.0465-1e-3 -0.24459-0.019-0.44013-0.04z" style="paint-order:stroke markers fill"/>
<path d="m414.24 64.671c-2.2681-0.53681-4.2345-1.5531-5.9779-3.0896-0.27137-0.23916-0.88944-0.85722-1.1176-1.1176-0.30827-0.35177-0.72618-0.86816-0.70261-0.86816 5e-3 0 0.16413 0.0772 0.35277 0.17147 2.1424 1.0711 4.4344 1.807 6.8005 2.1834 0.39401 0.0627 1.0577 0.14973 1.2857 0.16861 0.075 6e-3 0.13643 0.0148 0.13643 0.019 0 4e-3 -0.0522 0.0561-0.11595 0.11511-0.22189 0.20543-0.40607 0.48893-0.50996 0.78497-0.17611 0.50181-0.14551 1.0274 0.0881 1.5141 0.0713 0.14857 0.0837 0.18574 0.0614 0.18456-0.0154-7.9e-4 -0.15075-0.0305-0.30082-0.066z" style="paint-order:stroke markers fill"/>
<path d="m413.68 68.749c-1.0315-0.34789-1.8803-0.76397-2.7566-1.3514-2.1067-1.4121-3.6769-3.472-4.4787-5.8753-0.17375-0.5208-0.36537-1.2708-0.41195-1.6123l-0.0102-0.0744 0.046 0.0576c0.62815 0.78685 0.77886 0.9585 1.2934 1.4731 0.42373 0.42373 0.68889 0.66409 1.0925 0.99029 1.6352 1.3216 3.5279 2.2528 5.5645 2.7376 0.1819 0.0433 0.36233 0.0871 0.40096 0.0973l0.0702 0.0185-0.1172 0.091c-0.4117 0.31949-0.73745 0.83682-0.86615 1.3755-0.17209 0.72038-0.0119 1.5043 0.42545 2.0822 0.0352 0.0465 0.0616 0.0866 0.0588 0.0891-3e-3 2e-3 -0.14285-0.0419-0.31111-0.0987z" style="paint-order:stroke markers fill"/>
<path d="m413.31 72.504c-2.0472-0.7478-3.8137-2.0131-5.151-3.6896-1.5107-1.8939-2.3791-4.141-2.54-6.5732-0.0298-0.4504 5.3e-4 -1.8614 0.0382-1.7694 6e-3 0.0137 0.0304 0.11038 0.0553 0.21497 0.58335 2.4576 1.9754 4.7051 3.9236 6.3349 1.3079 1.0941 2.8384 1.8969 4.4885 2.3544l0.0952 0.0264-0.16399 0.12353c-0.36624 0.27589-0.63088 0.64473-0.76986 1.073-0.0841 0.25915-0.0998 0.36739-0.0998 0.68766 0 0.17932 9e-3 0.33341 0.0229 0.40514 0.0532 0.26955 0.18427 0.59437 0.32263 0.79955 0.0328 0.0487 0.0597 0.0915 0.0597 0.0951 0 0.0162-0.0569-5.3e-4 -0.28112-0.0823z" style="paint-order:stroke markers fill"/>
<path d="m413.92 73.92c-0.76722-0.23803-1.3879-0.48475-2.0089-0.79849-2.8797-1.455-5.0454-4.0103-6.0123-7.0937-0.0897-0.28602-0.27226-0.98464-0.27144-1.0387 2.3e-4 -0.0154 0.0551 0.13579 0.12188 0.33588 0.76718 2.298 2.1364 4.2515 4.0245 5.7417 1.2129 0.95728 2.6276 1.6818 4.1449 2.1228 0.15386 0.0447 0.28202 0.0836 0.28481 0.0864 3e-3 3e-3 -0.0146 0.034-0.0386 0.0693-0.0803 0.11815-0.12638 0.28066-0.1278 0.45061-8e-4 0.0912-8e-3 0.15232-0.0178 0.15138-9e-3 -8e-4 -0.0537-0.0131-0.0992-0.0272z" style="paint-order:stroke markers fill"/>
<path d="m413.62 74.679c-2.9099-0.92812-5.337-2.8835-6.8574-5.5248-0.16013-0.27817-0.49306-0.92834-0.49306-0.96288 0-0.0117 0.0556 0.0806 0.12354 0.2051 0.57745 1.058 1.276 1.9917 2.1252 2.8408 1.1918 1.1915 2.5956 2.1178 4.1634 2.7472 0.29033 0.11656 0.80621 0.29376 1.1036 0.37909 0.13643 0.0391 0.24926 0.0717 0.25074 0.0723 2e-3 5.3e-4 -0.0151 0.0532-0.0368 0.11687-0.0217 0.0637-0.0397 0.13994-0.0399 0.1695-2.5e-4 0.0323-9e-3 0.0533-0.0211 0.0527-0.0114-5.3e-4 -0.15461-0.0437-0.31833-0.096z" style="paint-order:stroke markers fill"/>
<path d="m400 85.799c-0.40148-0.66595-1.033-1.932-1.3299-2.666-0.64704-1.5999-1.1218-3.457-1.3452-5.2619-0.10085-0.81502-0.14075-2.897-0.0722-3.7673 0.40139-5.0946 2.5896-9.6633 6.3143-13.184 0.46374-0.43828 1.5515-1.3489 1.5787-1.3216 8e-3 8e-3 -0.0374 0.22316-0.10032 0.47873-0.25694 1.0439-0.35075 1.8551-0.35126 3.0374-7.9e-4 2.1125 0.43631 3.9304 1.3948 5.7995 1.2042 2.3482 3.2628 4.367 5.6295 5.5207l0.40647 0.19814-0.50002 0.0315c-0.71263 0.0449-1.2228 0.1075-1.7862 0.21914-3.5605 0.70543-6.5913 3.0116-8.1983 6.2381-0.75346 1.5128-1.1324 2.9566-1.2399 4.724l-0.0341 0.56126z" style="paint-order:stroke markers fill"/>
<path d="m400.92 85.531c0.14225-2.0771 0.92968-4.1584 2.2432-5.9289 0.43654-0.58842 1.5734-1.7228 2.1683-2.1635 1.9999-1.4816 4.3464-2.2799 6.7015-2.2799h0.58387l-0.29633 0.17531c-0.39082 0.2312-0.87333 0.74575-1.0944 1.167-0.54249 1.034-0.47096 2.346 0.17708 3.248 0.0898 0.12507 0.16337 0.23409 0.16337 0.24226 0 8e-3 -0.45779 6e-3 -1.0173-5e-3 -1.1325-0.0221-1.8134 0.0423-2.672 0.25283-2.9365 0.7199-5.3543 2.6125-6.7447 5.2796l-0.24383 0.46772z" style="paint-order:stroke markers fill"/>
<path d="m407.96 34.006c-2e-3 -0.0364 0.0656-0.34744 0.10845-0.50122 0.30832-1.1063 1.0065-2.0552 1.9666-2.6727 0.11303-0.0727 0.18073-0.11324 0.18385-0.11009 1e-3 1e-3 0.0105 0.0231 0.0206 0.0486s0.029 0.0645 0.042 0.0867c0.0129 0.0222 0.0226 0.0411 0.0216 0.042-1e-3 1e-3 -0.0243 0.0143-0.0517 0.0297-0.19703 0.1108-0.46347 0.29518-0.65481 0.45314-0.2425 0.2002-0.49051 0.44975-0.68258 0.68682-0.26317 0.32484-0.49615 0.70521-0.6607 1.0787-0.11322 0.25698-0.1952 0.49331-0.26769 0.77174-0.0138 0.0531-0.0253 0.092-0.0256 0.0866z" style="paint-order:stroke markers fill"/>
<path d="m403.57 19.78c3e-3 -3e-3 0.0318-0.0272 0.063-0.0535 0.21707-0.18268 0.44397-0.35877 0.67849-0.52656 0.0581-0.0416 0.0644-0.0456 0.0665-0.0421 1e-3 2e-3 9e-3 0.0135 0.0164 0.0254 8e-3 0.0119 0.0138 0.0219 0.0134 0.0223-2.6e-4 2.6e-4 -0.0509 0.0341-0.11232 0.0749-0.21836 0.14524-0.42067 0.28469-0.63043 0.43453-0.0534 0.0382-0.0981 0.0697-0.0992 0.0701-1e-3 2.6e-4 7.9e-4 -2e-3 4e-3 -5e-3z" style="paint-order:stroke markers fill"/>
<path d="m399.03 17.007c-2.6e-4 -8e-3 3e-3 -0.0607 8e-3 -0.11693 0.10184-1.1758 0.58981-2.2402 1.4146-3.0859l0.0883-0.0905 0.0227 0.0316c0.0125 0.0174 0.0368 0.0464 0.054 0.0644l0.0313 0.0328-0.12439 0.12511c-0.50406 0.50696-0.88921 1.0901-1.1524 1.7447-0.16378 0.40735-0.269 0.80544-0.33602 1.2713-3e-3 0.0209-6e-3 0.0314-6e-3 0.0234z" style="paint-order:stroke markers fill"/>
<path d="m396.23 22.207c-2.2749-0.10612-4.4681-0.66282-6.481-1.6451-0.31037-0.15146-0.69975-0.35183-0.86529-0.44527-3.892-2.1968-6.693-5.8228-7.8402-10.149-0.0926-0.34909-0.21755-0.91093-0.20857-0.93755 4e-3 -0.0114 0.0561 0.0396 0.11619 0.11344 0.06 0.0738 0.23368 0.26665 0.38587 0.42851 1.9184 2.0404 4.3849 3.3636 7.1432 3.8321 0.73432 0.12473 1.0819 0.15041 2.0553 0.15187 0.94309 1e-3 1.1105-8e-3 1.8234-0.10693 1.4682-0.2029 3.0766-0.74001 4.3118-1.4399 0.10089-0.0572 0.1877-0.0997 0.19291-0.0945 5e-3 5e-3 -0.0493 0.12201-0.12114 0.25957-0.3576 0.68475-0.59167 1.4042-0.71623 2.2016-0.0432 0.27667-0.0513 0.42707-0.0519 0.97052-7.9e-4 0.69965 0.0215 0.92471 0.14941 1.5084 0.48164 2.1973 2.0513 4.0398 4.1504 4.8719l0.23218 0.092-0.16202 0.0368c-0.52778 0.11985-1.3728 0.24447-2.0914 0.30843-0.39278 0.035-1.633 0.0615-2.0229 0.0434z" style="paint-order:stroke markers fill"/>
<path d="m311.64 8.1029c-2.3382-0.11924-4.1231-0.44429-6.1516-1.1202-2.4882-0.82912-4.8234-2.1066-6.829-3.7356l-0.24748-0.20102 0.5286-0.0212c0.99796-0.04 1.7943-0.23927 2.6317-0.65865 1.8543-0.92859 3.1234-2.7737 3.3428-4.86l0.0403-0.38281 0.24801 0.26588c3.8039 4.0781 9.3612 6.0492 14.87 5.2743 5.4533-0.767 10.181-4.0983 12.741-8.9772 0.30992-0.5907 0.3196-0.55955 0.0512 0.16453-1.5812 4.265-4.4369 7.9154-8.1951 10.476-3.1033 2.1142-6.7197 3.3942-10.484 3.7108-0.58852 0.0495-2.0984 0.0883-2.5466 0.0654z" style="paint-order:stroke markers fill"/>
<path d="m289.18 31.167c-1.549-0.0869-3.3594-0.28153-4.788-0.51479l-0.789-0.12882 0.63056-0.12565c4.6282-0.9222 8.9222-3.6448 11.753-7.4517 3.2608-4.3855 4.533-9.8614 3.5484-15.274-0.20907-1.1493-0.64906-2.6831-1.0453-3.6439-0.0786-0.19057-0.13746-0.35185-0.13081-0.35839 7e-3 -7e-3 0.23309 0.15725 0.5032 0.36398 2.8082 2.1493 6.2847 3.658 9.7788 4.2435 1.4086 0.23606 2.1756 0.29877 3.6916 0.30182 1.4091 3e-3 2.0686-0.0397 3.2467-0.20952 4.248-0.61228 8.1755-2.4095 11.463-5.2456 1.1643-1.0044 2.6213-2.6132 3.5639-3.9351 0.83535-1.1716 1.7674-2.8498 2.3568-4.2437 0.3005-0.71066 0.75786-2.0253 0.95022-2.7312 0.13661-0.50136 0.14407-0.43579 0.0513 0.45103-0.87364 8.3541-4.0634 16.106-9.2994 22.599-1.3295 1.6487-3.2604 3.6868-4.7322 4.9948-3.7755 3.3553-8.0076 5.9926-12.574 7.8356-4.3685 1.7632-8.849 2.7638-13.689 3.057-0.68878 0.0417-3.829 0.0525-4.4901 0.0154z" style="paint-order:stroke markers fill"/>
<path d="m283.32 29.87c0.43149-0.3548 1.3136-1.2488 1.6638-1.6862 2.6806-3.3482 3.356-7.8209 1.783-11.807-0.28334-0.71797-0.86781-1.828-1.1874-2.255-0.0433-0.0579-0.0788-0.11158-0.0788-0.11927 0-8e-3 0.15255 0.0294 0.339 0.0825 2.456 0.69919 5.0025 0.42649 7.2512-0.77649 1.957-1.0469 3.5388-2.8324 4.3578-4.9188 0.41932-1.0683 0.61353-2.035 0.64756-3.2234l0.0217-0.75943 0.17396 0.49485c1.5469 4.4003 1.4461 9.1196-0.28746 13.457-1.5021 3.7583-4.2608 7.0217-7.7248 9.1379-2.0814 1.2716-4.4288 2.1527-6.7634 2.5386-0.17281 0.0286-0.35782 0.0608-0.41114 0.0716-0.0777 0.0157-0.0351-0.0312 0.21497-0.23684z" style="paint-order:stroke markers fill"/>
<path d="m302.34 108.32c-0.27436-1.5478-1.2899-3.9697-2.3367-5.5728-2.7227-4.1696-7.072-6.8801-12.12-7.5533-1.0498-0.14-3.4273-0.10332-4.5558 0.0703-0.52299 0.0804-0.96138 0.13578-0.9742 0.12296-0.0128-0.0128 0.20157-0.2745 0.47643-0.58149 3.9909-4.4574 6.1119-9.9422 6.1119-15.805 0-3.7877-0.84998-7.3176-2.5723-10.683-0.71867-1.4041-1.2354-2.2344-2.1341-3.429-1.2145-1.6144-2.6835-3.1254-4.1664-4.2854-0.29639-0.23184-0.6016-0.47519-0.67824-0.54078l-0.13934-0.11925 0.16537 0.0432c0.76065 0.19855 4.0873 1.7826 5.6224 2.6773 9.5929 5.5908 16.406 15.071 18.587 25.862 0.50495 2.4991 0.71272 4.3757 0.77261 6.9784 0.0921 4.002-0.40487 7.8136-1.5222 11.675-0.30506 1.0542-0.41709 1.3891-0.46473 1.3891-0.015 0-0.0471-0.11162-0.0713-0.24805z" style="paint-order:stroke markers fill"/>
<path d="m310.21 124.57c0.25207-1.0861 0.3272-1.54 0.39056-2.3596 0.031-0.40107 0.0312-1.3656 2.7e-4 -1.7902-0.18028-2.4808-1.083-4.8586-2.5836-6.8054-0.69409-0.90045-1.5397-1.7337-2.4555-2.4197-0.64934-0.48637-1.517-1.0115-2.1106-1.2774-0.10611-0.0475-0.19293-0.0939-0.19293-0.10308 0-9e-3 0.071-0.0236 0.15785-0.0321 0.0868-8e-3 0.34202-0.0333 0.56711-0.0552 0.58837-0.0572 2.2681-0.0564 2.8756 1e-3 2.7478 0.26097 5.1244 1.0272 7.4377 2.3979 1.6446 0.97453 3.2181 2.3267 4.481 3.8508 1.6003 1.9313 2.8143 4.3242 3.4243 6.7498 0.10503 0.41761 0.23792 1.0284 0.22628 1.04-4e-3 4e-3 -0.089-0.0597-0.18816-0.14214-2.1246-1.7664-4.9409-2.4066-7.6161-1.7313-0.61577 0.15544-1.1275 0.34641-1.7306 0.64577-0.89179 0.44272-1.6093 0.97031-2.338 1.7191-0.24334 0.25007-0.35439 0.35017-0.34537 0.31133z" style="paint-order:stroke markers fill"/>
<path d="m339.81 131.23c-0.0173-0.0885-0.0723-0.31078-0.12228-0.49399-0.97095-3.5616-3.5679-6.3888-7.0163-7.6384-1.6805-0.60896-3.5219-0.8085-5.2928-0.57355-0.91498 0.1214-1.9389 0.38896-2.7116 0.70852-0.14083 0.0583-0.25937 0.1026-0.26341 0.0986-4e-3 -4e-3 0.16906-0.13926 0.38468-0.3005 1.686-1.2608 3.5166-2.1218 5.5571-2.6139 2.8298-0.68243 5.836-0.51436 8.5977 0.48066 3.6053 1.299 6.5963 3.9414 8.3236 7.3537 0.21208 0.41894 0.55064 1.167 0.53475 1.1815-4e-3 3e-3 -0.13827-0.0716-0.29905-0.16669-1.288-0.76151-2.8381-0.96143-4.303-0.55499-1.2882 0.35737-2.4683 1.2451-3.1662 2.3816-0.20507 0.33398-0.18686 0.32275-0.2231 0.13749z" style="paint-order:stroke markers fill"/>
<path d="m401.75 85.402c0-0.0242 0.28083-0.48143 0.42515-0.69221 0.46968-0.68597 1.0124-1.2994 1.6255-1.8375 2.1256-1.8654 4.9219-2.7164 7.7306-2.353 0.14552 0.0188 0.26714 0.0367 0.27025 0.0397 3e-3 3e-3 -0.0441 0.0636-0.10492 0.13481-0.1381 0.16156-0.22546 0.30717-0.28934 0.48219-0.1213 0.33237-0.12886 0.69857-0.021 1.0156 0.0178 0.0523 0.0279 0.0951 0.0225 0.095-5e-3 -3e-5 -0.10285-0.0182-0.21654-0.0405-0.56427-0.11026-1.0453-0.15788-1.7115-0.16942-0.81303-0.0141-1.3986 0.0363-2.1663 0.18631-2.0089 0.39263-3.9134 1.4337-5.3355 2.9166-0.12597 0.13136-0.22904 0.23144-0.22904 0.22241z" style="paint-order:stroke markers fill"/>
<path d="m401.47 86.508c0.77996-1.052 1.7375-1.9286 2.8162-2.5781 1.0989-0.66171 2.3401-1.1072 3.605-1.2937 0.40781-0.0602 0.73262-0.0857 1.2154-0.0956 0.58527-0.012 1.0474 0.0162 1.6176 0.0987l0.13763 0.0199-0.18724 0.12222c-0.46856 0.30584-0.79584 0.76684-0.93398 1.3156-0.0571 0.22684-0.072 0.6247-0.0321 0.85868 0.0296 0.17334 0.0898 0.37913 0.15245 0.52082 0.0216 0.0489 0.0393 0.0907 0.0393 0.0929 0 2e-3 -0.0702-0.013-0.15591-0.0338-0.54996-0.13296-1.1984-0.23587-1.8367-0.29151-0.33184-0.0289-1.5224-0.0288-1.8438 2e-4 -1.5911 0.14351-2.9872 0.53087-4.3383 1.2036-0.17141 0.0854-0.3149 0.1552-0.31886 0.1552-4e-3 0 0.0245-0.0428 0.0633-0.0951z" style="paint-order:stroke markers fill"/>
<path d="m408.75 88.056c-1.4177-0.49313-3.0035-0.83075-4.5641-0.9717-0.65485-0.0591-0.99786-0.0736-1.7733-0.0746l-0.76459-1e-3 0.22715-0.11429c1.3302-0.66925 2.6968-1.0506 4.2538-1.187 0.31599-0.0277 1.4045-0.0276 1.7198 7e-5 0.56078 0.0493 1.0927 0.12829 1.5462 0.22963 0.14552 0.0325 0.28659 0.0639 0.31348 0.0698l0.0489 0.0107-0.0991 0.0763c-0.58714 0.45179-0.82154 1.2473-0.57828 1.9626 0.0267 0.0785 0.0336 0.11754 0.0205 0.1164-0.0108-1e-3 -0.16852-0.0535-0.35042-0.11677z" style="paint-order:stroke markers fill"/>
<path d="m408.49 89.576c-1.159-0.5067-2.8332-1.1231-4.192-1.5434-0.39586-0.12245-1.4292-0.41913-1.7611-0.50564-0.15199-0.0396-0.20044-0.0577-0.16537-0.0617 0.0859-0.01 1.1306 0.0297 1.4654 0.0554 1.778 0.13654 3.5597 0.51997 5.1438 1.107l0.20956 0.0777-0.0938 0.0956c-0.19392 0.19759-0.28307 0.41063-0.29636 0.70818-6e-3 0.12329-0.0146 0.18546-0.0269 0.18434-0.0102-1e-3 -0.13766-0.0538-0.28318-0.11738z" style="paint-order:stroke markers fill"/>
<path d="m406.38 92.469c-1.6386-1.0642-3.0924-2.3332-4.3611-3.8069-0.24112-0.28007-0.6843-0.83512-0.67457-0.84485 0.0276-0.0276 2.6106 0.9764 3.9397 1.5313 0.88034 0.36754 2.4394 1.0473 2.6514 1.156l0.0552 0.0283-0.0692 0.0207c-0.23845 0.0714-0.53133 0.2537-0.73501 0.45737-0.38084 0.38085-0.57223 0.87508-0.55111 1.4232 4e-3 0.1127 7e-3 0.20463 6e-3 0.20429-8e-4 -2.7e-4 -0.11861-0.0766-0.26162-0.1695z" style="paint-order:stroke markers fill"/>
<path d="m405.1 95.156c-0.35263-0.2823-0.62333-0.52455-0.9401-0.84132-1.604-1.604-2.6785-3.6427-3.1013-5.8842-0.0257-0.13629-0.0453-0.2492-0.0436-0.25092 2e-3 -2e-3 0.0924 0.10932 0.20144 0.24672 0.80192 1.0102 1.8616 2.0914 2.8952 2.9542 0.66486 0.55498 1.507 1.165 2.2791 1.6508l0.0811 0.051-0.13255 0.0667c-0.25036 0.12588-0.51689 0.35831-0.6881 0.60006-0.10958 0.15472-0.23652 0.42935-0.28683 0.62053-0.0573 0.21775-0.0716 0.58454-0.0318 0.81408 0.0148 0.0854 0.0239 0.15841 0.0201 0.16219-4e-3 4e-3 -0.11745-0.0816-0.25259-0.18983z" style="paint-order:stroke markers fill"/>
<path d="m403.81 97.574c-2.2738-1.9918-3.5077-4.9583-3.3152-7.9702 0.0186-0.29061 0.0938-0.92784 0.11367-0.96341 8e-3 -0.0135 0.021 0.0255 0.0339 0.0985 0.0341 0.19335 0.17322 0.74165 0.26575 1.0471 0.72468 2.392 2.2587 4.5577 4.264 6.0198l0.15495 0.11298-0.11361 0.0307c-0.15403 0.0416-0.42096 0.17392-0.55184 0.27347-0.22033 0.16761-0.39426 0.38378-0.51287 0.63745-0.0945 0.20222-0.1346 0.3784-0.14659 0.64474l-0.0103 0.22815z" style="paint-order:stroke markers fill"/>
<path d="m402.69 99.306c-0.87988-0.81294-1.6484-1.8699-2.166-2.9792-0.90566-1.9407-1.1446-4.1233-0.67974-6.2094 0.0551-0.24735 0.19179-0.75798 0.20046-0.74892 3e-3 3e-3 -2e-3 0.0866-0.01 0.18668-0.0197 0.25355-0.0189 1.0597 1e-3 1.3477 0.15438 2.1996 0.96751 4.2171 2.386 5.92 0.25752 0.30915 0.92598 0.97743 1.2396 1.2393l0.24458 0.20419-0.14536 0.0693c-0.3476 0.16571-0.60913 0.46254-0.73195 0.83075-0.028 0.0838-0.0563 0.20455-0.0629 0.26825l-0.012 0.1158z" style="paint-order:stroke markers fill"/>
<path d="m397.52 103.3c-0.30879-0.47307-0.53704-0.87568-0.76516-1.3497-1.1954-2.4839-1.4432-5.3445-0.69263-7.9953 0.58121-2.0527 1.7305-3.9089 3.2979-5.3263 0.25077-0.22676 0.6689-0.57437 0.6689-0.55607 0 5e-3 -0.0138 0.0375-0.0308 0.0712-0.0556 0.11089-0.22027 0.53599-0.31122 0.8035-0.52965 1.558-0.67439 3.1996-0.4252 4.8224 0.32129 2.0923 1.2916 4.0393 2.7593 5.5368l0.28082 0.28652-0.16493-0.0137c-0.27088-0.0225-0.75554-0.0137-0.96693 0.0176-1.4901 0.22011-2.7054 1.1969-3.2328 2.5982-0.12279 0.32621-0.23638 0.87332-0.24149 1.163-4e-3 0.19918-9e-3 0.19743-0.17568-0.0583z" style="paint-order:stroke markers fill"/>
<path d="m384.63 113.33c-0.0138-0.0418-0.09-0.26017-0.16921-0.48526-0.55595-1.5798-0.87845-3.1086-1.031-4.8877-0.0408-0.47575-0.0547-1.8958-0.0238-2.4322 0.0543-0.9425 0.15942-1.7864 0.33132-2.6598 0.91413-4.6447 3.4874-8.7395 7.2827-11.589 2.4173-1.8148 5.2425-3.0284 8.2336-3.537 0.26641-0.0453 0.48779-0.079 0.49194-0.0748 4e-3 4e-3 -0.11574 0.10859-0.26645 0.23208-3.3653 2.7574-4.9396 7.1918-4.0748 11.478 0.29579 1.466 0.83513 2.7955 1.6507 4.069 0.11939 0.18644 0.21391 0.34214 0.21003 0.34601-4e-3 4e-3 -0.15302-0.0351-0.33143-0.0866-0.5207-0.15025-0.98671-0.24607-1.5639-0.32156-0.45797-0.0599-1.797-0.0603-2.2451-5.3e-4 -1.1755 0.15647-2.1541 0.44921-3.1385 0.93891-1.0197 0.50723-1.8043 1.0804-2.6148 1.9103-1.5344 1.571-2.4569 3.5787-2.6793 5.8314-0.0152 0.15435-0.0289 0.52005-0.0304 0.81266-2e-3 0.29262-4e-3 0.53203-5e-3 0.53203-1e-3 1e-5 -0.0132-0.0342-0.0271-0.076z" style="paint-order:stroke markers fill"/>
<path d="m385.18 113.95c-0.0988-0.88467-0.0758-1.7015 0.0726-2.571 0.47231-2.7682 2.1974-5.1663 4.6751-6.499 1.9074-1.0259 4.1077-1.3351 6.2509-0.87833 0.16332 0.0348 0.22 0.0647 0.12278 0.0647-0.0726 0-0.40369 0.0622-0.62301 0.11711-1.814 0.45387-3.2786 1.8239-3.8524 3.6036-0.37585 1.1657-0.35104 2.3967 0.072 3.5705 0.0374 0.10384 0.0662 0.19044 0.0639 0.19245-2e-3 2e-3 -0.0786-0.0256-0.1695-0.0615-0.39419-0.15518-0.86106-0.26915-1.3146-0.32091-0.30442-0.0347-1.0049-0.0253-1.2733 0.0172-0.58106 0.092-1.0295 0.22891-1.5131 0.462-0.81685 0.39375-1.481 0.95837-1.9957 1.6966-0.14661 0.21029-0.2455 0.37786-0.37755 0.63971l-0.11001 0.21814z" style="paint-order:stroke markers fill"/>
<path d="m392.22 110.82c-0.1432-0.51676-0.18995-0.903-0.17776-1.4686 0.01-0.45912 0.041-0.70019 0.14229-1.102 0.2395-0.95034 0.78175-1.8481 1.5058-2.4931 0.85664-0.76306 1.8924-1.1902 3.0766-1.2686l0.1569-0.0104-0.14863 0.093c-0.0817 0.0512-0.20427 0.13529-0.27227 0.18693-0.16335 0.12405-0.45859 0.40976-0.58378 0.56492-0.65764 0.81511-0.91135 1.871-0.69634 2.8981 0.0468 0.22335 0.14549 0.52116 0.2394 0.7221 0.0357 0.0765 0.0619 0.14207 0.0582 0.14578-4e-3 4e-3 -0.0379-2e-3 -0.076-0.0119-0.44599-0.12009-1.0068-0.0978-1.4657 0.0584-0.3815 0.1298-0.69051 0.3252-0.9907 0.62646-0.31816 0.31929-0.50957 0.62841-0.63568 1.0266-0.0288 0.0909-0.058 0.1799-0.0649 0.19765-9e-3 0.0236-0.0274-0.0212-0.0673-0.16536z" style="paint-order:stroke markers fill"/>
<path d="m395.8 108.54c-5e-3 -0.0126-0.0152-0.0405-0.0238-0.062-0.0297-0.074-0.0972-0.33525-0.11989-0.46368-0.0885-0.50131-0.0464-1.0211 0.12169-1.502 0.21657-0.61969 0.63056-1.1486 1.1842-1.513 0.11939-0.0786 0.31625-0.18885 0.32374-0.18135 2e-3 2e-3 -0.0335 0.0807-0.0797 0.17394-0.29167 0.58776-0.36233 1.2507-0.20068 1.8831 0.0378 0.14795 0.10261 0.33327 0.15817 0.45235l0.045 0.0965h-0.0503c-0.0799 0-0.24885 0.0332-0.3619 0.071-0.3088 0.10346-0.59602 0.32258-0.77289 0.58962-0.0826 0.12472-0.12766 0.21708-0.17555 0.35982-0.0294 0.0875-0.042 0.11265-0.048 0.0957z" style="paint-order:stroke markers fill"/>
<path d="m397.52 107c-0.1-0.2761-0.13039-0.43807-0.13813-0.73583-4e-3 -0.17052-1e-3 -0.2536 0.0136-0.35664 0.0372-0.25725 0.10376-0.47392 0.21541-0.7014l0.066-0.13442 8e-3 0.0701c4e-3 0.0386 0.0138 0.12273 0.0209 0.18704 0.0353 0.3201 0.13422 0.64725 0.28984 0.95883 0.0651 0.13027 0.10397 0.19723 0.19783 0.34053 0.0157 0.024 0.0131 0.0258-0.0812 0.0552-0.22296 0.0695-0.36548 0.17502-0.53577 0.39658-0.0179 0.0233-0.0201 0.0203-0.0564-0.08z" style="paint-order:stroke markers fill"/>
<path d="m399.01 105.93c-0.0891-0.10321-0.18305-0.2273-0.26284-0.34713-0.0475-0.0714-0.11519-0.18061-0.11971-0.19324-1e-3 -3e-3 0.0282 0.0241 0.065 0.0603 0.12962 0.12744 0.24777 0.239 0.38229 0.36097 0.0319 0.0289 0.0592 0.0531 0.0606 0.0536 1e-3 5.3e-4 -9e-3 0.0137-0.0239 0.0292-0.0146 0.0155-0.0346 0.0391-0.0445 0.0524-0.01 0.0133-0.0189 0.0241-0.0201 0.0241-1e-3 0-0.0178-0.0181-0.0369-0.0402z" style="paint-order:stroke markers fill"/>
<path d="m399.37 105.47c-0.12165-0.11034-0.35597-0.33215-0.35371-0.33481 7.9e-4 -8e-4 0.0985 0.0599 0.16807 0.10461 0.10686 0.0687 0.30987 0.20647 0.30987 0.21036 0 1e-3 -3e-3 5e-3 -8e-3 9e-3 -6e-3 6e-3 -0.0264 0.0301-0.0549 0.066-1.9e-4 2.4e-4 -0.028-0.0246-0.0617-0.0553z" style="paint-order:stroke markers fill"/>
<path d="m399.96 104.89c-0.0845-0.0544-0.17399-0.10846-0.263-0.15884-0.0404-0.0228-0.041-0.0233-0.0398-0.0233 2e-3 -2e-5 0.0737 0.0286 0.1096 0.0439 0.0809 0.0347 0.17048 0.0778 0.24405 0.11748l6e-3 3e-3 -6e-3 8e-3c-3e-3 5e-3 -9e-3 0.0129-0.0131 0.0186l-7e-3 0.0104z" style="paint-order:stroke markers fill"/>
<path d="m400.14 104.43c-6e-3 -3e-3 -0.0293-0.0144-0.0509-0.0247-0.24207-0.11629-0.49224-0.20289-0.7523-0.2604-0.12259-0.0271-0.24271-0.0469-0.36979-0.0607-0.0221-2e-3 -0.046-5e-3 -0.0532-5e-3 -0.0166-1e-3 -0.0167-1e-3 0.0315-0.0165 0.19514-0.0619 0.38384-0.0956 0.58885-0.10534 0.0405-2e-3 0.15682-2e-3 0.19732 0 0.19905 9e-3 0.38434 0.0418 0.57311 0.10019l0.0228 7e-3 -0.0127 0.0154c-0.0795 0.0967-0.13293 0.20833-0.15713 0.32864-3e-3 0.0142-5e-3 0.0263-6e-3 0.0268-1.8e-4 5.3e-4 -6e-3 -2e-3 -0.012-5e-3z" style="paint-order:stroke markers fill"/>
<path d="m398.46 103.75c0.0292-0.0553 0.11748-0.19026 0.1703-0.26059 0.12403-0.16514 0.26876-0.31589 0.42475-0.44245 0.14372-0.1166 0.32122-0.22936 0.48327-0.30701 0.28722-0.13762 0.58092-0.21571 0.90621-0.24096 0.0636-5e-3 0.27874-5e-3 0.34057 4e-5 0.0851 7e-3 0.19895 0.0207 0.24659 0.0302l0.0157 3e-3 -0.0162 0.01c-0.12085 0.0728-0.24275 0.18333-0.3286 0.29795-0.11181 0.14929-0.18726 0.32409-0.21855 0.50636-0.0113 0.0655-0.0137 0.0952-0.0152 0.18686l-2e-3 0.0938-0.0515-0.0158c-0.10196-0.0313-0.24033-0.0638-0.3468-0.0813-0.24577-0.0405-0.50712-0.0471-0.75258-0.0188-0.27831 0.0321-0.55151 0.10734-0.80531 0.22184-0.0288 0.013-0.0529 0.0237-0.0534 0.0237-5.3e-4 0 5.3e-4 -3e-3 2e-3 -7e-3z" style="paint-order:stroke markers fill"/>
<path d="m398.19 103.04c0.0125-0.0929 0.0498-0.26609 0.0846-0.39287 0.26007-0.94833 0.9068-1.7529 1.7804-2.2149 0.44049-0.23296 0.90874-0.366 1.4317-0.40676 0.10432-8e-3 0.39822-7e-3 0.50643 2e-3 0.19431 0.0163 0.50995 0.0656 0.5056 0.079-7.9e-4 2e-3 -0.0254 0.02-0.055 0.0399-0.27583 0.18499-0.47939 0.46541-0.5719 0.78785-0.0193 0.0673-0.0343 0.13926-0.0446 0.21424-0.0106 0.0769-0.0106 0.27541-7e-5 0.3514 8e-3 0.0555 0.0232 0.13666 0.0333 0.17467 3e-3 0.0119 4e-3 0.0217 3e-3 0.0217-2e-3 0-0.0234-6e-3 -0.0482-0.0142-0.55822-0.17525-1.144-0.19241-1.709-0.0501-0.4774 0.12029-0.90968 0.3467-1.29 0.67563-0.0734 0.0635-0.22574 0.21508-0.28917 0.28777-0.10469 0.11996-0.20162 0.24891-0.28482 0.3789-0.0602 0.0941-0.055 0.0875-0.052 0.0655z" style="paint-order:stroke markers fill"/>
<path d="m385.66 114.34c0-8e-3 0.11229-0.23238 0.15505-0.31033 0.32108-0.58525 0.76371-1.0967 1.2949-1.4962 0.63366-0.47656 1.3677-0.78094 2.158-0.8949 0.23835-0.0344 0.33561-0.0405 0.64536-0.0408 0.29226-2.7e-4 0.34754 2e-3 0.55542 0.0263 0.32721 0.0378 0.66884 0.11574 0.97929 0.22344 0.12341 0.0428 0.29816 0.11072 0.29817 0.11587 0 2e-3 -0.0112 7e-3 -0.0249 0.0108-0.0137 4e-3 -0.0617 0.0219-0.1067 0.0396-0.48121 0.1899-0.87141 0.55323-1.0963 1.0208-0.10094 0.20986-0.16066 0.41608-0.19076 0.65879-0.0166 0.13397-0.0126 0.41769 7e-3 0.51607 3e-3 0.0159 2e-3 0.0155-0.0524-0.0189-0.49673-0.31294-1.0793-0.51997-1.6787-0.5966-0.23293-0.0298-0.57053-0.04-0.78929-0.0239-0.74706 0.055-1.4372 0.28996-2.0335 0.69214-0.12361 0.0834-0.12096 0.0817-0.12096 0.0777z" style="paint-order:stroke markers fill"/>
<path d="m389.73 115.25c-0.0138-0.0166-0.21304-0.16422-0.3019-0.22364-0.3512-0.23489-0.7272-0.41089-1.1334-0.53052-0.4168-0.12276-0.88463-0.18054-1.3106-0.16185-0.15654 7e-3 -0.31896 0.0214-0.43397 0.0389-0.0334 5e-3 -0.0618 8e-3 -0.063 7e-3 -3e-3 -3e-3 0.16349-0.0764 0.2582-0.11339 0.82412-0.32177 1.7531-0.33368 2.5828-0.0331 0.30165 0.10927 0.59603 0.26018 0.84504 0.43321l0.0544 0.0378-0.0433 0.0217c-0.10956 0.055-0.23028 0.15684-0.30552 0.25765-0.043 0.0577-0.0932 0.15096-0.11948 0.22221-0.0101 0.0272-0.019 0.0503-0.02 0.0513s-5e-3 -2e-3 -9e-3 -7e-3z" style="paint-order:stroke markers fill"/>
<path d="m388.03 116.3c-0.56558-0.50086-1.2525-0.9072-1.9703-1.1655-0.0514-0.0185-0.0955-0.0354-0.098-0.0376-0.0114-0.01 0.2908-0.0577 0.46969-0.0742 0.15404-0.0142 0.47723-0.0142 0.63099-1e-5 0.63656 0.0587 1.2148 0.25887 1.7381 0.60172 0.054 0.0354 0.0974 0.065 0.0964 0.066s-0.0375 0.0135-0.0813 0.0279c-0.23352 0.0768-0.42051 0.21778-0.556 0.41907-0.0441 0.0655-0.088 0.15003-0.1105 0.2129-8e-3 0.0212-0.0152 0.0384-0.0168 0.0382-2e-3 -2e-4 -0.0477-0.04-0.10237-0.0884z" style="paint-order:stroke markers fill"/>
<path d="m387.38 117.08c-0.38428-0.45212-0.75432-0.85531-1.1831-1.2891-0.10257-0.10375-0.18385-0.18864-0.18063-0.18864 3e-3 0 0.0437 0.0155 0.09 0.0344 0.36596 0.14946 0.70377 0.32841 1.0267 0.54386 0.23725 0.1583 0.4407 0.31748 0.68275 0.53416l0.0291 0.0261-0.0321 0.0162c-0.0897 0.0452-0.20085 0.13813-0.26505 0.2215-0.0448 0.0581-0.0528 0.0705-0.083 0.1279l-0.0238 0.0453z" style="paint-order:stroke markers fill"/>
<path d="m386.9 117.6c-0.20577-0.28908-0.39807-0.57556-0.58523-0.87186-0.11305-0.17898-0.25146-0.40584-0.24906-0.40824 1e-3 -1e-3 0.13179 0.13423 0.22436 0.23289 0.23444 0.24989 0.47063 0.51366 0.68578 0.76586 0.15883 0.18616 0.19932 0.23528 0.19587 0.23759-2e-3 1e-3 -0.0187 0.0109-0.0375 0.0215-0.0449 0.0253-0.0905 0.0598-0.12783 0.0968-0.0167 0.0165-0.0307 0.03-0.0312 0.03-5.3e-4 0-0.0343-0.047-0.0753-0.10451z" style="paint-order:stroke markers fill"/>
<path d="m385.74 118.39c-0.0629-0.12019-0.14518-0.30719-0.20412-0.46371-0.17657-0.46887-0.27509-0.9532-0.29728-1.4614-3e-3 -0.0659-5e-3 -0.25442-3e-3 -0.26957l2e-3 -0.0122 0.0357 0.0949c0.0959 0.2553 0.19257 0.48333 0.31443 0.74189 0.0316 0.0671 0.14574 0.29474 0.18264 0.36433 0.12915 0.24357 0.26885 0.48282 0.41117 0.70416 0.016 0.0249 0.0286 0.0461 0.0281 0.047-5.3e-4 1e-3 -3e-3 2e-3 -5e-3 2e-3 -7e-3 0-0.0549 0.0126-0.0837 0.022-0.10009 0.0326-0.19177 0.084-0.27014 0.15148-0.0295 0.0254-0.0699 0.067-0.0973 0.1001-7.9e-4 1e-3 -7e-3 -8e-3 -0.0131-0.0207z" style="paint-order:stroke markers fill"/>
<path d="m384.64 119.02c-0.10522-0.27451-0.18071-0.58222-0.2164-0.88209-0.0303-0.25447-0.0329-0.53473-7e-3 -0.7922 0.0422-0.42682 0.1583-0.84247 0.34382-1.2313 0.014-0.0294 0.0269-0.0556 0.0286-0.0582 2e-3 -3e-3 3e-3 0.0561 3e-3 0.20901 0 0.21796 1e-3 0.26026 0.0133 0.41252 0.0516 0.65838 0.22685 1.2919 0.52225 1.8878 0.0249 0.0502 0.0375 0.0787 0.0352 0.0793-2e-3 5.3e-4 -0.0192 3e-3 -0.0383 6e-3 -0.11048 0.0151-0.22737 0.0552-0.32785 0.11238-0.0723 0.0412-0.13162 0.0869-0.19608 0.15108-0.0517 0.0515-0.0837 0.0895-0.11567 0.13722-0.0102 0.0153-0.0193 0.0278-0.0203 0.0279-8e-4 5e-5 -0.0119-0.0265-0.0244-0.0591z" style="paint-order:stroke markers fill"/>
<path d="m383.74 119.77c-0.11419-0.29235-0.19331-0.61683-0.22725-0.932-0.0165-0.15278-0.019-0.20589-0.019-0.39274 5e-5 -0.18643 3e-3 -0.24139 0.0189-0.39274 0.0586-0.54566 0.24273-1.0758 0.53751-1.5475 0.0474-0.0758 0.12817-0.19391 0.13082-0.19126 1e-3 1e-3 -0.0106 0.0386-0.0258 0.0837-0.0972 0.28933-0.16318 0.59744-0.19417 0.90672-0.0145 0.14486-0.0167 0.19969-0.0167 0.40928 0 0.21597 2e-3 0.25902 0.0188 0.42581 0.0459 0.45243 0.16967 0.90151 0.36486 1.3234l0.0146 0.0315-0.027 3e-3c-0.0148 2e-3 -0.0514 9e-3 -0.0813 0.0168-0.17654 0.0454-0.32912 0.1446-0.44182 0.2871-0.0137 0.0173-0.0254 0.032-0.026 0.0327-5.3e-4 7.9e-4 -0.0126-0.0279-0.0265-0.0636z" style="paint-order:stroke markers fill"/>
<path d="m378.29 120.57c2e-3 -0.0113 7e-3 -0.0558 9e-3 -0.099 0.0211-0.32758 0.0962-0.74745 0.19788-1.107 0.50646-1.7908 1.8628-3.2248 3.622-3.8295 0.67235-0.23109 1.3849-0.33586 2.0793-0.3057 0.12044 5e-3 0.2209 0.0115 0.22324 0.014 2e-3 2e-3 -5e-3 0.0106-0.0162 0.018-0.1412 0.0936-0.36182 0.26876-0.50916 0.40435-0.88448 0.81395-1.3795 1.9814-1.3488 3.1811 0.01 0.37232 0.0641 0.73659 0.15958 1.0641 3e-3 9e-3 -0.0342-9e-3 -0.10588-0.052-0.41003-0.2464-0.84981-0.39675-1.342-0.45876-0.13813-0.0174-0.49311-0.0245-0.63666-0.0126-0.90976 0.0748-1.7042 0.47611-2.3013 1.1624-0.0292 0.0336-0.035 0.0374-0.0315 0.0206z" style="paint-order:stroke markers fill"/>
<path d="m381.71 121.1c-0.4474-0.37306-1.0052-0.60491-1.585-0.65884-0.38822-0.0361-0.77263 5e-3 -1.151 0.12416-0.0248 8e-3 -0.0458 0.0135-0.0467 0.0126-4e-3 -4e-3 0.13992-0.1226 0.22347-0.18384 0.39554-0.28992 0.85771-0.47515 1.3422-0.5379 0.13614-0.0176 0.21179-0.0222 0.36794-0.0225 0.22421-2.7e-4 0.38642 0.0159 0.59944 0.06 0.37549 0.0777 0.74703 0.23828 1.064 0.45972l0.0656 0.0458-0.0408 9e-3c-0.0588 0.0127-0.11256 0.0289-0.16686 0.0503-0.28836 0.11376-0.51785 0.355-0.61366 0.64508-6e-3 0.0188-0.0117 0.0341-0.0124 0.0341-5.3e-4 0-0.0214-0.0169-0.0462-0.0376z" style="paint-order:stroke markers fill"/>
<path d="m381.38 121.64c-0.0323-0.0341-0.10754-0.10532-0.15733-0.1489-0.30348-0.2656-0.65982-0.46361-1.0464-0.58146-0.0145-4e-3 -0.0255-8e-3 -0.0245-8e-3 1e-3 -4e-5 0.0188 2e-3 0.0395 5e-3 0.38732 0.0533 0.74894 0.19499 1.0717 0.4199 0.0842 0.0587 0.19706 0.14979 0.25915 0.20925l0.01 9e-3 -0.0224 0.0149c-0.0313 0.0208-0.0576 0.0423-0.0876 0.0718l-0.0258 0.0253z" style="paint-order:stroke markers fill"/>
<path d="m380.44 122.06c-0.12874-0.12924-0.26406-0.24419-0.4129-0.35075-0.0355-0.0254-0.12451-0.0848-0.16224-0.10826-0.18637-0.11584-0.37472-0.20865-0.57627-0.28398-0.059-0.022-0.11153-0.0399-0.18816-0.0639l-0.0175-5e-3 9e-3 -1e-3c0.0805-9e-3 0.17164-0.0136 0.28044-0.0126 0.0811 7.9e-4 0.11535 2e-3 0.17851 8e-3 0.44496 0.0382 0.87203 0.20111 1.2292 0.46887 0.0296 0.0222 0.0847 0.0657 0.0861 0.068 5.3e-4 8e-4 -2e-3 2e-3 -5e-3 3e-3 -0.011 3e-3 -0.0466 0.0177-0.0675 0.0275-0.0821 0.0382-0.15294 0.088-0.21783 0.153-0.0371 0.0372-0.0685 0.0752-0.095 0.1152-5e-3 7e-3 -9e-3 0.0128-9e-3 0.0128-5.3e-4 0-0.0144-0.0135-0.0308-0.0301z" style="paint-order:stroke markers fill"/>
<path d="m379.88 122.51c-0.10805-0.13671-0.22479-0.26789-0.35705-0.40122-0.13331-0.13438-0.26293-0.25182-0.40028-0.36267-9e-3 -8e-3 -0.0166-0.014-0.0159-0.0143 8e-4 -2.3e-4 0.015 5e-3 0.0319 0.0111 0.0908 0.0343 0.16722 0.0675 0.25423 0.11063 0.25663 0.12713 0.49053 0.29265 0.69646 0.49284l0.027 0.0263-9e-3 5e-3c-0.0658 0.0331-0.13645 0.088-0.18534 0.14399-8e-3 0.01-0.0157 0.018-0.0162 0.0185-5.3e-4 5.3e-4 -0.0119-0.013-0.0253-0.03z" style="paint-order:stroke markers fill"/>
<path d="m378.72 123.11c-0.0973-0.23358-0.17485-0.45828-0.23931-0.6936-0.0252-0.0919-0.0645-0.25071-0.0626-0.25264 2e-3 -2e-3 0.15326 0.20872 0.23661 0.32768 0.11475 0.16377 0.26685 0.38986 0.3552 0.52796l7e-3 0.0114-9e-3 2e-3c-0.0924 0.0235-0.18224 0.067-0.25001 0.12123-8e-3 6e-3 -0.0142 0.0111-0.0146 0.0111-5.3e-4 0-0.0111-0.0249-0.0238-0.0553z" style="paint-order:stroke markers fill"/>
<path d="m378.09 123.55c-0.0683-0.23563-0.10555-0.46494-0.11504-0.70852-2e-3 -0.0489-2e-3 -0.16598 0-0.21486 2e-3 -0.0641 7e-3 -0.12608 0.0132-0.18855 3e-3 -0.0301 0.0106-0.0929 0.011-0.0924 1.5e-4 1.8e-4 6e-3 0.0243 0.0135 0.0537 0.083 0.3342 0.20105 0.67951 0.33812 0.98934 5e-3 0.0107 8e-3 0.0197 8e-3 0.0199-2.3e-4 2e-4 -0.0106 4e-3 -0.0231 7e-3 -0.0403 0.0122-0.0978 0.0368-0.13193 0.0565-0.0314 0.0181-0.0618 0.0388-0.0885 0.0604-0.0275 0.0222-0.0246 0.0203-0.0255 0.0173z" style="paint-order:stroke markers fill"/>
<path d="m377.49 123.94c-7e-3 -0.0261-0.0197-0.0811-0.0278-0.12069-0.0275-0.13468-0.0427-0.25989-0.0485-0.39975-2e-3 -0.0468-1e-3 -0.18046 2e-3 -0.22217 0.0124-0.2051 0.0435-0.3826 0.10088-0.57588 5.3e-4 -2e-3 7.9e-4 0.0325 2.6e-4 0.0767-3e-3 0.35559 0.0467 0.69558 0.15117 1.0319 0.0103 0.033 0.0312 0.0963 0.0393 0.11847l5e-3 0.0137-8e-3 2e-3c-0.0684 0.0138-0.14167 0.0434-0.20075 0.0812l-0.01 6e-3z" style="paint-order:stroke markers fill"/>
<path d="m377.05 124.27c-1e-3 -4e-3 -0.0141-0.0528-0.0197-0.0757-0.0576-0.23606-0.0787-0.47597-0.0633-0.72036 2e-3 -0.0251 2e-3 -0.0228 4e-3 0.0222 0.0128 0.23797 0.059 0.48479 0.13533 0.72243 4e-3 0.0134 8e-3 0.0248 8e-3 0.0253-1e-5 5.3e-4 -5e-3 3e-3 -0.0111 5e-3 -0.0102 4e-3 -0.0322 0.0129-0.047 0.0196-4e-3 2e-3 -6e-3 2e-3 -6e-3 1e-3z" style="paint-order:stroke markers fill"/>
<path d="m375.43 124.29c2e-3 -0.16534 7e-3 -0.23306 0.0261-0.36691 0.0963-0.6756 0.44792-1.2987 0.97816-1.7332 0.15226-0.12479 0.31078-0.22843 0.48915-0.31982 0.10902-0.0559 0.28845-0.13416 0.29422-0.1284 7.9e-4 8e-4 -0.0134 0.019-0.0318 0.0404-0.31607 0.3679-0.54252 0.84696-0.63004 1.3328-0.0509 0.28275-0.0589 0.58566-0.0228 0.8661 8e-3 0.0603 0.0269 0.17988 0.0312 0.19495 2e-3 6e-3 -3e-3 6e-3 -0.0364-3e-3 -0.0211-6e-3 -0.065-0.0147-0.0975-0.0203-0.34089-0.0584-0.68895 0.0368-0.95628 0.26162-0.0223 0.0188-0.0418 0.0341-0.0433 0.0341-2e-3 0-2e-3 -0.0712-5.3e-4 -0.15813z" style="paint-order:stroke markers fill"/>
<path d="m371.55 125.31c0.0873-1.4017 0.8282-2.6857 1.995-3.4574 0.59996-0.39678 1.2752-0.64245 1.9777-0.71951 0.16972-0.0186 0.21701-0.0214 0.41802-0.0249 0.41435-7e-3 0.7444 0.0295 1.1518 0.12759 0.0547 0.0132 0.10145 0.0258 0.10397 0.0281 3e-3 2e-3 -7e-3 7e-3 -0.0205 0.0116-0.0138 4e-3 -0.0632 0.0213-0.10981 0.0383-0.62378 0.22717-1.1708 0.65426-1.5428 1.2045-0.25008 0.36994-0.41188 0.75922-0.49696 1.1956-0.0415 0.21294-0.0559 0.37485-0.0557 0.62607l2e-4 0.20219-0.0588-0.035c-0.28081-0.16726-0.60783-0.27757-0.9592-0.32355-0.118-0.0155-0.46174-0.0155-0.57588-5e-5 -0.31118 0.0421-0.56259 0.11829-0.82143 0.24907-0.39176 0.19793-0.71048 0.48387-0.95631 0.85794l-0.0531 0.0809z" style="paint-order:stroke markers fill"/>
<path d="m362.48 127.6c-2e-3 -0.0471 0.0569-0.58415 0.0834-0.76605 0.40103-2.7521 2.0796-5.2164 4.4948-6.5988 1.1585-0.66308 2.3915-1.0524 3.7559-1.186 0.29641-0.029 1.342-0.0293 1.6206-2.7e-4 1.414 0.14658 2.6334 0.5379 3.8116 1.2232 0.20872 0.12139 0.68908 0.4365 0.67971 0.44587-3e-3 4e-3 -0.0908-6e-3 -0.19416-0.02-1.2085-0.16902-2.4235 0.10096-3.4208 0.76007-0.29436 0.19455-0.52055 0.37939-0.77879 0.63641-0.39114 0.3893-0.69069 0.80629-0.93287 1.2986-0.34118 0.6936-0.50366 1.3686-0.50987 2.1182l-3e-3 0.31577-0.14056-0.13179c-0.83164-0.77976-1.7702-1.2346-2.8985-1.4045-0.19456-0.0293-0.31374-0.0356-0.68994-0.0366-0.44898-1e-3 -0.57771 8e-3 -0.90951 0.0673-0.98286 0.17471-1.8797 0.61811-2.6293 1.2999-0.51869 0.4718-0.99866 1.1582-1.2657 1.81-0.0402 0.0981-0.0732 0.17401-0.0734 0.16865z" style="paint-order:stroke markers fill"/>
<path d="m356 129.53c0.0372-0.76145 0.0933-1.2688 0.20855-1.8852 0.54327-2.9056 2.1029-5.5365 4.3991-7.4205 1.0895-0.89396 2.3559-1.6114 3.7095-2.1015 0.94157-0.34092 1.9714-0.57538 2.9848-0.6796 0.8678-0.0892 1.9478-0.0767 2.8277 0.0327 1.6262 0.20224 3.2111 0.72901 4.6603 1.5488 0.11204 0.0634 0.20065 0.11832 0.19689 0.12207-4e-3 4e-3 -0.1624-0.0446-0.35254-0.1075-0.65938-0.21806-1.3106-0.35759-2.0572-0.44082-0.32734-0.0365-1.2541-0.0509-1.607-0.025-1.04 0.0764-1.9683 0.28589-2.8992 0.65429-0.97237 0.38482-1.8286 0.89598-2.6624 1.5894-0.26157 0.21754-0.86769 0.81816-1.0993 1.0893-0.51271 0.60023-0.94427 1.254-1.3045 1.9761-0.57926 1.1612-0.90744 2.3813-0.99411 3.6959-0.0287 0.43589-0.0155 1.2126 0.0258 1.513l0.0102 0.0743-0.15457-0.14947c-0.69436-0.67138-1.6488-1.0515-2.6433-1.0528-0.62376-8e-4 -1.1616 0.12217-1.7115 0.39124-0.61733 0.30204-1.1002 0.72077-1.5172 1.3158-0.028 0.04-0.0286 0.0359-0.02-0.14069z" style="paint-order:stroke markers fill"/>
<path d="m355.33 129.77c-0.65583-0.63794-1.4255-1.0624-2.3151-1.2766-0.61242-0.14751-1.3303-0.17124-1.9596-0.0648-0.8371 0.14165-1.6389 0.50037-2.2826 1.0212-0.0578 0.0468-0.10673 0.0835-0.10865 0.0815-2e-3 -2e-3 0.0215-0.14874 0.0519-0.32609 0.49203-2.8633 1.738-5.5654 3.5953-7.7969 0.61451-0.73832 1.3594-1.486 2.0983-2.1062 2.0001-1.6788 4.3955-2.8699 6.9526-3.4572 0.78717-0.18077 1.5567-0.29816 2.451-0.37387 0.42589-0.0361 1.6142-0.0508 2.0763-0.0258 2.2892 0.12403 4.4373 0.67932 6.4772 1.6744l0.30179 0.14722v0.29229l-0.26872-0.0815c-2.2821-0.69232-4.6626-0.75558-6.966-0.18512-2.7635 0.68443-5.2401 2.2683-7.0304 4.4962-1.3052 1.6241-2.2101 3.5699-2.6188 5.6307-0.14871 0.74986-0.23178 1.537-0.25244 2.3922l-4e-3 0.15154z" style="paint-order:stroke markers fill"/>
<path d="m349.62 124.74c0-0.062 0.29426-0.87278 0.51756-1.426 1.3342-3.3053 3.4915-6.2663 6.2361-8.5593 1.9567-1.6348 4.198-2.9206 6.5998-3.7864 2.3813-0.85842 4.8719-1.2938 7.4017-1.2938 4.9882 0 9.8174 1.7078 13.716 4.8506l0.29233 0.23565-0.54957 0.0153c-0.39315 0.011-0.63232 0.0295-0.84029 0.065-1.3277 0.22681-2.4282 0.79231-3.3703 1.7319-0.86547 0.86315-1.4402 1.9316-1.6814 3.1255-0.0491 0.24339-0.11822 0.77815-0.11822 0.91537v0.077l-0.14558-0.15871c-1.7934-1.9552-3.9322-3.4246-6.3953-4.3939-2.1582-0.84926-4.5793-1.2589-6.8516-1.1594-1.5059 0.066-2.6956 0.25558-4.0716 0.64886-2.3609 0.67477-4.4898 1.8217-6.4131 3.4549-0.47053 0.39959-1.4244 1.3536-1.8249 1.8253-0.92328 1.0872-1.6301 2.1454-2.2713 3.4005-0.1266 0.24779-0.23017 0.44199-0.23017 0.43155z" style="paint-order:stroke markers fill"/>
<path d="m352.77 131.82c-0.20661-0.39468-0.46131-0.72973-0.78217-1.0289-0.42432-0.39564-0.95205-0.69394-1.5143-0.85595-0.27838-0.0802-0.56312-0.12723-0.86403-0.14266-0.11375-6e-3 -0.3566-2e-3 -0.46068 6e-3 -0.0408 3e-3 -0.0746 6e-3 -0.0751 5e-3 -5.3e-4 -5.3e-4 0.0245-0.0207 0.0555-0.0447 0.39556-0.30671 0.85028-0.54911 1.3298-0.70885 0.30287-0.1009 0.6158-0.1688 0.94052-0.20407 0.1663-0.0181 0.26214-0.0227 0.46922-0.0229 0.19393-1.1e-4 0.26124 3e-3 0.41341 0.0166 0.98469 0.0905 1.9085 0.50233 2.6376 1.1758 0.0689 0.0636 0.21755 0.21334 0.27031 0.2722l0.0305 0.0341-0.0801-3e-3c-0.0441-1e-3 -0.0824-3e-3 -0.0851-4e-3 -0.0122-4e-3 -0.22165 7e-3 -0.29066 0.0147-0.87796 0.0994-1.6208 0.67008-1.9389 1.4896l-0.0238 0.0613z" style="paint-order:stroke markers fill"/>
<path d="m351.61 132.38c-0.0787-0.21244-0.18608-0.43577-0.30254-0.62923-0.10624-0.17649-0.24459-0.36657-0.37874-0.52034-0.12478-0.14304-0.27994-0.29503-0.42238-0.41375-0.2756-0.22971-0.57826-0.41602-0.90768-0.55873-0.0366-0.0159-0.0384-0.017-0.0248-0.0157 8e-3 8e-4 0.0311 2e-3 0.0512 3e-3 0.13408 6e-3 0.34228 0.034 0.49125 0.0659 0.62895 0.13457 1.198 0.44354 1.65 0.89592 0.25376 0.25394 0.45768 0.53669 0.61739 0.85604 0.0307 0.0613 0.071 0.14665 0.071 0.15014 0 7.9e-4 -2e-3 7.9e-4 -4e-3 -2.6e-4 -0.01-4e-3 -0.0651-0.0137-0.0989-0.018-0.25168-0.0314-0.51462 0.047-0.70401 0.20977-0.0108 9e-3 -0.0201 0.0168-0.0207 0.0168-5.3e-4 0-8e-3 -0.0187-0.0166-0.0417z" style="paint-order:stroke markers fill"/>
<path d="m351.08 132.67c-0.12507-0.4435-0.34373-0.88866-0.61871-1.2596-0.0433-0.0584-0.04-0.0565 0.0277 0.0153 0.32348 0.34341 0.5624 0.73754 0.71585 1.1809 0.0142 0.0411 0.0191 0.0588 0.0168 0.0603-2e-3 1e-3 -0.0115 3e-3 -0.0213 4e-3 -0.0234 3e-3 -0.0629 0.0114-0.0904 0.0201l-0.0219 7e-3z" style="paint-order:stroke markers fill"/>
<path d="m350.03 132.67c-5.3e-4 -1e-3 -7e-3 -0.0245-0.0135-0.0512-0.13056-0.50283-0.33837-0.9965-0.60796-1.4442-0.0622-0.10323-0.14439-0.23012-0.20402-0.31482-0.0124-0.0176-0.0223-0.0324-0.0219-0.0328 1e-3 -1e-3 0.0871 0.0566 0.13592 0.0916 0.5471 0.39174 0.96631 0.92722 1.2139 1.5505 0.0184 0.0463 0.0403 0.10483 0.0395 0.1056-2.4e-4 2.3e-4 -0.0124-1e-3 -0.0269-3e-3 -0.13992-0.0204-0.28477-2e-3 -0.41773 0.0541-0.0275 0.0115-0.0593 0.0271-0.0801 0.0392-0.0153 9e-3 -0.0159 9e-3 -0.0172 5e-3z" style="paint-order:stroke markers fill"/>
<path d="m349.2 132.82c-5.3e-4 -1e-3 -2e-3 -0.0105-3e-3 -0.0202-1e-3 -0.01-9e-3 -0.0599-0.0168-0.11162-0.0746-0.48357-0.17497-0.97545-0.29727-1.4562-0.0113-0.0443-0.0202-0.0808-0.0199-0.0812 8e-4 -8e-4 0.0612 0.0899 0.0874 0.13075 0.26432 0.41319 0.46513 0.85719 0.60112 1.3291 0.01 0.033 0.0216 0.0766 0.0269 0.097 5e-3 0.0204 0.01 0.0381 0.0105 0.0393 5.3e-4 2e-3 -5e-3 2e-3 -0.0193 5.3e-4 -0.0273-2e-3 -0.10111-2.7e-4 -0.13268 4e-3 -0.0751 0.01-0.15656 0.0331-0.21589 0.0623-0.0207 0.0102-0.0198 0.01-0.0209 6e-3z" style="paint-order:stroke markers fill"/>
<path d="m348.71 133.03c-5.3e-4 -3e-3 -1e-3 -0.0133-2e-3 -0.0238-7.9e-4 -0.0104-4e-3 -0.0512-7e-3 -0.0906-0.0179-0.22023-0.0462-0.60844-0.045-0.61671 1e-3 -8e-3 0.0489 0.26626 0.0741 0.42596 0.0148 0.094 0.044 0.29308 0.044 0.30012 0 1e-3 -5e-3 2e-3 -0.0186 4e-3 -0.0102 1e-3 -0.0239 3e-3 -0.0303 4e-3 -6e-3 1e-3 -0.0121 2e-3 -0.0127 2e-3 -5.3e-4 0-1e-3 -2e-3 -2e-3 -5e-3z" style="paint-order:stroke markers fill"/>
<path d="m346.19 132.89c0-6e-3 0.0207-0.097 0.0337-0.14897 0.0816-0.32565 0.21748-0.6462 0.39661-0.93544 0.23104-0.37306 0.54375-0.70431 0.9056-0.95932 0.0491-0.0346 0.0927-0.0638 0.0952-0.0638 1e-3 0-2e-5 3e-3 -2e-3 7e-3 -0.0116 0.0178-0.0786 0.137-0.11054 0.19659-0.29444 0.55003-0.48834 1.1817-0.55229 1.7993-0.01 0.0957-9e-3 0.0884-0.0142 0.0862-0.0723-0.0295-0.15535-0.0513-0.2402-0.0633-0.0183-3e-3 -0.0571-4e-3 -0.114-4e-3 -0.0795 1.4e-4 -0.09 7.9e-4 -0.13448 8e-3 -0.0826 0.0136-0.17202 0.0399-0.23622 0.0695-0.0278 0.0128-0.0269 0.0125-0.0269 8e-3z" style="paint-order:stroke markers fill"/>
<path d="m345.7 133.03c-0.0224-0.0136-0.0843-0.0435-0.11575-0.0558-0.10293-0.0404-0.19767-0.0597-0.3054-0.062-0.11127-2e-3 -0.20488 0.0119-0.30839 0.0471-0.0164 6e-3 -0.0303 0.01-0.0308 9e-3 -1e-3 -1e-3 9e-3 -0.0464 0.0238-0.10432 0.1754-0.68858 0.56773-1.2977 1.1222-1.7423 0.30083-0.24122 0.63808-0.42504 1.0063-0.54845 0.0339-0.0113 0.0621-0.0202 0.0626-0.0197 5.3e-4 5.3e-4 -0.0132 0.012-0.0306 0.0255-0.1927 0.1497-0.38184 0.33021-0.54225 0.51754-0.28868 0.33712-0.5148 0.72123-0.66925 1.1369-0.0904 0.24331-0.15688 0.50274-0.19437 0.75874l-7e-3 0.0446z" style="paint-order:stroke markers fill"/>
<path d="m344.42 133.09c-0.0554-0.0246-0.12664-0.0443-0.2012-0.0557-0.0353-5e-3 -0.0546-6e-3 -0.11546-6e-3 -0.0785 0-0.11732 4e-3 -0.18688 0.02-0.0176 4e-3 -0.0326 7e-3 -0.0333 6e-3 -8e-4 -7.9e-4 6e-3 -0.0344 0.0153-0.0747 0.16882-0.74316 0.58188-1.4159 1.169-1.904 0.33053-0.27476 0.7038-0.48371 1.1128-0.62291 0.0637-0.0217 0.19565-0.0612 0.19765-0.0592 7.9e-4 7.9e-4 -8e-3 6e-3 -0.02 0.0124-0.0802 0.042-0.19485 0.1114-0.29898 0.18107-0.15609 0.10443-0.28634 0.20604-0.43264 0.33751-0.0635 0.0571-0.20537 0.19988-0.26589 0.26768-0.4364 0.48894-0.73081 1.067-0.86798 1.7043-0.0131 0.0611-0.0369 0.19026-0.0369 0.20065 0 8e-3 -6e-3 7e-3 -0.0356-6e-3z" style="paint-order:stroke markers fill"/>
<path d="m347.99 132.84c-0.0444-0.0177-0.13246-0.0397-0.18821-0.047-0.11767-0.0154-0.27288-2e-3 -0.36938 0.0327-0.0237 8e-3 -0.0241 8e-3 -0.0226-5e-3 0.0754-0.64788 0.26916-1.232 0.59161-1.7838 0.0196-0.0335 0.0362-0.0602 0.037-0.0595 7.9e-4 7.9e-4 -1e-3 0.0524-5e-3 0.11463-0.031 0.56195-0.0337 1.1347-8e-3 1.6997 2e-3 0.035 1e-3 0.0609-8e-4 0.0607-2e-3 -1.3e-4 -0.0176-6e-3 -0.0347-0.0126z" style="paint-order:stroke markers fill"/>
<path d="m343.5 132.64c-8e-3 -0.0256-0.12266-0.19436-0.19675-0.28989-0.0876-0.1129-0.30776-0.33324-0.42003-0.4203-0.3841-0.29784-0.80737-0.47293-1.2897-0.53348-0.11232-0.0141-0.46419-0.0141-0.57878-2e-5 -0.21005 0.0259-0.44489 0.0844-0.6323 0.15757-0.0588 0.023-0.10801 0.0407-0.10933 0.0394-5e-3 -5e-3 0.13506-0.23803 0.22429-0.37331 0.65503-0.9931 1.6558-1.729 2.7994-2.0585 1.0759-0.30998 2.1945-0.2593 3.2411 0.14685 0.28594 0.11095 0.60022 0.27057 0.87023 0.44197 0.0534 0.0339 0.0972 0.0622 0.0972 0.0629 1e-5 7.9e-4 -0.0698-3e-5 -0.15503-2e-3 -0.85088-0.0156-1.7103 0.26104-2.4013 0.77298-0.21155 0.15672-0.47055 0.39744-0.63802 0.59297-0.34677 0.40486-0.59896 0.8528-0.76176 1.353-0.0215 0.0659-0.0402 0.1211-0.0416 0.12258-1e-3 2e-3 -5e-3 -4e-3 -8e-3 -0.0131z" style="paint-order:stroke markers fill"/>
<path d="m331.5 131.04c-4e-3 -0.0209-0.0236-0.13097-0.0428-0.24466-0.36159-2.1327-1.6251-4.0675-3.4396-5.2668-1.2228-0.80818-2.5863-1.2526-4.0644-1.3248l-0.23618-0.0115 0.12042-0.0669c0.0662-0.0368 0.2581-0.1314 0.42635-0.21017 3.4351-1.6081 7.4114-1.3072 10.566 0.79965 1.9077 1.2739 3.3898 3.182 4.1514 5.3446 0.0879 0.24962 0.23404 0.72197 0.22587 0.73013-3e-3 3e-3 -0.0664-0.0633-0.14-0.14825-0.77814-0.89753-1.8728-1.4676-3.09-1.6091-0.28723-0.0334-0.93042-0.0236-1.1965 0.0182-1.3075 0.20542-2.408 0.86304-3.1774 1.8986-0.0834 0.11229-0.0968 0.12402-0.10356 0.0909z" style="paint-order:stroke markers fill"/>
<path d="m327.57 131.12c-1e-4 -0.31966-0.0337-0.73516-0.0876-1.0822-0.23369-1.5058-0.92775-2.9108-1.9789-4.006-0.42036-0.43793-0.89276-0.82488-1.3896-1.1382-0.11821-0.0746-0.17865-0.11082-0.3514-0.21087l-0.0331-0.0192 0.062-7e-5c0.0901-1.1e-4 0.34676 0.0149 0.50436 0.0295 0.38351 0.0355 0.73191 0.094 1.1038 0.18536 1.1939 0.29322 2.2799 0.86378 3.2081 1.6855 0.14379 0.12729 0.48929 0.47337 0.61713 0.61814 0.34993 0.3963 0.65005 0.81419 0.90903 1.2658 0.1005 0.17523 0.30303 0.58282 0.38292 0.7706 0.23513 0.55272 0.40181 1.1218 0.50151 1.7122 0.0336 0.19921 0.0347 0.19259-0.0232 0.14098-0.17571-0.15671-0.45804-0.32483-0.71314-0.42465-0.43098-0.16865-0.93135-0.21085-1.3926-0.11746-0.46398 0.094-0.88529 0.31597-1.2303 0.64835l-0.0891 0.0858-4e-5 -0.14371z" style="paint-order:stroke markers fill"/>
<path d="m327.03 131.44c-0.18169-0.12568-0.37712-0.19003-0.60434-0.19895-0.20584-8e-3 -0.34704 0.0212-0.56992 0.11805-6e-3 2e-3 -5e-3 -0.0329 2e-3 -0.10604 0.0422-0.46191 0.0415-0.99423-2e-3 -1.4657-0.0908-0.98722-0.36793-1.9608-0.81083-2.8484-0.25264-0.50633-0.57565-1.0138-0.90958-1.4288-0.0383-0.0476-0.0678-0.0883-0.0656-0.0906 5e-3 -5e-3 0.19801 0.13268 0.35305 0.25338 0.82985 0.646 1.5216 1.4999 1.98 2.4442 0.3841 0.79126 0.61043 1.6192 0.68597 2.5094 0.0148 0.17393 0.0258 0.79217 0.0149 0.83267l-7e-3 0.0265z" style="paint-order:stroke markers fill"/>
<path d="m324.8 130.77c-0.33052-0.41887-0.86458-0.65202-1.3813-0.60304-0.16835 0.016-0.35887 0.0625-0.48989 0.11958-0.0175 8e-3 -0.031 0.01-0.031 5e-3s0.0148-0.0911 0.0329-0.19235c0.27276-1.5238 0.34181-3.1681 0.19794-4.7138-9e-3 -0.0994-0.0154-0.18218-0.0137-0.18393 8e-3 -8e-3 0.28083 0.36932 0.40522 0.55985 0.68663 1.0517 1.1177 2.2297 1.2703 3.4718 0.0465 0.37842 0.0625 0.70569 0.0547 1.1204-3e-3 0.17735-8e-3 0.35172-0.0114 0.38748l-5e-3 0.065z" style="paint-order:stroke markers fill"/>
<path d="m322.39 130.23c-0.0924-0.0824-0.2732-0.18299-0.41143-0.22899-0.12346-0.0411-0.22563-0.0593-0.36286-0.0646-0.18508-7e-3 -0.35457 0.0191-0.51025 0.0791-0.0367 0.0142-0.0632 0.0207-0.0611 0.0151 2e-3 -5e-3 0.0213-0.0676 0.0429-0.13804 0.36917-1.2095 0.91612-2.7889 1.4059-4.0597 0.0622-0.16144 0.12446-0.32329 0.1383-0.35967 0.0138-0.0364 0.0278-0.0691 0.0309-0.0726 0.011-0.0124 0.0515 0.57114 0.067 0.9656 0.0113 0.28815 6e-3 1.2432-8e-3 1.4883-0.0394 0.67634-0.0952 1.2215-0.18335 1.7901-0.0314 0.20256-0.0967 0.57708-0.10469 0.60071-6e-3 0.0171-8e-3 0.0165-0.0431-0.0152z" style="paint-order:stroke markers fill"/>
<path d="m320.5 130.06c-0.0916-0.0883-0.21996-0.16497-0.34714-0.20749-0.10826-0.0362-0.19978-0.0484-0.33292-0.0445-0.0648 2e-3 -0.11783 3e-3 -0.11783 2e-3 0-7.9e-4 0.0311-0.0809 0.0691-0.17826 0.5502-1.4084 1.2545-2.6524 2.1658-3.8255 0.12222-0.15734 0.14705-0.18575 0.13473-0.15412-0.47059 1.2082-1.0063 2.7594-1.456 4.216-0.0393 0.12729-0.0721 0.23147-0.0729 0.23151s-0.0201-0.0179-0.0428-0.0397z" style="paint-order:stroke markers fill"/>
<path d="m319.19 129.81c-0.0596-0.0389-0.16102-0.082-0.22731-0.0966-0.0385-8e-3 -0.0909-0.0162-0.11034-0.0163l-0.0194-7e-5 0.0324-0.0796c0.4694-1.1538 1.1131-2.1909 1.9328-3.114 0.12628-0.14222 0.29511-0.32237 0.29872-0.31876 1e-3 1e-3 -0.0203 0.0342-0.0475 0.0735-0.51253 0.74238-0.97333 1.5575-1.3539 2.395-0.15898 0.34986-0.33787 0.78992-0.46669 1.148l-0.01 0.0276z" style="paint-order:stroke markers fill"/>
<path d="m318.46 129.15c-0.10416-0.16091-0.28455-0.33434-0.45244-0.43498-0.12303-0.0738-0.29081-0.13896-0.44163-0.17162-0.0942-0.0204-0.35819-0.0301-0.45338-0.0167-0.034 5e-3 -0.0629 8e-3 -0.0643 6e-3 -4e-3 -4e-3 0.11197-0.20381 0.18647-0.32319 0.57537-0.92199 1.3184-1.6892 2.2134-2.2854 0.69322-0.46181 1.3993-0.78256 2.2127-1.0052 0.0926-0.0254 0.17271-0.045 0.17808-0.0438 5e-3 1e-3 -0.0423 0.0447-0.10598 0.0966-0.877 0.71443-1.6937 1.629-2.3116 2.5888-0.29823 0.46322-0.59437 1.0067-0.80428 1.4759-0.0325 0.0728-0.0672 0.14961-0.0771 0.17079l-0.0179 0.0385z" style="paint-order:stroke markers fill"/>
<path d="m316.58 128.23c-0.32253-0.65708-1.0579-1.0749-1.7946-1.0197-0.13747 0.0103-0.30166 0.0391-0.40476 0.071-0.0352 0.0109-0.0641 0.018-0.0641 0.0157 0-0.017 0.2779-0.39406 0.40079-0.54388 0.20681-0.25212 0.51307-0.5718 0.74896-0.78175 0.93103-0.8287 2.0321-1.3836 3.249-1.6373 0.72276-0.1507 1.5401-0.1828 2.2779-0.0895 0.26104 0.033 0.79522 0.13456 0.81651 0.1552 3e-3 3e-3 -0.0301 0.0147-0.0744 0.0253-1.5814 0.37737-3.0367 1.2608-4.1279 2.5058-0.32231 0.36774-0.6435 0.81917-0.90448 1.2712-0.04 0.0694-0.0734 0.1258-0.074 0.12545-8e-4 -2.7e-4 -0.0227-0.0443-0.0488-0.0976z" style="paint-order:stroke markers fill"/>
<path d="m313.7 127.26c-0.13433-0.31983-0.38995-0.61705-0.69124-0.80374-0.20862-0.12926-0.46201-0.21824-0.71645-0.25158-0.1-0.0131-0.3198-0.013-0.42168 1.5e-4 -0.0875 0.0113-0.24779 0.0451-0.29803 0.0628-0.018 6e-3 -0.0327 9e-3 -0.0326 6e-3 1.7e-4 -0.0105 0.19995-0.28509 0.31154-0.4282 0.90563-1.1615 2.1584-2.0457 3.5662-2.5171 1.7954-0.60118 3.7319-0.51208 5.4777 0.25206 0.13602 0.0595 0.54377 0.26123 0.53858 0.26642-2e-3 2e-3 -0.0628-5e-3 -0.13481-0.0171-0.62199-0.0996-1.246-0.12056-1.8672-0.0627-1.4625 0.13624-2.8327 0.69074-3.9802 1.6107-0.20315 0.16288-0.38582 0.32768-0.59675 0.5384-0.41779 0.41737-0.74298 0.82553-1.0566 1.3262l-0.0634 0.10129z" style="paint-order:stroke markers fill"/>
<path d="m310.74 126.57c-0.084-0.0756-0.20492-0.13826-0.3198-0.16557-0.0336-8e-3 -0.0622-0.0154-0.0635-0.0164-5e-3 -4e-3 0.16993-0.2862 0.27181-0.43817 0.75529-1.1267 1.7797-2.0336 2.9884-2.6455 1.1884-0.60165 2.5202-0.89675 3.8277-0.84815 0.14554 5e-3 0.26628 0.0115 0.26829 0.0135 2e-3 2e-3 -0.0183 4e-3 -0.0453 4e-3 -0.16458 2.7e-4 -0.57385 0.03-0.80546 0.0585-2.4013 0.2953-4.5245 1.6347-5.8247 3.6746-0.0464 0.0728-0.11894 0.19182-0.16125 0.26458-0.0423 0.0728-0.0792 0.13474-0.082 0.13774-3e-3 3e-3 -0.0272-0.0145-0.0542-0.0388z" style="paint-order:stroke markers fill"/>
<path d="m309.86 126.25c-0.0357-0.0259-0.0915-0.0564-0.1326-0.0725-0.0177-7e-3 -0.0331-0.0136-0.0343-0.0147-6e-3 -6e-3 0.17157-0.29402 0.29993-0.48505 0.60267-0.89689 1.3822-1.6667 2.2893-2.2609 0.28007-0.18345 0.53491-0.32869 0.8536-0.48648 0.43639-0.21608 0.86261-0.38175 1.3418-0.52154 0.13315-0.0388 0.44995-0.1193 0.46717-0.11864 7e-3 2.5e-4 -6e-3 6e-3 -0.0287 0.0121-1.394 0.39784-2.6285 1.1218-3.6425 2.1359-0.53318 0.53326-0.97421 1.1128-1.3601 1.7872l-0.0257 0.0449z" style="paint-order:stroke markers fill"/>
<path d="m309.6 124.87c-5.3e-4 -0.0605-0.1294-0.41622-0.2072-0.5717-0.28317-0.56583-0.72226-0.99895-1.289-1.2715-0.4268-0.20523-0.8651-0.29645-1.3252-0.27579-0.34895 0.0157-0.79548 0.12324-1.0528 0.25364-0.0446 0.0226-0.084 0.0381-0.0876 0.0345-4e-3 -4e-3 0.0242-0.0878 0.0617-0.18714 0.39973-1.0568 0.6364-2.083 0.75105-3.2564 0.0356-0.36478 0.0502-1.3887 0.0252-1.7783-0.17451-2.728-1.1803-5.1883-2.9691-7.263-0.0608-0.0705-0.10608-0.12816-0.10067-0.12816 0.0379 0 0.6441 0.33024 0.93521 0.5095 1.5391 0.94782 2.8075 2.1728 3.7957 3.666 1.9681 2.9736 2.5322 6.6331 1.5511 10.062-0.0577 0.20169-0.088 0.2722-0.0885 0.20588z" style="paint-order:stroke markers fill"/>
<path d="m305.02 122.98c-0.0901-0.13701-0.31545-0.35038-0.45901-0.43457-0.25077-0.14707-0.47389-0.20719-0.77308-0.20832-0.10687-5.3e-4 -0.1943-6e-3 -0.1943-0.0127 0-7e-3 0.0398-0.0968 0.0885-0.20043 0.20428-0.4352 0.44434-1.067 0.59921-1.577 0.81733-2.6918 0.71927-5.5748-0.27872-8.1943-0.0959-0.25175-0.27232-0.67145-0.32858-0.78172-0.0182-0.0357-0.0297-0.0682-0.0256-0.0724 0.0212-0.0212 0.5498 0.75492 0.76751 1.1269 0.94752 1.6191 1.4843 3.3956 1.5938 5.2751 0.0235 0.40332 0.0101 1.2597-0.0258 1.6454-0.10707 1.1508-0.35601 2.2045-0.7725 3.2698-0.0542 0.13851-0.10412 0.25533-0.11102 0.2596-7e-3 4e-3 -0.0431-0.0386-0.0803-0.0953z" style="paint-order:stroke markers fill"/>
<path d="m303.34 121.69c-5e-3 -0.0136-0.0317-0.0934-0.0592-0.17713-0.2329-0.70977-0.82389-1.2545-1.5693-1.4464-0.29328-0.0755-0.74837-0.0842-1.0082-0.0192-0.0328 8e-3 -0.014-0.0366 0.14393-0.34389 1.1128-2.165 1.728-4.4596 1.8548-6.9183 0.0205-0.39757 0.0106-1.6084-0.0159-1.943-8e-3 -0.0955-0.0126-0.17528-0.0112-0.17728 7e-3 -0.0107 0.31396 0.55918 0.44663 0.83047 0.6446 1.318 1.0323 2.6771 1.1821 4.144 0.19536 1.9131-0.0836 3.9133-0.79298 5.6869-0.13885 0.34715-0.16017 0.39256-0.17079 0.3638z" style="paint-order:stroke markers fill"/>
<path d="m300.26 119.79c-0.0363-0.0995-0.0614-0.15585-0.11604-0.26078-0.25619-0.49181-0.73703-0.85383-1.2945-0.97464-0.15315-0.0332-0.51007-0.0425-0.6635-0.0174-0.0609 0.01-0.1119 0.0169-0.11344 0.0153-2e-3 -2e-3 0.11416-0.1789 0.25713-0.39412 1.4882-2.2403 2.7619-4.6591 3.7395-7.1018l0.14457-0.36119 8e-3 0.0922c0.0398 0.47927 0.0522 1.5382 0.0235 2.0158-0.12807 2.133-0.5698 3.971-1.4125 5.8774-0.0986 0.2231-0.51273 1.0631-0.54716 1.1099-0.0165 0.0224-0.0168 0.0224-0.0252-8e-4z" style="paint-order:stroke markers fill"/>
<path d="m297.5 118.43c-0.1708-0.36499-0.52171-0.61467-0.93282-0.66371l-0.11856-0.0142 2.5327-3.296c1.393-1.8128 2.5344-3.291 2.5364-3.285 4e-3 0.0118-0.15258 0.38899-0.32184 0.7754-0.5116 1.168-1.1047 2.3583-1.7304 3.4728-0.54513 0.97093-1.2817 2.1534-1.8704 3.0025l-0.059 0.0851z" style="paint-order:stroke markers fill"/>
<path d="m295.77 116.54c-0.0247-0.45909-0.15462-0.84899-0.40563-1.2175-0.30444-0.44694-0.77925-0.78232-1.2992-0.91771-0.14604-0.038-0.32895-0.0701-0.4015-0.0705-0.0257-1.2e-4 -0.0529-4e-3 -0.0605-9e-3 -9e-3 -6e-3 0.0523-0.0683 0.16955-0.17421 1.9878-1.7953 4.3421-3.0988 6.9126-3.8274 0.26261-0.0744 0.80973-0.2131 0.90029-0.22816l0.0525-9e-3 -0.26302 0.27201c-1.8888 1.9534-3.6493 3.9336-5.3341 5.9999l-0.26336 0.32298z" style="paint-order:stroke markers fill"/>
<path d="m293.19 113.95c-0.0198-0.23423-0.11584-0.55678-0.24054-0.80784-0.13933-0.28053-0.28191-0.4741-0.51236-0.69562-0.37267-0.35822-0.81528-0.57459-1.3538-0.66178-0.093-0.015-0.19515-0.0209-0.36906-0.021l-0.24044-1.8e-4 0.03-0.0249c0.0165-0.0137 0.11415-0.0879 0.21705-0.16479 1.6902-1.2639 3.6941-2.073 5.7705-2.33 0.56878-0.0704 0.87094-0.088 1.5143-0.088 0.54835-1e-5 0.70092 6e-3 1.1401 0.0471 0.70222 0.0653 1.4723 0.2086 2.1661 0.40319l0.13736 0.0385-0.33614 0.0843c-2.0379 0.51109-3.8672 1.3209-5.598 2.4782-0.77413 0.5176-1.4477 1.0452-2.1263 1.6656-0.0955 0.0873-0.17754 0.16014-0.18241 0.16197-5e-3 2e-3 -0.0122-0.0363-0.0163-0.0847z" style="paint-order:stroke markers fill"/>
<path d="m289.91 111.58c0.0166-0.10215 0.0217-0.4848 8e-3 -0.59734-0.0974-0.79779-0.57186-1.4646-1.287-1.8086-0.2424-0.11658-0.49216-0.18906-0.74696-0.21676-0.0603-7e-3 -0.11138-0.0136-0.11344-0.0157-0.0101-0.0101 0.51431-0.34385 0.79024-0.50283 1.2821-0.73873 2.6966-1.2282 4.1627-1.4405 0.87173-0.12621 1.8204-0.1507 2.7128-0.07 1.7352 0.15689 3.4254 0.70817 4.9345 1.6094 0.16003 0.0956 0.77656 0.50234 0.83021 0.54775l0.0292 0.0247-0.0292-7e-3c-1.1726-0.29095-2.0744-0.4052-3.198-0.40516-0.58517 2e-5 -1.0113 0.0249-1.5376 0.0897-2.3322 0.28722-4.5287 1.2126-6.358 2.6787-0.098 0.0786-0.18418 0.14652-0.19147 0.15103-0.01 6e-3 -0.0111-5e-3 -6e-3 -0.0373z" style="paint-order:stroke markers fill"/>
<path d="m287.25 108.55c-0.0108-0.28757-0.0653-0.53165-0.17387-0.7784-0.24183-0.54963-0.73312-0.97685-1.3162-1.1445-0.0529-0.0152-0.0992-0.0307-0.10293-0.0344-9e-3 -9e-3 0.19963-0.13924 0.50899-0.31595 1.4802-0.84555 3.133-1.3726 4.8292-1.54 0.39465-0.0389 0.56955-0.0485 1.0173-0.0556 1.6518-0.0262 3.2651 0.27742 4.7942 0.90232 1.2659 0.51736 2.4668 1.266 3.4784 2.1683 0.20412 0.18209 0.54572 0.50587 0.53987 0.51172-3e-3 3e-3 -0.0666-0.0327-0.14225-0.0784-1.6316-0.98538-3.4077-1.564-5.2909-1.7238-0.52226-0.0443-1.2778-0.0523-1.7715-0.0187-2.2931 0.15597-4.3807 0.89602-6.2628 2.2202l-0.10058 0.0708z" style="paint-order:stroke markers fill"/>
<path d="m301.8 108.62c-0.20023-0.24947-0.98965-1.0395-1.34-1.3411-1.8429-1.5863-4.0792-2.6044-6.4642-2.9428-0.70938-0.10067-0.97652-0.11825-1.7958-0.11814-0.76158 9e-5 -1.0512 0.0166-1.6604 0.0948-0.99031 0.12712-2.1075 0.42077-3.0702 0.80699-0.35222 0.1413-1.2238 0.55773-1.4608 0.69791-0.0675 0.0399-0.12278 0.0668-0.12278 0.0597 0-7e-3 0.0572-0.12049 0.12702-0.25188 0.41508-0.78063 0.66893-1.6299 0.76278-2.5519 0.0371-0.36423 0.0166-1.2932-0.0358-1.6276-0.21726-1.3849-0.7698-2.5669-1.6842-3.6028-0.65711-0.74444-1.615-1.4131-2.5608-1.7875-0.1222-0.0484-0.22529-0.0906-0.22909-0.0939-0.0101-9e-3 0.83257-0.16816 1.1061-0.20936 0.67472-0.10163 1.1758-0.14772 1.9082-0.17553 1.9661-0.0747 4.0092 0.22956 5.891 0.87716 1.2996 0.44725 2.5249 1.0474 3.6716 1.7984 3.0429 1.9928 5.3533 4.9688 6.5281 8.4086 0.25132 0.73589 0.61224 2.1052 0.55472 2.1047-5e-3 -5e-5 -0.0611-0.0657-0.12543-0.14577z" style="paint-order:stroke markers fill"/>
<path d="m285.25 105.95c-1.6e-4 -0.0194-6e-3 -0.073-0.0129-0.11921-0.12932-0.861-0.75516-1.5557-1.5968-1.7724-0.18673-0.0481-0.31973-0.0643-0.53346-0.0651-0.12347-5.3e-4 -0.18527-4e-3 -0.18117-9e-3 3e-3 -5e-3 0.0305-0.038 0.0601-0.0744 0.7372-0.90595 1.1703-2.0702 1.2041-3.237 0.0201-0.69331-0.0701-1.3041-0.28727-1.9448-0.25328-0.74733-0.6875-1.4596-1.2275-2.0136-0.0587-0.0602-0.10338-0.10955-0.0992-0.10955 0.0134 0 0.36763 0.17735 0.47858 0.23961 0.7096 0.39816 1.3266 0.9137 1.8358 1.5339 0.53773 0.65498 0.9483 1.4336 1.1903 2.2572 0.30823 1.0492 0.33948 2.1675 0.0906 3.2412-0.15714 0.67773-0.43632 1.3478-0.81091 1.9464-0.0403 0.0644-0.0815 0.12721-0.0916 0.13957l-0.0183 0.0225-2.9e-4 -0.0352z" style="paint-order:stroke markers fill"/>
<path d="m282.2 104.04c-9e-3 -0.0137-0.0322-0.0413-0.0514-0.0614l-0.0351-0.0366 0.14001-0.14174c0.19638-0.19881 0.31997-0.34206 0.48005-0.5564 0.3847-0.51511 0.67359-1.1057 0.8482-1.7339 0.0587-0.21139 0.1118-0.46688 0.13926-0.67068 6e-3 -0.0425 0.0114-0.0763 0.0126-0.0751 3e-3 3e-3 -0.0157 0.22404-0.0284 0.32774-0.1043 0.852-0.43297 1.6728-0.94702 2.3651-0.0804 0.10819-0.19101 0.24438-0.28015 0.34475-0.0707 0.0796-0.24975 0.26309-0.25674 0.26309-3e-3 0-0.0123-0.0112-0.0213-0.0248z" style="paint-order:stroke markers fill"/>
<path d="m282.22 102.44c-0.0129-0.35536-0.11745-0.67915-0.31424-0.97359-0.14446-0.21613-0.36125-0.42341-0.58455-0.55889-0.19428-0.11787-0.44423-0.21046-0.65976-0.24437-0.0373-6e-3 -0.0678-0.0136-0.0678-0.0171 0-4e-3 0.0301-0.0422 0.0669-0.0859 0.15689-0.1866 0.34947-0.46288 0.47423-0.68031 0.49836-0.86858 0.72194-1.8476 0.6488-2.8411-8e-3 -0.10563-0.035-0.34417-0.0457-0.40101l-6e-3 -0.0289 0.0309 0.0289c0.017 0.0159 0.0708 0.0736 0.11958 0.12815 0.69695 0.77963 1.1125 1.7683 1.1827 2.8139 0.0174 0.25931 9e-3 0.58323-0.0212 0.84476-0.0849 0.72867-0.34126 1.4324-0.74465 2.0443-0.0382 0.058-0.0707 0.10542-0.0722 0.10542-1e-3 0-5e-3 -0.0605-8e-3 -0.13435z" style="paint-order:stroke markers fill"/>
<path d="m280.2 100.32c-0.0752-0.23429-0.24348-0.45329-0.45936-0.59763-0.0693-0.0463-0.17886-0.10076-0.2543-0.12634-0.0306-0.0104-0.0576-0.0206-0.0601-0.0228-2e-3 -2e-3 0.0422-0.0458 0.0994-0.097 0.1329-0.11902 0.36416-0.35023 0.48276-0.48266 0.54963-0.61378 0.95915-1.2793 1.2587-2.0455 0.017-0.0434 0.0322-0.075 0.0338-0.0701 7e-3 0.0202 0.0218 0.21306 0.0282 0.36392 0.0108 0.25491-4e-3 0.5239-0.0425 0.79661-0.11638 0.81429-0.45331 1.577-0.98019 2.2188-0.0356 0.0434-0.0711 0.0848-0.0788 0.092l-0.014 0.0131z" style="paint-order:stroke markers fill"/>
<path d="m279 99.271c-0.0434-0.12324-0.12607-0.24216-0.22068-0.31763l-0.0275-0.0219 0.1035-0.076c0.26901-0.19744 0.59934-0.46661 0.85185-0.69414 0.28712-0.25873 0.63548-0.60824 0.88428-0.88722 0.0394-0.0442 0.0716-0.0773 0.0716-0.0735 0 0.0121-0.14849 0.29702-0.21754 0.41742-0.21792 0.37996-0.46524 0.72308-0.75832 1.052-0.14978 0.1681-0.40407 0.41692-0.57639 0.56397-0.0354 0.0302-0.0712 0.0611-0.0795 0.0687l-0.0152 0.0139z" style="paint-order:stroke markers fill"/>
<path d="m278.38 98.617c-5e-3 -8e-3 -0.0125-0.0194-0.0169-0.0255l-8e-3 -0.0111 5e-3 -3e-3c0.0111-7e-3 0.23428-0.15572 0.29189-0.19489 0.18262-0.12417 0.39317-0.27146 0.53547-0.37457 0.0115-8e-3 0.0213-0.0149 0.0216-0.0146 3.4e-4 2.6e-4 -7e-3 7e-3 -0.0173 0.0159-0.23303 0.19838-0.46279 0.37865-0.70783 0.55537-0.0405 0.0292-0.094 0.067-0.0947 0.067-4e-4 0-5e-3 -6e-3 -0.01-0.0144z" style="paint-order:stroke markers fill"/>
<path d="m278.3 98.016c-0.0326-0.1641-0.12429-0.32537-0.2502-0.44005-0.0152-0.0139-0.0264-0.0273-0.0248-0.0298 4e-3 -6e-3 0.18185-0.10092 0.38535-0.2048 0.48558-0.24785 1.0314-0.49086 1.5482-0.68927 0.20338-0.0781 0.40948-0.15278 0.41578-0.15068 6e-3 2e-3 -0.2339 0.20366-0.45696 0.38333-0.39004 0.31414-0.81758 0.63613-1.2172 0.91664-0.13329 0.0936-0.38414 0.26525-0.38759 0.26525-1e-3 0-7e-3 -0.0228-0.0126-0.0506z" style="paint-order:stroke markers fill"/>
<path d="m277.78 97.102c-0.0314-0.19983-0.1516-0.4057-0.3093-0.52991l-0.0306-0.0241 0.0652-0.0275c0.0861-0.0363 0.22746-0.0902 0.33105-0.12612 0.54033-0.18741 1.0612-0.29626 1.6323-0.34112 0.24377-0.0192 0.59622-0.0243 0.76544-0.0112l0.0434 3e-3 -0.16617 0.06c-0.49905 0.18019-0.99633 0.38687-1.4846 0.61702-0.21435 0.10104-0.6132 0.3029-0.79825 0.404l-0.0411 0.0225z" style="paint-order:stroke markers fill"/>
<path d="m277.07 96.198c-0.0226-0.10288-0.0732-0.20442-0.14728-0.29542-0.0178-0.0218-0.0312-0.0406-0.03-0.0417 7e-3 -6e-3 0.19201-0.0741 0.28875-0.10625 0.38116-0.12667 0.74351-0.20133 1.1664-0.24032 0.14459-0.0133 0.63812-0.0151 0.78635-3e-3 0.1802 0.0149 0.49284 0.0567 0.52597 0.0704 7e-3 3e-3 -0.0238 6e-3 -0.0789 9e-3 -0.45621 0.0194-1.0151 0.11312-1.5053 0.25242-0.30209 0.0858-0.69158 0.22846-0.94056 0.34437-0.0317 0.0148-0.0587 0.0269-0.0598 0.0269-1e-3 0-4e-3 -7e-3 -6e-3 -0.0161z" style="paint-order:stroke markers fill"/>
<path d="m280.83 95.361c-9e-3 -9e-3 -0.25637-0.13096-0.34758-0.17179-1.1198-0.50123-2.3924-0.58417-3.572-0.2328-0.0433 0.0129-0.0794 0.0229-0.0801 0.0221-7.4e-4 -7.9e-4 9e-3 -0.0276 0.0222-0.0596 0.0434-0.10755 0.0815-0.25351 0.10228-0.39117 0.0123-0.0817 0.0172-0.3054 9e-3 -0.39251-0.0415-0.41962-0.22264-0.79835-0.5187-1.0843-0.0317-0.0306-0.069-0.0647-0.0828-0.0758-0.0217-0.0173-0.0237-0.0206-0.0143-0.0241 6e-3 -2e-3 0.0633-9e-3 0.12747-0.0148 0.0938-9e-3 0.1682-0.0108 0.37972-0.0106 0.2744 2.2e-4 0.35821 5e-3 0.57003 0.0324 1.0515 0.13629 2.0255 0.64292 2.7359 1.4231 0.26053 0.28612 0.46331 0.57423 0.65736 0.93398 0.0245 0.0454 0.0288 0.0619 0.0121 0.0458z" style="paint-order:stroke markers fill"/>
<path d="m281.14 94.945c-0.22078-0.38958-0.44471-0.67755-0.8107-1.0426-0.39217-0.39114-0.7607-0.66037-1.2335-0.9011-0.49247-0.25077-0.97849-0.40494-1.5627-0.49571-0.23936-0.0372-0.8469-0.0509-1.1233-0.0253-0.12028 0.0111-0.22193 0.017-0.2259 0.013-4e-3 -4e-3 0.0191-0.0649 0.0512-0.13544 0.4271-0.9372 0.34527-1.989-0.22069-2.8369-0.32255-0.48319-0.77381-0.84844-1.3421-1.0863-0.033-0.0138 5e-3 -0.0199 0.18916-0.0299 0.51231-0.028 1.1699 0.0412 1.7297 0.18198 1.4104 0.35468 2.6637 1.2076 3.5072 2.3866 0.39471 0.55178 0.71676 1.2131 0.90604 1.8605 0.19521 0.66766 0.28273 1.4561 0.23526 2.1193l-0.0106 0.14883z" style="paint-order:stroke markers fill"/>
<path d="m281.72 94.437c-5e-3 -0.22535-0.0213-0.50646-0.0356-0.6247-0.18492-1.5254-0.83345-2.8674-1.9022-3.9361-0.53859-0.53858-1.0907-0.93315-1.7699-1.2649-0.70768-0.34568-1.366-0.53757-2.1912-0.63874-0.335-0.0411-1.1024-0.0412-1.4363-2.4e-4 -0.13067 0.016-0.24074 0.026-0.24461 0.0221-4e-3 -4e-3 0.059-0.0674 0.13962-0.14109 0.51711-0.47262 1.0097-1.1658 1.3086-1.8415 0.62685-1.417 0.65293-3.0084 0.073-4.4517-0.0918-0.22856-0.312-0.65787-0.45276-0.8829-0.43556-0.69634-1.0818-1.3439-1.7761-1.7798-0.1734-0.10886-0.16927-0.11017 0.18438-0.0586 1.9346 0.28232 3.6815 1.0256 5.2165 2.2195 0.61166 0.47576 1.2948 1.1511 1.7945 1.7738 0.45427 0.56615 0.89132 1.2443 1.2202 1.8934 1.4646 2.8906 1.5755 6.271 0.30348 9.2518-0.1063 0.24909-0.33389 0.72656-0.38859 0.81524l-0.0334 0.0542z" style="paint-order:stroke markers fill"/>
<path d="m282.55 94.291c0.0186-0.0514 0.10699-0.28297 0.19639-0.51449 0.36655-0.94932 0.61876-2.0266 0.71724-3.0636 0.067-0.70549 0.0314-2.0168-0.0738-2.7128-0.76651-5.0757-4.7619-8.988-9.8615-9.6565-0.30257-0.0397-0.56302-0.0721-0.57878-0.0721-0.0158 0 0.19054-0.15049 0.45843-0.33442 0.75014-0.51502 1.3188-0.98841 1.9862-1.6533 2.1789-2.1708 3.5224-4.8475 4.0027-7.9748 0.13943-0.90788 0.15315-2.8866 0.0262-3.7845-0.22013-1.5575-0.67673-3.0716-1.3039-4.3237-0.12698-0.25351-0.21864-0.47318-0.20368-0.48814 0.015-0.015 0.22148 0.10648 0.45892 0.26987 3.3604 2.3124 5.9356 5.2749 7.7053 8.8643 3.1183 6.3244 3.1649 13.633 0.12776 20.042-0.52344 1.1046-1.3165 2.4439-2.0586 3.4763-0.62081 0.86372-1.6733 2.1314-1.5989 1.9258z" style="paint-order:stroke markers fill"/>
<path d="m273.2 88.034c-7e-3 -0.0929-0.0336-0.1869-0.0808-0.28706-0.0562-0.11933-0.12205-0.20717-0.21904-0.29203l-0.0442-0.0387 0.039-0.0227c0.14924-0.0869 0.43074-0.29049 0.61779-0.44684 0.20569-0.17191 0.5061-0.4789 0.67858-0.69341 0.26273-0.32676 0.48894-0.68952 0.65736-1.0542 0.25294-0.54765 0.39778-1.087 0.4596-1.7115 0.0179-0.18046 0.0205-0.67268 5e-3 -0.84749-0.0405-0.44306-0.11515-0.813-0.24209-1.2001-0.0232-0.0706-0.0399-0.13049-0.0373-0.13311 3e-3 -3e-3 0.0294 0.047 0.0596 0.11023 0.25442 0.53372 0.4106 1.0554 0.48227 1.611 0.0336 0.26006 0.0377 0.33439 0.0375 0.67856-2e-4 0.36223-7e-3 0.4682-0.0502 0.7589-0.18627 1.2595-0.83322 2.416-1.8089 3.2335-0.15292 0.12814-0.43084 0.33229-0.5394 0.39623-6e-3 4e-3 -0.0108-0.016-0.0143-0.0613z" style="paint-order:stroke markers fill"/>
<path d="m272.54 87.041c-3e-3 -0.0102-0.0204-0.0492-0.0396-0.0866l-0.0348-0.068 0.0934-0.0542c0.11291-0.0656 0.31671-0.201 0.42954-0.28544 0.86609-0.64818 1.4936-1.5681 1.7699-2.5945 0.0173-0.0644 0.033-0.11551 0.0349-0.11366 6e-3 6e-3 -0.0307 0.18324-0.0697 0.33895-0.0883 0.3527-0.24128 0.74827-0.40886 1.0572-0.22765 0.41963-0.47813 0.75671-0.80943 1.0893-0.22356 0.22443-0.44351 0.40635-0.69754 0.57695-0.12066 0.081-0.24606 0.1586-0.2564 0.1586-4e-3 0-9e-3 -8e-3 -0.0115-0.0186z" style="paint-order:stroke markers fill"/>
<path d="m273.34 85.595c2e-3 -8e-3 0.0175-0.0672 0.0335-0.1323 0.1136-0.45973 0.0874-0.95808-0.0741-1.4098-0.0822-0.22996-0.23919-0.50954-0.396-0.70529-0.18908-0.23604-0.45718-0.46071-0.72958-0.6114-0.16157-0.0894-0.421-0.19197-0.56625-0.22394l-0.0467-0.0103 0.079-0.0754c0.50525-0.48196 0.85232-1.137 0.96864-1.8282 0.0308-0.18335 0.043-0.33853 0.043-0.54984 0-0.33791-0.0433-0.64206-0.13469-0.94509-9e-3 -0.0309-0.0146-0.0586-0.0118-0.0614 3e-3 -3e-3 0.034 0.0148 0.0691 0.0392 0.77362 0.53642 1.3353 1.2717 1.6516 2.162 0.22967 0.64656 0.29989 1.4044 0.19376 2.0911-0.10458 0.6767-0.36245 1.3135-0.75864 1.8735-0.10751 0.15194-0.33191 0.4225-0.32098 0.387z" style="paint-order:stroke markers fill"/>
<path d="m271.25 82.101c-0.0553-0.30837-0.23732-0.58357-0.49937-0.75487l-0.0724-0.0473 0.0495-0.0305c0.19025-0.11744 0.44366-0.33053 0.62361-0.5244 0.33349-0.35931 0.59181-0.80453 0.73719-1.2706l0.031-0.0992 0.0116 0.0496c0.0851 0.3645 0.0903 0.79721 0.0141 1.1782-0.11109 0.55552-0.3807 1.0551-0.78664 1.4577l-0.0984 0.0976z" style="paint-order:stroke markers fill"/>
<path d="m270.35 80.942c0-0.0317-0.0413-0.14602-0.07-0.19366-0.0161-0.0267-0.0292-0.0499-0.0292-0.0516 0-2e-3 0.0403-0.0233 0.0896-0.048 0.34711-0.17408 0.68192-0.4156 0.98038-0.7072 0.0724-0.0707 0.12903-0.12155 0.12593-0.11299-0.0104 0.0285-0.098 0.17349-0.16318 0.26969-0.1858 0.27441-0.45705 0.5479-0.73098 0.73702-0.0759 0.0524-0.18893 0.12288-0.19706 0.12288-3e-3 0-5e-3 -7e-3 -5e-3 -0.0161z" style="paint-order:stroke markers fill"/>
<path d="m270.02 79.861c0-0.0281-0.0275-0.12387-0.0499-0.17358-0.0205-0.0456-0.0215-0.0517-9e-3 -0.0566 7e-3 -3e-3 0.0666-0.0237 0.13138-0.0459 0.23887-0.082 0.56169-0.20553 0.81135-0.31056 0.0699-0.0294 0.12864-0.0518 0.13059-0.0499 2e-3 2e-3 -0.0254 0.0276-0.0609 0.0571-0.16601 0.13801-0.38915 0.29225-0.58839 0.40673-0.0987 0.0567-0.34977 0.18665-0.36065 0.18665-2e-3 0-4e-3 -6e-3 -4e-3 -0.0139z" style="paint-order:stroke markers fill"/>
<path d="m269.8 79.132c-8e-3 -0.035-0.0231-0.0837-0.0339-0.10831-0.0109-0.0246-0.0188-0.0455-0.0176-0.0464 5e-3 -4e-3 0.39594-0.0791 0.51067-0.0985 0.22984-0.0388 0.56808-0.0843 0.57512-0.0772 2e-3 2e-3 -0.0156 0.0117-0.0396 0.0212-0.024 9e-3 -0.11194 0.0454-0.19551 0.0798-0.1795 0.0739-0.4522 0.17715-0.64615 0.24475l-0.1389 0.0484z" style="paint-order:stroke markers fill"/>
<path d="m271.26 77.997c-0.16994-0.046-0.46106-0.0951-0.71521-0.12067-0.17903-0.018-0.66574-0.0204-0.82981-4e-3 -0.0585 6e-3 -0.108 9e-3 -0.11004 7e-3 -2e-3 -2e-3 2e-3 -0.0255 9e-3 -0.0521 0.0236-0.0895 0.033-0.2164 0.0228-0.306-0.0108-0.0945-0.0346-0.19056-0.0632-0.25511l-0.0201-0.0454h0.0225c0.0124 0 0.0682 6e-3 0.12394 0.0126 0.533 0.066 1.0158 0.26849 1.4346 0.60179 0.0964 0.0767 0.20785 0.17976 0.19321 0.17866-5e-3 -5.3e-4 -0.036-8e-3 -0.0678-0.0164z" style="paint-order:stroke markers fill"/>
<path d="m271.59 77.624c-0.45449-0.42117-1.0472-0.71295-1.666-0.8202-0.1226-0.0212-0.35286-0.0465-0.4237-0.0465-0.026 0-0.0353-3e-3 -0.0322-0.0103 0.0172-0.0411 0.0483-0.15505 0.0593-0.21704 0.0173-0.0979 0.0172-0.28293-1e-4 -0.38034-0.0261-0.14627-0.0926-0.31093-0.17304-0.42848-0.0446-0.0651-0.0498-0.0632 0.096-0.0352 0.4632 0.089 0.88538 0.28359 1.2549 0.57847 0.12719 0.10151 0.33551 0.30877 0.43308 0.43089 0.21707 0.27166 0.38823 0.58632 0.49221 0.90485 0.014 0.0429 0.0246 0.0788 0.0236 0.0797-1e-3 7.9e-4 -0.0298-0.0242-0.0639-0.0558z" style="paint-order:stroke markers fill"/>
<path d="m272 77.251c-0.0467-0.12003-0.16467-0.35512-0.24215-0.4825-0.53334-0.87696-1.4397-1.4549-2.4618-1.5697-0.0591-7e-3 -0.12609-0.0122-0.14883-0.0123-0.0227-1.2e-4 -0.0456-3e-3 -0.0508-6e-3 -7e-3 -4e-3 4e-3 -0.0283 0.0323-0.0764 0.0838-0.14076 0.1417-0.30243 0.16765-0.46786 0.0206-0.13116 0.0133-0.36197-0.0153-0.48305-0.0377-0.15999-0.10432-0.3142-0.19245-0.44557-0.0198-0.0295-0.0346-0.0552-0.0328-0.0569 6e-3 -6e-3 0.23863 0.0398 0.35596 0.0699 1.0007 0.25665 1.8461 0.95182 2.2912 1.8842 0.16654 0.34882 0.27086 0.71168 0.32197 1.12 0.0148 0.11801 0.0264 0.57755 0.0151 0.59773-6e-3 0.01-0.0156-8e-3 -0.0401-0.0712z" style="paint-order:stroke markers fill"/>
<path d="m272.48 76.753c-0.0783-0.8258-0.40361-1.5922-0.94473-2.2254-0.12168-0.14239-0.36733-0.37965-0.51827-0.50054-0.60245-0.48257-1.3014-0.77016-2.0767-0.85445-0.0682-7e-3 -0.125-0.0145-0.12622-0.0157-1e-3 -1e-3 0.0187-0.0381 0.0442-0.082 0.0908-0.15589 0.16257-0.37003 0.18559-0.55365 0.0149-0.11847 6e-3 -0.36641-0.0166-0.47294-0.0347-0.16232-0.11097-0.35484-0.19056-0.48087-0.0181-0.0286-0.0329-0.0542-0.0329-0.0569 0-7e-3 0.0547 2e-3 0.2067 0.0305 0.73345 0.14011 1.4177 0.46589 2.0092 0.95664 0.12152 0.10081 0.42771 0.40688 0.53058 0.53035 0.86671 1.0403 1.214 2.3848 0.95479 3.6959l-0.0188 0.0951z" style="paint-order:stroke markers fill"/>
<path d="m272.66 77.799c0.26156-0.60548 0.38845-1.234 0.38834-1.9235-1e-4 -0.57647-0.0697-1.0217-0.24117-1.5435-0.49359-1.5017-1.7331-2.6997-3.2421-3.1333l-0.21749-0.0625 0.24088-0.0885c2.3848-0.87594 4.4463-2.5093 5.8313-4.6202 0.75069-1.1442 1.2924-2.3809 1.6124-3.6812 0.21575-0.87673 0.29865-1.4849 0.35416-2.598l0.0152-0.30402 0.24032 0.48715c0.77423 1.5694 1.2149 3.1681 1.371 4.9735 0.0378 0.43675 0.0368 1.6444-2e-3 2.0814-0.25513 2.9008-1.3029 5.456-3.1504 7.6823-0.31453 0.37904-1.2107 1.2788-1.5997 1.6061-0.16078 0.13529-0.42513 0.34645-0.58744 0.46926-0.28546 0.21598-0.98642 0.69585-1.0164 0.69585-8e-3 0-7e-3 -0.0184 3e-3 -0.0409z" style="paint-order:stroke markers fill"/>
<path d="m268.95 70.627c0.23225-0.51222 0.2327-1.1279 1e-3 -1.6384-0.13761-0.30351-0.39838-0.61738-0.65843-0.7925l-0.12238-0.0824 0.0679-0.0149c0.45841-0.10051 1.2041-0.33387 1.7166-0.53717 3.0928-1.227 5.5317-3.6454 6.7926-6.7354l0.15268-0.37418-0.0131 0.16371c-0.0552 0.68766-0.12866 1.1929-0.25639 1.7631-0.86459 3.86-3.687 7.0128-7.4326 8.3026-0.15256 0.0525-0.28608 0.0955-0.29671 0.0955-0.0106 0 0.0113-0.0675 0.0487-0.14998z" style="paint-order:stroke markers fill"/>
<path d="m267.5 67.698c-4e-3 -0.0413-0.0119-0.0941-0.0182-0.11745l-0.0114-0.0424 0.0125-3e-3c7e-3 -2e-3 0.0743-0.0135 0.14989-0.0266 1.441-0.25066 2.8601-0.77359 4.1364-1.5243 0.58026-0.34129 1.1618-0.7513 1.6624-1.1722 0.0493-0.0415 0.0909-0.0742 0.0923-0.0728 3e-3 3e-3 -0.10716 0.10716-0.21418 0.20368-0.68875 0.62115-1.4593 1.1639-2.2889 1.6125-0.14123 0.0763-0.50271 0.25625-0.65773 0.32735-0.75712 0.34722-1.5371 0.60957-2.3474 0.78958-0.12774 0.0284-0.43179 0.0893-0.48252 0.0966l-0.0265 4e-3z" style="paint-order:stroke markers fill"/>
<path d="m268.48 66.363c0.35685-0.3739 0.60803-0.92006 0.67084-1.4586 0.0962-0.82487-0.20627-1.6526-0.80939-2.2149-0.0627-0.0584-0.10745-0.10624-0.0995-0.10624 8e-3 0 0.12366-0.0161 0.25713-0.0358 2.512-0.37026 4.9654-1.2174 7.1708-2.4761 0.2351-0.13417 0.65456-0.38611 0.82312-0.49438 0.0581-0.0373 0.10755-0.066 0.10982-0.0638 7e-3 7e-3 -0.15114 0.34901-0.27299 0.59247-1.0251 2.048-2.6379 3.7882-4.6005 4.964-0.8404 0.50346-1.7874 0.92516-2.6999 1.2022-0.19155 0.0582-0.59474 0.16997-0.61294 0.16997-7e-3 0 0.022-0.0355 0.0635-0.0789z" style="paint-order:stroke markers fill"/>
<path d="m268.18 62.008c0.16604-0.32771 0.24467-0.72282 0.2125-1.0677-0.0264-0.28262-0.085-0.49213-0.20623-0.73666-0.10034-0.20243-0.20331-0.34483-0.37295-0.5158l-0.14053-0.14163 0.44434-8e-3c2.5401-0.0442 5.0619-0.14854 7.5289-0.3116 0.28862-0.0191 0.54091-0.0347 0.56065-0.0347 0.032 0 0.0249 7e-3 -0.0659 0.0639-2.3266 1.4608-5.0881 2.4702-7.7898 2.8473-0.0965 0.0135-0.18948 0.0273-0.2067 0.0307-0.0312 6e-3 -0.031 6e-3 0.0357-0.12609z" style="paint-order:stroke markers fill"/>
<path d="m267.46 59.011c0.17325-0.2289 0.26159-0.50143 0.26171-0.80735 1e-4 -0.27291-0.0737-0.51653-0.2281-0.75291l-0.0259-0.0396 0.14542 8e-3c2.5179 0.14205 4.9384 0.50889 7.3425 1.1128 0.29262 0.0735 0.60461 0.15359 0.69332 0.17798l0.16129 0.0444-0.31914 0.0203c-2.1858 0.13888-4.0432 0.22212-6.1774 0.27685-0.5462 0.014-1.6048 0.0346-1.7856 0.0348l-0.12524 1.1e-4z" style="paint-order:stroke markers fill"/>
<path d="m274.73 57.998c-0.52966-0.13192-1.4967-0.33641-2.1749-0.45989-1.6305-0.29688-3.4111-0.50515-4.9696-0.58123-0.15756-8e-3 -0.28776-0.0149-0.28932-0.016-2e-3 -1e-3 8e-3 -0.0251 0.022-0.0533 0.099-0.20489 0.11947-0.47583 0.053-0.701-0.0161-0.0546-0.0277-0.10098-0.0257-0.10299 2e-3 -2e-3 0.12131 7e-3 0.2651 0.0207 2.3095 0.21504 4.5801 0.77825 6.6984 1.6615 0.29201 0.12175 0.61994 0.26457 0.62954 0.27417 0.0109 0.0109-0.0275 3e-3 -0.20859-0.0419z" style="paint-order:stroke markers fill"/>
<path d="m275.93 58.001c-1.7781-0.88683-3.6104-1.5258-5.5845-1.9476-0.73801-0.15765-1.6762-0.3061-2.3726-0.3754-0.1029-0.0102-0.19915-0.0211-0.21388-0.0242-0.0261-5e-3 -0.0258-6e-3 0.0117-0.0365 0.0715-0.0574 0.19804-0.18427 0.2659-0.26658 0.32469-0.39385 0.49-0.91907 0.4453-1.4148-0.0249-0.27577-0.0961-0.51924-0.22312-0.76306-0.0377-0.0724-0.0639-0.13155-0.0583-0.13155 0.023 0 0.49773 0.10902 0.66688 0.15314 1.6393 0.4276 3.1447 1.1292 4.5005 2.0976 0.649 0.46353 1.1158 0.86091 1.7092 1.4549 0.4722 0.47273 0.75089 0.78562 1.1067 1.2426 0.15111 0.19404 0.16165 0.20889 0.14739 0.20763-5e-3 -5.3e-4 -0.18573-0.0888-0.40118-0.19621z" style="paint-order:stroke markers fill"/>
<path d="m276.59 57.758c-2.0132-2.6022-4.8549-4.4056-8.0682-5.12-0.13505-0.03-0.24679-0.0558-0.2483-0.0572-2e-3 -2e-3 0.0327-0.0286 0.076-0.0603 0.10859-0.0795 0.32757-0.2937 0.42314-0.41389 0.62023-0.77989 0.73201-1.8224 0.29019-2.7064-0.0697-0.13941-0.14856-0.26827-0.23048-0.37648-0.0333-0.044-0.0556-0.0817-0.0496-0.0837s0.0708 0.0155 0.14395 0.0389c1.5582 0.49922 2.925 1.2742 4.1495 2.353 0.2208 0.19452 0.72771 0.69912 0.91874 0.91455 1.3849 1.5618 2.2846 3.3545 2.6953 5.3706 0.0325 0.1595 0.0574 0.30068 0.0554 0.31372-3e-3 0.0176-0.043-0.0272-0.15566-0.17278z" style="paint-order:stroke markers fill"/>
<path d="m277.08 57.216c-0.40593-1.7752-1.2397-3.4729-2.3971-4.8811-0.34106-0.41495-0.87812-0.97715-1.2475-1.306-1.0785-0.95992-2.2695-1.6946-3.5898-2.2146-0.37165-0.14636-0.8051-0.2922-1.1474-0.38607l-0.16521-0.0453 0.10323-0.0706c0.42687-0.29196 0.74268-0.73793 0.8758-1.2367 0.0569-0.21313 0.0743-0.35224 0.0737-0.58785-6.4e-4 -0.22808-0.0219-0.38698-0.0792-0.5908-0.0576-0.20494-0.16049-0.42735-0.28555-0.61741-0.0605-0.092-0.0676-0.10779-0.0451-0.10088 0.0147 5e-3 0.12141 0.0423 0.23717 0.0839 3.04 1.0933 5.4692 3.3528 6.7666 6.2941 0.78239 1.7737 1.117 3.7655 0.95271 5.6709l-0.0136 0.15762z" style="paint-order:stroke markers fill"/>
<path d="m277.06 52.575c-0.92631-2.8977-2.887-5.3286-5.517-6.8402-0.84148-0.48364-1.8412-0.90594-2.7207-1.1493-0.11823-0.0327-0.22412-0.0626-0.23531-0.0664-0.0139-5e-3 5e-5 -0.0453 0.0437-0.12747 0.0783-0.14747 0.10656-0.26266 0.10571-0.43101-5.7e-4 -0.11093 3e-3 -0.12749 0.0261-0.12057 0.89395 0.26764 1.5487 0.53174 2.3005 0.92798 1.7438 0.91902 3.253 2.284 4.3599 3.9431 0.7019 1.0521 1.2646 2.3015 1.5901 3.5305 0.0807 0.30479 0.14187 0.56959 0.13343 0.57783-4e-3 3e-3 -0.0424-0.10663-0.0864-0.24449z" style="paint-order:stroke markers fill"/>
<path d="m276.63 49.888c-0.0724-0.16347-0.34516-0.66746-0.51192-0.94587-0.79245-1.323-1.8492-2.5117-3.0597-3.4417-0.66584-0.51154-1.3056-0.91099-2.0559-1.2836-0.55543-0.27582-1.0358-0.47454-1.5999-0.66189-0.18647-0.0619-0.53395-0.16754-0.64989-0.19752l-0.0339-9e-3 0.0226-0.0476c0.0345-0.0725 0.0579-0.15643 0.0634-0.22767 3e-3 -0.0354 8e-3 -0.0663 0.0118-0.0686 4e-3 -2e-3 0.0823 0.0186 0.17445 0.0464 1.1335 0.34205 2.2294 0.85732 3.2062 1.5074 0.22252 0.1481 0.32127 0.21767 0.54157 0.38154 1.4039 1.0442 2.5555 2.3707 3.4063 3.9233 0.17137 0.31273 0.52378 1.0502 0.51476 1.0773-2e-3 5e-3 -0.015-0.0192-0.0299-0.0528z" style="paint-order:stroke markers fill"/>
<path d="m277.59 58.215c0-9e-3 0.0373-0.15484 0.0828-0.32441 0.11655-0.43394 0.26611-1.2187 0.33611-1.7635 0.0736-0.57322 0.0844-2.2185 0.018-2.7616-0.3163-2.5878-1.2136-4.7384-2.79-6.6866-0.38917-0.48098-1.366-1.4527-1.8181-1.8085-0.87261-0.68678-1.7671-1.2451-2.6064-1.627l-0.28345-0.12896 0.38034-8e-4c0.49895-1e-3 1.0232-0.0496 1.6536-0.15277 3.7407-0.61222 6.9279-2.9768 8.5994-6.3798 0.72231-1.4706 1.0955-2.906 1.1903-4.5787 0.019-0.33545 0.0402-0.61548 0.047-0.62229 7e-3 -7e-3 0.13118 0.1858 0.2764 0.42801 1.6626 2.7732 2.5948 5.6984 2.8542 8.9567 0.081 1.018 0.0427 2.6753-0.0872 3.7703-0.62185 5.2403-3.2692 10.031-7.3568 13.315-0.42321 0.3399-0.4961 0.3936-0.4961 0.36547z" style="paint-order:stroke markers fill"/>
<path d="m270.13 42.631c0-7e-3 0.0502-0.0375 0.11162-0.0676 0.29028-0.14197 0.67931-0.44806 0.90537-0.71235 0.37841-0.4424 0.61681-0.94936 0.7216-1.5345 0.0492-0.27502 0.0492-0.7422 0-1.0172-0.1-0.55825-0.33821-1.0816-0.67087-1.4737-0.0777-0.0916-0.0873-0.1092-0.0557-0.10249 0.0559 0.0119 0.28719 0.0381 0.55071 0.0625 0.35224 0.0326 1.3654 0.0273 1.7281-9e-3 0.89376-0.0895 1.6175-0.24388 2.4108-0.51422 1.4501-0.49418 2.7453-1.2936 3.846-2.374 0.87696-0.86072 1.5015-1.7259 2.0471-2.836 0.0983-0.20009 0.17883-0.35264 0.17885-0.339 1.2e-4 0.0924-0.0376 0.62986-0.0586 0.83509-0.29849 2.9145-1.7148 5.5865-3.9594 7.4695-1.8477 1.5501-4.1075 2.4516-6.5399 2.6089-0.30912 0.02-1.2157 0.0231-1.2157 4e-3z" style="paint-order:stroke markers fill"/>
<path d="m272.07 37.341c-0.40963-0.0248-1.0311-0.089-1.0969-0.1132-0.0146-5e-3 0.0136-0.0471 0.0832-0.12342 0.18185-0.19926 0.31383-0.45654 0.36752-0.71648 0.0495-0.2395 0.0288-0.58879-0.0477-0.80377-0.0143-0.0401-0.023-0.0758-0.0194-0.0794 4e-3 -4e-3 0.10599 0.0123 0.22755 0.0354 0.66917 0.12702 1.0998 0.1653 1.8664 0.16594 0.62767 5.3e-4 0.82877-0.0107 1.3312-0.0744 1.5455-0.19597 3.1019-0.78634 4.3904-1.6654 0.55583-0.37918 0.95927-0.71459 1.4676-1.2201 0.21146-0.21029 0.38447-0.37766 0.38447-0.37194 0 6e-3 -0.058 0.10693-0.12878 0.2249-0.67883 1.1306-1.6057 2.1369-2.6824 2.9121-1.3796 0.9933-3.0278 1.6162-4.7377 1.7905-0.40893 0.0417-1.0636 0.06-1.4056 0.0392z" style="paint-order:stroke markers fill"/>
<path d="m272.99 35.243c-0.0409-3e-3 -0.17859-0.0143-0.30592-0.0242-0.23293-0.0181-0.70802-0.0756-0.75036-0.0908-0.0133-5e-3 0.0383-0.0465 0.12382-0.1002 0.35789-0.2247 0.61637-0.51206 0.80113-0.89068 0.1904-0.39018 0.26131-0.78819 0.21399-1.2011-0.0219-0.19082-0.0853-0.43459-0.15512-0.59607-0.0315-0.0729-0.0483-0.12906-0.0372-0.12482 0.0111 4e-3 0.14003 0.0347 0.2866 0.0676 2.6654 0.5994 5.4274 0.26934 7.8679-0.94022 0.17262-0.0856 0.31596-0.15346 0.31852-0.1509 8e-3 8e-3 -0.29494 0.40051-0.48528 0.62973-0.22995 0.27692-0.86311 0.91002-1.1395 1.1394-1.574 1.3061-3.3459 2.0496-5.3661 2.2514-0.23918 0.0239-1.1978 0.0455-1.3725 0.0309z" style="paint-order:stroke markers fill"/>
<path d="m275.14 32.092c-0.50221-0.0287-1.1139-0.10752-1.5843-0.20412-0.37277-0.0765-0.53264-0.11433-0.53264-0.12588 0-5e-3 0.0325-0.033 0.0723-0.0615 0.0911-0.0654 0.26968-0.24829 0.35851-0.36712 0.0374-0.05 0.1046-0.16554 0.14934-0.2567 0.19793-0.40332 0.23266-0.87057 0.0969-1.3036-0.0259-0.0825-0.0448-0.1523-0.042-0.15505 3e-3 -3e-3 0.21633 0.0655 0.47462 0.1517 1.3799 0.4605 2.8053 0.76923 4.1986 0.90941 0.77218 0.0777 1.6749 0.1164 2.3482 0.1007l0.43822-0.0102-0.12403 0.0671c-0.19683 0.10652-0.58083 0.28588-0.86816 0.40549-1.5578 0.6485-3.3031 0.946-4.9854 0.84982z" style="paint-order:stroke markers fill"/>
<path d="m279.82 30.307c-1.9916-0.0506-3.9609-0.4173-5.8704-1.0931l-0.37207-0.13168 0.11125-0.11496c0.0803-0.083 0.12928-0.15285 0.17607-0.25117 0.0847-0.17804 0.10882-0.28364 0.10883-0.4771l1e-5 -0.15899 0.13265 0.0571c1.9629 0.84469 4.1259 1.5952 6.0485 2.0987 0.23577 0.0617 0.3019 0.0916 0.19026 0.0859-0.0296-2e-3 -0.26582-8e-3 -0.52503-0.0147z" style="paint-order:stroke markers fill"/>
<path d="m281.32 29.945c-0.0482-0.0184-0.32973-0.12391-0.62554-0.23444-1.7637-0.65895-3.5255-1.3801-5.2327-2.1419-0.27332-0.12197-0.54005-0.2407-0.59272-0.26385-0.0527-0.0232-0.0934-0.046-0.0905-0.0506 3e-3 -5e-3 0.0221-0.0122 0.0426-0.0168 0.0573-0.0126 0.26304-0.10214 0.35114-0.15284 0.4243-0.24422 0.74265-0.6409 0.87912-1.0954 0.0682-0.22721 0.0955-0.47101 0.0774-0.6917-6e-3 -0.0769-9e-3 -0.14207-6e-3 -0.1449 6e-3 -6e-3 0.20153 0.11791 0.50267 0.31834 1.6148 1.0747 3.0791 2.3915 4.3251 3.8893 0.1728 0.20773 0.48656 0.60335 0.48656 0.61352 0 0.0119-0.0297 5e-3 -0.11693-0.0287z" style="paint-order:stroke markers fill"/>
<path d="m281.69 29.532c-0.21263-0.2807-0.6512-0.79996-1.0043-1.1891-0.24762-0.27288-0.94801-0.97912-1.2166-1.2268-0.99037-0.9131-1.9235-1.6236-3.1444-2.3941-0.0261-0.0165-0.023-0.0189 0.0994-0.081 0.70822-0.35916 1.1209-1.1297 1.032-1.9269-7e-3 -0.0598-0.022-0.15033-0.0342-0.20119-0.0121-0.0509-0.021-0.0935-0.0197-0.0948 6e-3 -6e-3 0.27645 0.20739 0.47561 0.37381 1.1958 0.99919 2.1726 2.2407 2.8634 3.6392 0.35395 0.71652 0.61634 1.4249 0.81442 2.1986 0.0855 0.3338 0.21986 0.98978 0.20225 0.98711-2e-3 -2.6e-4 -0.0329-0.0385-0.068-0.0848z" style="paint-order:stroke markers fill"/>
<path d="m282.15 29.161c-4e-3 -0.0161-0.0257-0.11407-0.048-0.21775-0.59226-2.7526-2.1563-5.1941-4.4143-6.8907-0.12569-0.0944-0.23013-0.17646-0.23208-0.18226-2e-3 -6e-3 0.0401-0.0222 0.0935-0.0364 0.5168-0.13742 0.96145-0.55636 1.1316-1.0662 0.0628-0.18814 0.0854-0.32784 0.0868-0.53618l1e-3 -0.18888 0.076 0.0656c0.61268 0.52862 1.1195 1.0752 1.5718 1.6952 1.001 1.372 1.6313 2.9964 1.8182 4.6857 0.0453 0.40948 0.0534 0.57573 0.0531 1.0874-3.7e-4 0.53829-0.0132 0.75882-0.0704 1.2102-0.0389 0.30749-0.0578 0.412-0.0675 0.37418z" style="paint-order:stroke markers fill"/>
<path d="m282.73 28.284c0.0992-1.5706-0.13589-3.0799-0.70158-4.5038-0.63751-1.6047-1.6924-3.0505-3.0126-4.1293l-0.16001-0.13075 0.0372-0.017c0.22755-0.10363 0.33473-0.17086 0.46651-0.29259 0.24861-0.22965 0.4005-0.5353 0.45011-0.90571l9e-3 -0.0693 0.14031 0.12654c0.20501 0.18488 0.60888 0.59412 0.78224 0.79262 1.2996 1.4881 2.0986 3.2634 2.3452 5.2111 0.0558 0.44031 0.0645 0.60115 0.0645 1.1938 0 0.44969-4e-3 0.61311-0.0206 0.78928-0.0535 0.57664-0.13306 1.0546-0.26052 1.5645-0.0545 0.21783-0.13185 0.48929-0.14236 0.4993-3e-3 3e-3 -2e-3 -0.0547 2e-3 -0.12862z" style="paint-order:stroke markers fill"/>
<path d="m282.75 29.688c0.13714-0.32576 0.21082-0.5106 0.27664-0.694 0.52421-1.4608 0.70594-3.0439 0.52837-4.6028-0.20294-1.7816-0.89352-3.5101-1.9726-4.9374-0.30452-0.40279-0.54684-0.68278-0.92751-1.0717l-0.18303-0.18699 0.16536 0.0134c0.24334 0.0197 0.70358 0.0148 0.89297-9e-3 1.7449-0.22339 3.1356-1.516 3.4714-3.2266 0.0418-0.21279 0.0757-0.50478 0.0757-0.65102v-0.083l0.0756 0.10658c0.0416 0.0586 0.15208 0.22936 0.24559 0.37943 0.92505 1.4846 1.483 3.1027 1.6707 4.8452 0.09 0.83556 0.0745 1.8542-0.0412 2.7037-0.38266 2.8103-1.807 5.388-3.9734 7.1906-0.27683 0.23036-0.32086 0.26276-0.30461 0.22417z" style="paint-order:stroke markers fill"/>
<path d="m280.8 17.756c-0.11689-0.01-0.46109-0.0586-0.49246-0.0702-0.0251-9e-3 -0.0144-0.0223 0.0615-0.0745 0.25293-0.1742 0.46507-0.49319 0.53752-0.80825 0.0551-0.23948 0.0579-0.46513 8e-3 -0.66303l-0.0105-0.0418 0.11323 0.0326c0.69293 0.19977 1.4414 0.15491 2.0985-0.12575 0.55252-0.236 1.0173-0.61656 1.3631-1.116 0.0847-0.1224 0.0854-0.12288 0.074-0.0573-0.097 0.55818-0.39746 1.1989-0.76764 1.6371-0.54512 0.64525-1.2402 1.0582-2.0593 1.2235-0.30075 0.0607-0.65966 0.0854-0.92604 0.0636z" style="paint-order:stroke markers fill"/>
<path d="m282 15.276c-0.0273-4e-3 -0.0977-0.0113-0.15658-0.0168-0.0974-9e-3 -0.10406-0.012-0.0744-0.0331 0.272-0.19335 0.43239-0.42311 0.50406-0.72204 0.0179-0.0749 0.0327-0.18226 0.0328-0.23867l1.2e-4 -0.10256 0.0786 0.024c0.0432 0.0132 0.1604 0.0405 0.26045 0.0607 0.26381 0.0532 0.7299 0.0528 0.99923-1e-3 0.18546-0.037 0.49241-0.13088 0.58549-0.17902 0.0259-0.0134 0.0501-0.0215 0.0537-0.0179 4e-3 4e-3 -0.0341 0.0655-0.0837 0.13765-0.46024 0.66848-1.1601 1.0554-1.9681 1.0882-0.10005 4e-3 -0.20423 4e-3 -0.23151 5.3e-4z" style="paint-order:stroke markers fill"/>
<path d="m283.03 13.832c-0.16357-0.0122-0.22982-0.0206-0.34106-0.0431-0.0707-0.0143-0.1447-0.0329-0.22409-0.0561l-0.0236-7e-3 0.026-0.0336c0.0344-0.0443 0.0516-0.0719 0.0794-0.12736 0.0252-0.0502 0.0508-0.12286 0.0619-0.17539l7e-3 -0.0335 0.0707 0.0341c0.25111 0.12111 0.52947 0.21374 0.81281 0.27049 0.11333 0.0227 0.29908 0.0498 0.34153 0.0498 0.0246 0 0.0128 6e-3 -0.0476 0.0246-0.14407 0.0441-0.29195 0.0733-0.45104 0.0891-0.0605 6e-3 -0.26734 0.0113-0.31212 8e-3z" style="paint-order:stroke markers fill"/>
<path d="m283.09 13.069c-0.10806-0.0429-0.219-0.0939-0.3147-0.14491-0.0165-9e-3 -0.0198-0.0111-0.0181-0.0125 1e-3 -1e-3 7e-3 -9e-3 0.0129-0.0177 6e-3 -9e-3 0.0113-0.016 0.0119-0.016 6.3e-4 -3e-5 0.0148 9e-3 0.0314 0.0195 0.0859 0.0553 0.18937 0.11766 0.278 0.16737 0.0117 7e-3 0.0202 0.0118 0.019 0.0117-1e-3 -7e-5 -0.0104-3e-3 -0.0205-7e-3z" style="paint-order:stroke markers fill"/>
<path d="m283.67 12.603c-0.127-0.08-0.27321-0.17689-0.37615-0.24928l-0.0224-0.0158 0.0182-0.019c0.01-0.0105 0.0245-0.0273 0.0322-0.0374 0.0123-0.0161 0.0146-0.0179 0.0189-0.0146 0.0249 0.0194 0.189 0.17113 0.30155 0.27881 0.0947 0.0906 0.10773 0.10361 0.10362 0.10344-2e-3 -6e-5 -0.0357-0.0208-0.0759-0.0462z" style="paint-order:stroke markers fill"/>
<path d="m284.08 12.34c-0.15249-0.14843-0.27225-0.26136-0.3838-0.36189l-0.0645-0.0582 0.0298-0.0311c0.0164-0.0171 0.0363-0.0405 0.0444-0.052 8e-3 -0.0115 0.0154-0.0209 0.0164-0.0209 2e-3 -1.8e-4 0.0701 0.0796 0.11492 0.1355 0.0583 0.0727 0.10942 0.14176 0.1659 0.22393 0.043 0.0626 0.14188 0.22128 0.1393 0.2236-5e-4 5.3e-4 -0.0285-0.0261-0.0623-0.0589z" style="paint-order:stroke markers fill"/>
<path d="m285.07 12.669c-0.0237-0.50043-0.17959-0.99468-0.44813-1.4212-0.0193-0.0307-0.0453-0.0703-0.0578-0.0881-0.0124-0.0177-0.022-0.0328-0.0211-0.0335 8.2e-4 -7.9e-4 0.0201-5e-3 0.0428-0.0106 0.23657-0.0538 0.44726-0.19975 0.58961-0.40836l0.0238-0.0349 7e-3 0.0159c0.0939 0.21905 0.15166 0.45196 0.17623 0.71047 8e-3 0.0799 6e-3 0.29873-2e-3 0.38241-0.03 0.29418-0.10469 0.55605-0.22996 0.80591-0.0259 0.0516-0.071 0.13437-0.0763 0.13983-5.8e-4 5.3e-4 -2e-3 -0.0254-4e-3 -0.0579z" style="paint-order:stroke markers fill"/>
<path d="m285.47 12.973c0-2e-3 0.0222-0.0444 0.0494-0.0935 0.15869-0.28689 0.26428-0.61559 0.31154-0.96981 0.0184-0.13773 0.021-0.49535 5e-3 -0.62839-0.0378-0.30683-0.11316-0.57644-0.23664-0.84669-0.0164-0.0359-0.0284-0.0668-0.0267-0.0685 2e-3 -2e-3 0.0381-7e-3 0.0807-0.0116 0.19052-0.0208 0.36696-0.0739 0.53644-0.16134 0.36271-0.18712 0.629-0.50732 0.74769-0.89903l0.0272-0.0897 0.0421 0.12687c0.0693 0.20895 0.11102 0.39337 0.1392 0.61469 0.0205 0.16103 0.0206 0.51586 1.5e-4 0.67799-0.0635 0.50382-0.22883 0.94316-0.51035 1.356-0.22082 0.32384-0.53504 0.62348-0.88204 0.84115-0.0887 0.0556-0.2832 0.15996-0.2832 0.1519z" style="paint-order:stroke markers fill"/>
<path d="m286 13.208c0.53643-0.33615 0.95945-0.79893 1.2458-1.3628 0.25211-0.49656 0.36956-0.99342 0.36941-1.5628-8e-5 -0.36231-0.0354-0.61913-0.1318-0.95911-0.0463-0.16325-0.14719-0.42672-0.21354-0.55765-0.0342-0.0675-0.0371-0.0816-0.015-0.0731 0.0151 6e-3 0.10317 0.027 0.19576 0.0472 0.14376 0.0313 0.21787 0.0366 0.50735 0.0363 0.38292-3.9e-4 0.53456-0.0241 0.8443-0.1319 0.3854-0.13415 0.67621-0.31829 0.97581-0.61789 0.33753-0.33753 0.54307-0.68608 0.66863-1.1338l0.0371-0.13229 0.0439 0.14299c0.20386 0.66333 0.25843 1.4605 0.14868 2.1721-0.30505 1.9779-1.77 3.5877-3.7088 4.0756-0.3239 0.0815-0.79338 0.14937-1.0337 0.14941l-0.0811 2e-5z" style="paint-order:stroke markers fill"/>
<path d="m287.94 13.978c-0.21569-0.0163-0.61563-0.0613-0.80202-0.0902-0.26555-0.0412-0.71541-0.13153-0.7326-0.14714-7e-3 -7e-3 0.0304-0.0166 0.0838-0.0222 0.0534-6e-3 0.1962-0.0295 0.31738-0.0531 0.85007-0.16575 1.6761-0.55173 2.3737-1.1092 0.23084-0.18445 0.61917-0.57297 0.80821-0.80857 0.66263-0.82588 1.0637-1.8018 1.1859-2.8856 0.0293-0.25993 0.0249-0.87325-8e-3 -1.1493-0.0536-0.44619-0.1642-0.91062-0.30826-1.2942-0.0361-0.096-0.0634-0.17673-0.0607-0.1794 3e-3 -3e-3 0.0902 0.0277 0.19451 0.0675 0.42714 0.16288 0.86765 0.2681 1.3223 0.31583 0.35287 0.0371 0.92053 0.0257 1.265-0.0254 1.6764-0.24845 3.1029-1.2798 3.8618-2.792l0.11044-0.22006 0.0278 0.24486c0.3275 2.8874-0.7429 5.7819-2.8568 7.725-1.4874 1.3672-3.2656 2.1721-5.2897 2.3942-0.22287 0.0245-1.2808 0.045-1.4924 0.029z" style="paint-order:stroke markers fill"/>
<path d="m292.49 6.1735c-0.0273-4e-3 -0.12031-0.0148-0.20671-0.0245-0.32801-0.0368-0.77971-0.14647-1.088-0.2642-0.0746-0.0285-0.1357-0.058-0.1357-0.0656 0-8e-3 0.0279-0.0228 0.062-0.0337 0.11976-0.0384 0.37765-0.18155 0.51972-0.2885 0.41005-0.30867 0.68919-0.76652 0.78165-1.2821 0.0206-0.11471 0.0268-0.22344 0.0228-0.40023-5e-3 -0.24081-5e-3 -0.24256 0.0282-0.22068 0.31541 0.20698 0.87016 0.43461 1.2904 0.52946 0.41489 0.0937 0.99699 0.12584 1.388 0.0768 0.63693-0.08 1.2192-0.28632 1.7497-0.62009 0.0927-0.0583 0.17082-0.10372 0.17366-0.10093 0.0101 0.01-0.15025 0.31386-0.25663 0.48633-0.25244 0.40928-0.66141 0.87426-1.0301 1.1712-0.66261 0.53364-1.4255 0.86886-2.2738 0.99915-0.20478 0.0315-0.88942 0.0566-1.0253 0.0377z" style="paint-order:stroke markers fill"/>
<path d="m294.48 3.7607c-0.60499-0.0357-1.1801-0.21315-1.697-0.52355-0.0666-0.04-0.24392-0.15666-0.24392-0.1605 0-9e-4 0.02-0.0117 0.0444-0.024 0.19978-0.10041 0.34995-0.27254 0.42665-0.48906l0.0149-0.0421 0.0474 0.0373c0.46669 0.36738 0.98035 0.6216 1.544 0.76414 0.34124 0.0863 0.65239 0.12493 1.0087 0.12521 0.22146 1.8e-4 0.39291-0.012 0.60296-0.0429 0.0315-5e-3 0.058-8e-3 0.059-7e-3 1e-3 9.6e-4 -0.0317 0.0169-0.0726 0.0355-0.4224 0.19183-0.86833 0.30102-1.3356 0.32705-0.0877 5e-3 -0.31355 5e-3 -0.39894-3.7e-4z" style="paint-order:stroke markers fill"/>
<path d="m295.95 2.7785c-0.62543-0.01-1.2503-0.18342-1.8013-0.49987-0.10776-0.0619-0.28355-0.17565-0.28144-0.18215 5.3e-4 -1e-3 0.0224-9e-3 0.0488-0.0164 0.24177-0.0695 0.45243-0.22371 0.59215-0.43347 0.0339-0.051 0.0858-0.15142 0.10665-0.20671 9e-3 -0.0227 0.0162-0.0421 0.0169-0.0429 8e-4 -8.7e-4 0.0195 0.015 0.0417 0.0353 0.57779 0.52793 1.3033 0.96142 2.0566 1.2289l0.0896 0.0318-0.0772 0.0153c-0.19999 0.0396-0.40876 0.0633-0.59193 0.0672-0.0512 1e-3 -0.10511 2e-3 -0.11989 3e-3 -0.0148 5.3e-4 -0.0511 5.5e-4 -0.0806 8e-5z" style="paint-order:stroke markers fill"/>
<path d="m296.64 2.1377c-0.60756-0.25087-1.1513-0.59182-1.6385-1.0274-0.0378-0.0338-0.0686-0.063-0.0686-0.0648 6e-5 -2e-3 0.0209-0.0149 0.0463-0.029 0.13561-0.0751 0.26478-0.20926 0.33455-0.34749 0.0146-0.0289 0.0188-0.0334 0.025-0.0267 4e-3 4e-3 0.0386 0.0449 0.0767 0.0899 0.34297 0.40515 0.7394 0.83663 1.1508 1.2525 0.10899 0.11018 0.19581 0.20026 0.19294 0.20018-3e-3 -8e-5 -0.0565-0.0213-0.11922-0.0472z" style="paint-order:stroke markers fill"/>
<path d="m296.56 1.3219c-0.25926-0.27407-0.43627-0.46894-0.65264-0.71848-0.15017-0.17319-0.3098-0.36236-0.3098-0.36712 0-2e-3 9e-3 -8e-3 0.0196-0.0132 0.0543-0.0286 0.13529-0.0903 0.1619-0.12331 8e-3 -0.01 0.0136-0.0137 0.0161-0.011 0.0233 0.0251 0.3081 0.43719 0.44139 0.63872 0.18244 0.27586 0.46564 0.7282 0.45966 0.73418-1e-3 1e-3 -0.0624-0.0617-0.13616-0.13972z" style="paint-order:stroke markers fill"/>
<path d="m297.5 1.5108c-0.23476-0.62779-0.54904-1.2551-0.90883-1.814-0.0163-0.0254-0.0297-0.0471-0.0297-0.0483 0-1e-3 0.0109-5e-3 0.0241-7e-3 0.0133-3e-3 0.0419-0.0112 0.0636-0.0182 0.13452-0.0436 0.25087-0.11985 0.3473-0.22766 0.02-0.0223 0.0211-0.0231 0.0252-0.0175 6e-3 8e-3 0.075 0.15233 0.10557 0.22065 0.2377 0.53191 0.37225 1.0976 0.40183 1.6896 5e-3 0.0907 7e-3 0.29327 4e-3 0.29902-2e-3 4e-3 -0.01-0.0144-0.0331-0.0762z" style="paint-order:stroke markers fill"/>
<path d="m297.98 1.5928c0.0136-0.81265-0.16471-1.6112-0.52396-2.3471l-0.053-0.10852 0.0131-1e-5c0.0359-4e-5 0.15179-0.0268 0.21363-0.0494 0.051-0.0186 0.14483-0.0657 0.19017-0.0954 0.10148-0.0665 0.19712-0.1596 0.26221-0.25526 0.0112-0.0165 0.0215-0.0299 0.0229-0.0299 3e-3 0 0.0429 0.1061 0.0725 0.19431 0.0972 0.28942 0.15533 0.57493 0.18253 0.8971 9e-3 0.10717 0.0104 0.4252 2e-3 0.52917-0.0241 0.30572-0.0722 0.56184-0.15795 0.84103-0.0523 0.17028-0.12849 0.36343-0.20226 0.51289l-0.0245 0.0496z" style="paint-order:stroke markers fill"/>
<path d="m298.59 1.4631c2e-3 -4e-3 0.0178-0.0535 0.0361-0.10951 0.20317-0.62477 0.25393-1.306 0.14573-1.9555-0.0584-0.35037-0.16259-0.69626-0.30673-1.0179-0.0195-0.0436-0.0347-0.0801-0.0336-0.0811 1e-3 -1e-3 0.0252-6e-3 0.0536-0.0115 0.19638-0.0366 0.3904-0.15799 0.50438-0.31552l0.0123-0.0171 0.025 0.0638c0.0398 0.10158 0.10217 0.29471 0.131 0.40584 0.18535 0.71463 0.15094 1.4633-0.0992 2.1574-0.10144 0.28151-0.22717 0.53026-0.39821 0.78782-0.0604 0.0909-0.079 0.11562-0.0704 0.0932z" style="paint-order:stroke markers fill"/>
<path d="m298.53 2.5555c-0.0546-3e-3 -0.12091-6e-3 -0.14742-7e-3l-0.0482-1e-3 0.1191-0.0852c0.36726-0.26267 0.66407-0.55139 0.92815-0.90288 0.48054-0.63956 0.76066-1.3774 0.8318-2.1911 0.0129-0.14799 0.0129-0.51979-1e-4 -0.66972-0.0208-0.24067-0.0643-0.4982-0.12064-0.71454-0.0159-0.061-0.0276-0.1123-0.0259-0.11393 2e-3 -2e-3 0.0472 0.0239 0.10126 0.0567 0.38578 0.23412 0.83288 0.38965 1.3054 0.45413 0.16084 0.0219 0.5232 0.0306 0.69198 0.0166 0.82366-0.0686 1.569-0.41902 2.1403-1.0063 0.0525-0.054 0.11298-0.11857 0.13436-0.1435l0.0389-0.0453v0.0254c0 0.0443-0.0241 0.28378-0.0416 0.41253-0.13134 0.97021-0.51703 1.8986-1.1146 2.683-0.26618 0.34939-0.62118 0.71305-0.96437 0.98788-0.79061 0.63314-1.7354 1.0444-2.7337 1.1901-0.36982 0.0539-0.7612 0.0733-1.0947 0.0541z" style="paint-order:stroke markers fill"/>
<path d="m301.7-2.0549c-0.0113-1e-3 -0.0494-5e-3 -0.0848-8e-3 -0.48783-0.0463-0.96875-0.2248-1.3824-0.51306l-0.0552-0.0385 0.0473-0.0102c0.27125-0.0584 0.52077-0.23507 0.66929-0.47402 0.0365-0.0587 0.0801-0.15018 0.099-0.20786 8e-3 -0.0233 0.0159-0.0423 0.0183-0.0424 2e-3 -4e-5 0.0142 9e-3 0.0263 0.0196 0.0844 0.0755 0.27301 0.20926 0.40459 0.28705 0.12916 0.0764 0.30781 0.16113 0.45646 0.21658 0.59216 0.22091 1.2502 0.24137 1.855 0.0577 0.038-0.0115 0.0703-0.0196 0.072-0.018 8e-3 8e-3 -0.19066 0.16449-0.31344 0.24642-0.41763 0.27867-0.88082 0.43964-1.3886 0.48257-0.0635 5e-3 -0.37393 7e-3 -0.42387 2e-3z" style="paint-order:stroke markers fill"/>
<path d="m302.56-3.1215c-0.48871-0.0717-0.93533-0.28303-1.2998-0.61496-0.0122-0.0112-0.0223-0.0205-0.0223-0.0208 0-2.6e-4 0.0104-7e-3 0.023-0.0159 0.0361-0.0242 0.0678-0.0507 0.0964-0.0804l0.0153-0.0159 0.0478 0.0474c0.0496 0.0492 0.0833 0.0807 0.12907 0.12067 0.2994 0.26158 0.65091 0.45781 1.0296 0.57476 0.0185 6e-3 0.0343 0.0106 0.0351 0.0109 5e-3 2e-3 -0.0162-2.9e-4 -0.0541-6e-3z" style="paint-order:stroke markers fill"/>
<path d="m303.34-3.4523c-0.5215-0.0183-1.012-0.19969-1.4188-0.52479l-0.0245-0.0196 0.0111-4e-3c0.14901-0.054 0.27837-0.15391 0.36925-0.28522l0.0154-0.0223 0.054 0.0534c0.32158 0.31779 0.70314 0.56125 1.1299 0.72095 0.0478 0.0179 0.13646 0.0481 0.17668 0.0601l0.0268 8e-3 -0.0113 1e-3c-0.0812 0.01-0.23397 0.0154-0.32861 0.0121z" style="paint-order:stroke markers fill"/>
<path d="m303.62-3.9623c-0.31291-0.12014-0.58566-0.28332-0.83302-0.49839-0.0533-0.0464-0.13882-0.12775-0.13633-0.12978 5.3e-4 -4.2e-4 0.0101-6e-3 0.0214-0.0116 0.0583-0.0308 0.12277-0.0816 0.16798-0.13236l0.0199-0.0223 0.0341 0.0426c0.21285 0.26577 0.46431 0.52031 0.71888 0.72767 0.0451 0.0367 0.0459 0.0374 0.0432 0.0373-1e-3 -4e-5 -0.0173-6e-3 -0.0361-0.0132z" style="paint-order:stroke markers fill"/>
<path d="m304.34-4.3952c-0.12755-0.17263-0.27974-0.38916-0.4147-0.59-0.0601-0.0895-0.17289-0.26156-0.17188-0.26229 2.5e-4 -1.7e-4 9e-3 -2e-3 0.0195-5e-3 0.0811-0.0206 0.16024-0.0589 0.23013-0.11126l0.0245-0.0184 0.0121 0.0286c0.10637 0.25049 0.19661 0.51415 0.26595 0.77698 0.0177 0.0672 0.0492 0.19759 0.048 0.19876-2.6e-4 2.6e-4 -6e-3 -8e-3 -0.0136-0.0173z" style="paint-order:stroke markers fill"/>
<path d="m304.76-4.6237c-0.079-0.31518-0.1852-0.62935-0.31363-0.92798l-0.0303-0.0705 0.0224-6e-3c0.0772-0.0224 0.16701-0.0707 0.22961-0.12335 0.0102-9e-3 0.0164-0.0126 0.017-0.0109 3e-3 9e-3 0.021 0.0751 0.03 0.11092 0.0845 0.33748 0.10746 0.68726 0.0681 1.0348-7e-3 0.0654-5e-3 0.0661-0.023-7e-3z" style="paint-order:stroke markers fill"/>
<path d="m305.25-4.9404c-1e-5 -0.10394-7.9e-4 -0.13718-6e-3 -0.21657-0.0183-0.29111-0.0742-0.57788-0.1666-0.85432-7e-3 -0.0209-0.0149-0.0441-0.0176-0.0515l-5e-3 -0.0135 3e-3 -6.9e-4c0.0187-4e-3 0.055-0.0135 0.0691-0.0181 0.0422-0.0137 0.0905-0.0359 0.12701-0.0585l0.019-0.0117 2e-3 8e-3c4e-3 0.0115 0.0193 0.078 0.0268 0.11404 0.026 0.12401 0.0411 0.23994 0.0493 0.37953 2e-3 0.0422 2e-3 0.20241 3e-5 0.24409-0.0104 0.17576-0.0323 0.32098-0.0721 0.47851-7e-3 0.0284-0.0286 0.10617-0.0296 0.10712-1.4e-4 1.3e-4 -2.5e-4 -0.0476-2.5e-4 -0.10597z" style="paint-order:stroke markers fill"/>
<path d="m305.8-5.6784c-6e-3 -0.11878-0.017-0.22123-0.0349-0.33073-0.0233-0.14321-0.06-0.29435-0.10449-0.4298-3e-3 -0.0104-6e-3 -0.0193-5e-3 -0.0197 5.3e-4 -4.2e-4 5e-3 -2e-3 0.0102-4e-3 0.0137-5e-3 0.03-0.0118 0.0423-0.0175 6e-3 -3e-3 0.0111-5e-3 0.0113-4e-3 2.5e-4 3.9e-4 4e-3 0.014 8e-3 0.0301 0.0666 0.25044 0.0926 0.51922 0.0746 0.77357l-1e-3 0.0176z" style="paint-order:stroke markers fill"/>
<path d="m305.58-3.9835c0-4e-3 0.031-0.0449 0.0688-0.0914 0.1128-0.13861 0.21931-0.30764 0.31119-0.49385 0.13533-0.27426 0.19836-0.46359 0.25884-0.77758 0.0527-0.27355 0.0515-0.74311-3e-3 -1.0136l-7e-3 -0.0363 0.0684 0.0168c0.0376 9e-3 0.13159 0.0198 0.20876 0.0235 0.28679 0.0137 0.54293-0.0671 0.77349-0.24378l0.0774-0.0593-6e-3 0.22077c-7e-3 0.2428-0.0317 0.41539-0.0908 0.62804-0.12611 0.45446-0.35407 0.85078-0.68286 1.1872-0.23861 0.24414-0.45511 0.40182-0.74928 0.54573-0.17266 0.0845-0.22801 0.10724-0.22801 0.0938z" style="paint-order:stroke markers fill"/>
<path d="m306.39-3.3353c-0.0611-6e-3 -0.17423-0.0188-0.2514-0.0293-0.22687-0.0308-0.62618-0.12039-0.54471-0.12214 0.0386-8.2e-4 0.38629-0.14983 0.52105-0.22327 0.28564-0.15568 0.50532-0.31884 0.73537-0.54618 0.61033-0.60313 0.94351-1.3945 0.94755-2.2506 5.3e-4 -0.13344 3e-3 -0.24262 4e-3 -0.24263 2e-3 -1e-5 0.0231 0.0126 0.0475 0.028s0.0881 0.05 0.14143 0.0768c0.6931 0.34848 1.5018 0.35321 2.1951 0.0128 0.39697-0.19489 0.7073-0.46464 0.96265-0.83678l0.0722-0.10524-7e-3 0.0819c-0.0401 0.44333-0.10066 0.74595-0.22224 1.1108-0.50895 1.5275-1.7995 2.6619-3.3854 2.9757-0.26697 0.0528-0.46173 0.0716-0.78928 0.0761-0.17364 2e-3 -0.3657-3.2e-4 -0.42679-6e-3z" style="paint-order:stroke markers fill"/>
<path d="m310.77-1.2336c-0.72408-0.0436-1.2531-0.12281-1.8852-0.28241-0.96405-0.24344-1.9501-0.68177-2.7915-1.2409-0.1438-0.0956-0.25914-0.17603-0.25631-0.17883 3e-3 -3e-3 0.10188 0.0102 0.22012 0.029 0.17735 0.0281 0.29601 0.0343 0.67799 0.0354 0.49585 1e-3 0.64444-0.0125 1.0577-0.0995 1.4334-0.30185 2.6796-1.2574 3.3466-2.566 0.35917-0.70469 0.52211-1.3467 0.54355-2.1417l0.01-0.36094 0.10918 0.10584c0.83441 0.80888 1.8725 1.3015 3.045 1.4448 0.29841 0.0365 0.87412 0.0365 1.1721 1e-4 1.1868-0.14513 2.2513-0.65927 3.0793-1.4873 0.48129-0.4813 0.8443-1.0207 1.126-1.6732l0.0643-0.14883-0.01 0.14056c-0.0162 0.23406-0.0742 0.67076-0.12632 0.95084-0.25476 1.3693-0.83529 2.6899-1.6792 3.8199-0.48365 0.6476-1.1635 1.3277-1.8204 1.8211-1.3816 1.0377-3.011 1.657-4.7583 1.8085-0.20878 0.0181-0.95525 0.0337-1.1245 0.0236z" style="paint-order:stroke markers fill"/>
<path d="m313.42 0.38755c-1.6557-0.12744-3.0763-0.48741-4.4998-1.1402-0.37137-0.1703-1.0873-0.5508-1.0696-0.56849 6e-3 -6e-3 0.14595 0.0326 0.31065 0.0862 0.5923 0.1927 1.192 0.32536 1.8678 0.4132 0.50687 0.0659 1.8012 0.0604 2.316-0.01 2.0627-0.28119 3.8301-1.1056 5.3517-2.4962 0.15276-0.13961 0.40244-0.3915 0.55484-0.55976 1.3995-1.545 2.228-3.3837 2.467-5.4751 0.0437-0.38248 0.0585-1.3792 0.0261-1.7604l-0.0185-0.21784 0.21727 0.18979c0.53998 0.47165 1.121 0.75996 1.8454 0.91568 0.20337 0.0437 0.3186 0.0524 0.71046 0.0537 0.55074 2e-3 0.76824-0.0309 1.2462-0.18719 0.78151-0.25554 1.5034-0.78999 1.9562-1.4483l0.0643-0.0935-0.0152 0.32741c-0.0308 0.66127-0.12199 1.3696-0.25898 2.0112-0.6722 3.1482-2.4799 5.875-5.1206 7.7243-1.732 1.2129-3.7426 1.9557-5.9401 2.1945-0.31012 0.0337-1.7296 0.0625-2.0112 0.0409z" style="paint-order:stroke markers fill"/>
<path d="m316.84 2.3325c-0.78381-0.0531-1.3244-0.11464-1.941-0.22076-2.1041-0.36213-4.1106-1.1238-5.9358-2.2531-0.11982-0.0742-0.21294-0.13971-0.20694-0.14571s0.12122 0.0371 0.25604 0.0958c1.0219 0.44499 2.1945 0.77543 3.3192 0.93534 0.70636 0.10044 0.99337 0.1187 1.8659 0.1187 0.84592 0 1.1491-0.0183 1.789-0.10774 5.0708-0.70904 9.247-4.2931 10.707-9.1888 0.32555-1.0917 0.48955-2.1087 0.5432-3.3687l0.0155-0.36415 0.17799 0.174c0.76463 0.74745 1.7158 1.2145 2.7948 1.3723 0.33415 0.0489 0.99692 0.0485 1.3499-7.2e-4 0.85819-0.11969 1.6995-0.47513 2.3718-1.0021 0.077-0.0603 0.14344-0.0992 0.14769-0.0865 0.021 0.0631-0.22506 1.2494-0.36919 1.7797-0.67185 2.4721-1.8947 4.7506-3.5772 6.665-0.29943 0.34072-0.99982 1.0463-1.3541 1.3641-2.7965 2.5087-6.2905 3.9733-10.079 4.2248-0.31942 0.0212-1.6018 0.027-1.8749 8e-3z" style="paint-order:stroke markers fill"/>
<path d="m330.52-11.055c-0.57497-0.049-1.1878-0.22805-1.6995-0.49665-0.435-0.22832-0.89521-0.57705-1.1866-0.89915l-0.0741-0.0819 0.21727-1e-3c0.38368-2e-3 0.70674-0.0802 1.0416-0.2512 0.50489-0.25781 0.91386-0.70605 1.122-1.2297l0.0268-0.0674 0.076 0.13661c0.10429 0.18753 0.16257 0.27698 0.29587 0.45413 0.54453 0.72363 1.3469 1.2315 2.233 1.4133 0.2894 0.0594 0.41464 0.071 0.76942 0.0714l0.33098 3.2e-4 -0.0328 0.0268c-0.0815 0.0667-0.30327 0.21778-0.44087 0.30041-0.57463 0.34504-1.2177 0.55541-1.8944 0.61974-0.19919 0.0189-0.58878 0.0212-0.78448 5e-3z" style="paint-order:stroke markers fill"/>
<path d="m333.11-12.464c-1.1884-0.0827-2.2467-0.8065-2.7556-1.8847-0.0199-0.0421-0.0356-0.077-0.035-0.0777 5.3e-4 -6.5e-4 0.0222 3e-3 0.0481 7e-3 0.27062 0.0487 0.55637-0.0275 0.75794-0.2023l0.0205-0.0178 4e-3 0.0119c0.0107 0.034 0.0703 0.18281 0.1007 0.25123 0.17717 0.3992 0.42896 0.7706 0.73707 1.0872 0.33002 0.33911 0.74132 0.62275 1.1763 0.8112l0.0413 0.0179-0.0227-4.5e-4c-0.0125-2.4e-4 -0.0451-2e-3 -0.0724-4e-3z" style="paint-order:stroke markers fill"/>
<path d="m332.28-13.641c-0.14172-0.14464-0.31072-0.36614-0.42809-0.56108-0.0891-0.14796-0.17398-0.31965-0.23845-0.48219-0.0271-0.0684-0.0739-0.19855-0.0719-0.1998 5.3e-4 -3.6e-4 0.016-3e-3 0.0341-5e-3 0.0182-3e-3 0.0484-9e-3 0.0672-0.0146l0.0341-0.01 8e-3 0.0294c0.0398 0.14005 0.12551 0.37609 0.1877 0.51718 0.10346 0.23469 0.25916 0.50488 0.41019 0.71179 0.0192 0.0263 0.0343 0.0485 0.0335 0.0493s-0.0173-0.0148-0.0368-0.0346z" style="paint-order:stroke markers fill"/>
<path d="m333.5-13.093c-0.49952-0.34644-0.88812-0.79481-1.1514-1.3285-0.0663-0.13429-0.15842-0.35344-0.15154-0.36032 1e-3 -1e-3 0.0176-2.3e-4 0.0363 2e-3 0.0488 7e-3 0.15293 6e-3 0.20652-2e-3 0.0857-0.0119 0.16504-0.0368 0.24455-0.0767l0.0485-0.0243 5e-3 0.0175c0.16461 0.63769 0.43257 1.2296 0.7944 1.7549 0.0223 0.0324 0.0406 0.0599 0.0406 0.061 0 5e-3 -0.0106-1e-3 -0.0724-0.0441z" style="paint-order:stroke markers fill"/>
<path d="m333.86-13.436c-0.30017-0.45632-0.51645-0.934-0.65991-1.4575-0.01-0.0349-0.0174-0.0646-0.0174-0.066 0-1e-3 0.0266-3e-3 0.0592-2e-3 0.0326 1e-5 0.0717-2e-3 0.087-4e-3 0.0721-9e-3 0.14527-0.0295 0.20728-0.0571 0.0167-7e-3 0.031-0.0129 0.0317-0.0122 7.9e-4 7.2e-4 0.01 0.055 0.0198 0.12062 0.0758 0.48935 0.16765 0.94367 0.28671 1.4184 0.0167 0.0666 0.0298 0.12168 0.029 0.12242-7.9e-4 7.4e-4 -0.0203-0.0274-0.0434-0.0626z" style="paint-order:stroke markers fill"/>
<path d="m334.11-14.536c-0.0294-0.15914-0.0567-0.32102-0.0818-0.48594-0.01-0.0659-0.0316-0.21738-0.031-0.21793 2.6e-4 -2.5e-4 7e-3 -1e-3 0.0139-2e-3 0.013-1e-3 0.0352-4e-3 0.0451-6e-3l5e-3 -9e-4 5.3e-4 8e-3c2.7e-4 4e-3 3e-3 0.0362 6e-3 0.0709 0.0102 0.12382 0.0195 0.2437 0.0284 0.36535 0.01 0.13381 0.0215 0.30289 0.0209 0.30343-1.5e-4 1.6e-4 -3e-3 -0.0156-7e-3 -0.035z" style="paint-order:stroke markers fill"/>
<path d="m334.73-13.196c-3e-5 -6e-3 3e-3 -0.0601 6e-3 -0.11986 0.0186-0.34729 0.022-0.49007 0.022-0.91557 0-0.36204-2e-3 -0.45878-0.0103-0.66942-7e-3 -0.17852-7e-3 -0.16628-1e-3 -0.16435 3e-3 9.6e-4 0.0197 7e-3 0.037 0.0136 0.0645 0.0244 0.1299 0.04 0.20386 0.0485 0.0572 7e-3 0.16269 5e-3 0.21778-4e-3 0.0411-7e-3 0.0944-0.019 0.13143-0.0307 0.0128-4e-3 0.0236-7e-3 0.0241-7e-3 5.3e-4 4.3e-4 -2e-3 0.0231-5e-3 0.0503-0.0727 0.61406-0.27176 1.2073-0.58394 1.7406-0.0136 0.0233-0.0285 0.0483-0.0331 0.0555l-8e-3 0.0132z" style="paint-order:stroke markers fill"/>
<path d="m335.16-13.034c0.1006-0.17186 0.2123-0.39704 0.29327-0.59123 0.18157-0.43542 0.30205-0.90965 0.35091-1.3812 4e-3 -0.0418 8e-3 -0.0764 9e-3 -0.0769 2.6e-4 -4.7e-4 0.0104 3e-3 0.0222 8e-3 0.0764 0.0303 0.16595 0.051 0.2551 0.0592 0.0467 4e-3 0.15784 2e-3 0.19987-4e-3 0.0924-0.0138 0.18039-0.039 0.25177-0.0721 0.0135-6e-3 0.0252-0.0114 0.026-0.0114 2e-3 0-2e-3 0.0226-0.017 0.0882-0.17644 0.76512-0.61909 1.441-1.2514 1.9108-0.0473 0.0352-0.15781 0.11163-0.16128 0.11163-8e-4 0 9e-3 -0.0181 0.022-0.0402z" style="paint-order:stroke markers fill"/>
<path d="m335.62-12.779c0.16574-0.12295 0.3837-0.32756 0.54253-0.50928 0.40697-0.46566 0.69556-1.0326 0.83248-1.6356 0.022-0.0968 0.0453-0.2231 0.056-0.30305l4e-3 -0.0268 0.0179 0.0102c0.0704 0.0403 0.16682 0.0769 0.25175 0.0956 0.14647 0.0322 0.31037 0.0235 0.45822-0.0244 0.0384-0.0124 0.0431-0.0134 0.0431-9e-3 0 0.0103-0.0436 0.17773-0.0624 0.23959-0.0939 0.3093-0.22743 0.59224-0.40686 0.86236-0.37157 0.55942-0.90528 0.98882-1.5337 1.2339-0.0633 0.0247-0.20134 0.0729-0.20821 0.0727-2e-3 -5e-5 5.3e-4 -3e-3 5e-3 -7e-3z" style="paint-order:stroke markers fill"/>
<path d="m336.42-12.618c5e-3 -3e-3 0.0408-0.0242 0.08-0.0465 0.19856-0.1132 0.39457-0.25263 0.58654-0.41722 0.0907-0.0778 0.29711-0.28639 0.38247-0.3866 0.4175-0.49004 0.69417-1.061 0.82173-1.6956 0.0129-0.0643 0.0235-0.12417 0.0236-0.13301 2e-5 -9e-3 1e-3 -0.0161 3e-3 -0.0161 1e-3 0 0.0228 8e-3 0.0477 0.0181 0.10479 0.042 0.22524 0.0617 0.34098 0.0559 0.0643-3e-3 0.13638-0.0136 0.17079-0.0245 0.0134-4e-3 0.0132-3e-3 -0.0224 0.14015-0.24726 0.99598-0.92299 1.8319-1.8463 2.284-0.15745 0.0771-0.28329 0.12861-0.44105 0.18056-0.12435 0.0409-0.16246 0.0516-0.14652 0.0408z" style="paint-order:stroke markers fill"/>
<path d="m337.88-11.177c-0.0225-1e-3 -0.0843-5e-3 -0.13739-8e-3 -0.76959-0.0491-1.5255-0.27743-2.1938-0.66266-0.0898-0.0518-0.24891-0.15046-0.27852-0.17279-0.0114-9e-3 2.6e-4 -9e-3 0.14985-7e-3 0.29437 4e-3 0.55315-0.0203 0.83748-0.078 1.3492-0.27358 2.4644-1.242 2.9225-2.5379 0.0226-0.0641 0.0488-0.14153 0.0581-0.17208l0.0169-0.0555 0.0169 0.0284c0.20322 0.34111 0.4894 0.63546 0.82665 0.85026 0.58029 0.36961 1.2984 0.48707 1.9703 0.32229 0.10824-0.0265 0.26937-0.0789 0.36394-0.11817 0.0346-0.0144 0.0628-0.0242 0.0628-0.0219 0 2e-3 -0.0232 0.0448-0.0516 0.0943-0.39118 0.68276-0.93783 1.2672-1.5883 1.6982-0.73848 0.48923-1.5514 0.76498-2.4555 0.83294-0.0835 6e-3 -0.44619 0.012-0.52034 8e-3z" style="paint-order:stroke markers fill"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="101.21mm" height="66.077mm" version="1.1" viewBox="0 0 101.21 66.077" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<rect transform="translate(-40.11 -85.557)" x="39.361" y="84.559" width="102.57" height="67.883" fill="#fff" stroke="#fc0000" stroke-width=".076"/>
<g transform="translate(-40.11 -85.557)">
<g transform="translate(-222.6 -102.73)">
<path d="m290.76 200.99c0.23897 0.10881 0.47294 0.22844 0.71112 0.33916 0.96647 0.4399 1.8833 0.97407 2.7836 1.5345 1.7141 1.0938 3.2526 2.4274 4.753 3.792 2.0394 1.854 3.7696 3.9665 5.4172 6.166 1.796 2.4517 3.3422 5.0693 4.7851 7.74 1.4129 2.6116 2.5253 5.3648 3.5464 8.148 0.86154 2.4209 1.626 4.8747 2.3834 7.3297 0.48988 1.5675 0.94716 3.1445 1.2767 4.7538 9e-3 0.0217-0.29811 0.14886-0.3071 0.12715-0.11909-0.25623-0.2463-0.50883-0.3573-0.76868-0.53006-1.241-0.91273-2.5394-1.3483-3.8146-0.79597-2.4282-1.5938-4.8563-2.4668-7.2582-1.0234-2.7444-2.1272-5.4614-3.5025-8.052-1.418-2.6459-2.9265-5.2463-4.6713-7.693-1.5841-2.1903-3.2492-4.3296-5.1839-6.2258-1.4403-1.3916-2.9273-2.742-4.5722-3.8913-0.86632-0.59371-1.7525-1.155-2.6607-1.6827-0.22235-0.14171-0.45664-0.27408-0.64658-0.45946-6e-3 -4e-3 0.0542-0.0889 0.0602-0.0846z" fill="#5050dc" style="paint-order:stroke markers fill"/>
<path d="m290.87 200.92c0.1779 0.0806 0.36568 0.12478 0.55748 0.15672 0.69506 0.0741 1.3964 0.0625 2.0946 0.0691 1.2986 0.0158 2.597 0.0365 3.8957 0.0412 1.9038 0.0267 3.805-0.0717 5.7042-0.19057 2.7086-0.18588 5.4146-0.40701 8.1204-0.62991 3.2528-0.26129 6.5009-0.5757 9.7446-0.93175 3.0094-0.33488 6.0106-0.73644 9.0045-1.1883 2.2585-0.34334 4.5109-0.72513 6.7609-1.1198 1.6127-0.28436 3.2233-0.57987 4.834-0.87534 1.113-0.21079 2.2244-0.42969 3.3398-0.62789 0.76676-0.14634 1.5398-0.25849 2.3161-0.34031 0.41442-0.0307 0.21075-9e-3 0.61117-0.0642 8e-3 -2.6e-4 0.014 0.11768 6e-3 0.11807-0.39978 0.11211-0.19791 0.0492-0.60521 0.19004-0.75919 0.23816-1.5269 0.45033-2.3037 0.6233-1.1091 0.26094-2.2236 0.49779-3.341 0.72081-1.6106 0.33502-3.2216 0.6683-4.8349 0.99061-2.2545 0.44834-4.5109 0.88957-6.7794 1.2622-3.0051 0.48032-6.016 0.92869-9.0403 1.2722-3.2502 0.35794-6.5062 0.66073-9.7687 0.88278-2.7078 0.18911-5.4166 0.3703-8.129 0.48243-1.9082 0.066-3.8183 0.10359-5.7268 0.0222-1.2927-0.0575-2.585-0.12461-3.8779-0.17868-0.71125-0.0361-1.4312-0.0551-2.1287-0.21084-0.20839-0.0609-0.42754-0.11968-0.6023-0.25459-0.0156-0.0105 0.13327-0.22987 0.14878-0.21935z" style="paint-order:stroke markers fill"/>
<path d="m347.73 195.51c-0.13067 0.10558-0.26087 0.21172-0.389 0.32043-0.32006 0.27339-0.62534 0.56345-0.93101 0.8528-0.59276 0.57336-1.182 1.1504-1.7767 1.7216-0.92283 0.89032-1.8548 1.771-2.7865 2.6519-1.2227 1.1458-2.3986 2.3402-3.5674 3.5411-1.2517 1.2851-2.4927 2.5806-3.728 3.8816-1.3156 1.375-2.5572 2.8168-3.7577 4.2937-1.145 1.4202-2.2341 2.8843-3.3004 4.3649-1.0204 1.4316-2.0433 2.8616-3.031 4.3164-0.88861 1.3085-1.6887 2.6736-2.4561 4.0565-0.67046 1.2228-1.3027 2.4661-1.913 3.7202-0.49652 1.0104-0.92381 2.052-1.3139 3.1079-0.29235 0.81558-0.55781 1.6406-0.81374 2.4684-0.19838 0.64231-0.38738 1.2876-0.56113 1.9371-0.13811 0.51717-0.25559 1.0396-0.36829 1.5628-0.0797 0.38609-0.16624 0.77066-0.24971 1.1559-0.0562 0.27223-0.11441 0.544-0.18421 0.81308-0.0599 0.19109-0.0985 0.38909-0.21431 0.55498-0.0173 0.0229-0.0345 0.0457-0.0518 0.0686 1.5e-4 2e-3 -0.026 4e-3 -0.0262 2e-3 -0.0154-0.0221-0.0308-0.0442-0.0461-0.0661-0.0833-0.18346-0.0321-0.37923-0.0164-0.57375 0.0378-0.27312 0.0878-0.54414 0.13939-0.81493 0.0702-0.38714 0.13695-0.77494 0.21549-1.1605 0.10659-0.53002 0.21749-1.0594 0.34842-1.584 0.16938-0.65422 0.35253-1.3046 0.5415-1.9533 0.24564-0.83593 0.49532-1.6709 0.77699-2.4954 0.37282-1.0749 0.78528-2.1357 1.2705-3.165 0.59419-1.269 1.2143-2.5257 1.8777-3.7597 0.76089-1.4017 1.5528-2.7873 2.4381-4.1142 0.9795-1.4685 1.9939-2.9126 3.0401-4.3339 1.0826-1.4791 2.1646-2.9595 3.3036-4.3955 1.2054-1.4947 2.4563-2.952 3.8026-4.3211 1.3169-1.3648 2.6506-2.7129 3.9855-4.0598 1.1864-1.1828 2.3828-2.3557 3.6251-3.4794 0.94255-0.85518 1.8935-1.7008 2.8402-2.5514 0.60678-0.54749 1.2126-1.0963 1.8302-1.6314 0.31798-0.27302 0.63784-0.54432 0.97209-0.79709 0.13516-0.10147 0.27053-0.20434 0.41754-0.28806 0.0108-4e-3 0.0682 0.14789 0.0575 0.15197z" style="paint-order:stroke markers fill"/>
<path d="m291.03 200.92c0.0571 0.19348 0.0768 0.39542 0.10051 0.59497 0.0893 0.72837 0.0109 1.4584-0.0835 2.1815-0.2063 1.3833-0.60947 2.7252-1.0341 4.0542-0.60028 1.8187-1.3133 3.597-2.0479 5.3648-0.82233 1.9765-1.7441 3.9086-2.6986 5.824-0.87437 1.7432-1.8212 3.4483-2.799 5.1352-0.81348 1.3885-1.6491 2.7638-2.469 4.1486-0.59018 1.0102-1.1961 2.0108-1.8371 2.9896-0.23632 0.37497-0.50826 0.72519-0.77581 1.0778-4e-3 0.0106-0.15338-0.0415-0.1497-0.0521 0.18272-0.38597 0.36142-0.77448 0.57428-1.1452 0.55401-1.0167 1.1216-2.0258 1.6955-3.0314 0.79116-1.3905 1.572-2.7869 2.3586-4.1799 0.94387-1.6891 1.8784-3.3842 2.7321-5.1212 0.93938-1.9104 1.8524-3.834 2.6963-5.7888 0.75258-1.7524 1.4864-3.5137 2.1338-5.3082 0.46027-1.3016 0.9045-2.613 1.173-3.9702 0.13102-0.70043 0.25503-1.4082 0.24458-2.1236-7e-3 -0.20691-0.0266-0.41709 9e-3 -0.62238-3e-3 -0.0125 0.17511-0.0402 0.17706-0.0276z" style="paint-order:stroke markers fill"/>
<path d="m277.18 232.11c0.24487-0.12718 0.51645-0.18852 0.78204-0.25312 0.82983-0.18298 1.6769-0.26529 2.5215-0.34039 1.3582-0.13407 2.7223-0.1322 4.0852-0.12033 1.9185-5e-3 3.8337 0.10788 5.7448 0.26931 2.1715 0.18473 4.3149 0.58509 6.4442 1.0427 1.8536 0.40269 3.6775 0.9277 5.4859 1.5012 1.3902 0.44253 2.7513 0.97056 4.1047 1.5163 0.98635 0.41016 1.9747 0.81544 2.9634 1.2197 0.75064 0.29979 1.4942 0.61692 2.229 0.95486 0.5505 0.25786 1.0949 0.52876 1.6379 0.80246 0.40403 0.20311 0.80753 0.40702 1.2057 0.62168 0.30082 0.1652 0.59596 0.34141 0.8809 0.53354 0.20193 0.14174 0.40001 0.28875 0.59753 0.43671 0.15374 0.0946 0.26674 0.2264 0.37524 0.3683 0.0577 0.0859 0.0333 0.0397 0.0721 0.13915 3e-3 1e-3 -0.0144 0.0226-0.0157 0.0214-0.10503-5e-3 -0.0539 2e-3 -0.15347-0.0205-0.17268-0.0466-0.33858-0.10057-0.48672-0.20698-0.21035-0.1238-0.41972-0.24947-0.6329-0.36813-0.28869-0.16789-0.5737-0.34271-0.87123-0.49435-0.39959-0.20504-0.80573-0.39638-1.2099-0.59185-0.54402-0.26108-1.0878-0.52293-1.6396-0.7668-0.73533-0.32151-1.4791-0.62207-2.2312-0.90074-0.99984-0.37818-1.9959-0.76661-2.9965-1.1425-1.3548-0.50833-2.7156-1.0016-4.0974-1.43-1.797-0.54763-3.6093-1.045-5.4494-1.4216-2.1087-0.429-4.2287-0.80977-6.3712-1.018-1.8903-0.18117-3.7842-0.31191-5.6798-0.42162-1.3395-0.0583-2.6818-0.0984-4.022-0.038-0.82717 0.0496-1.655 0.10592-2.4765 0.21906-0.2517 0.0403-0.50152 0.0885-0.74881 0.15106-0.0182 3e-3 -0.0658-0.25901-0.0475-0.26242z" style="paint-order:stroke markers fill"/>
<ellipse transform="rotate(22.62)" cx="346.1" cy="73.888" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse transform="rotate(22.62)" cx="345.32" cy="107.8" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse transform="rotate(22.62)" cx="384.8" cy="100.76" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse transform="rotate(22.62)" cx="396.38" cy="46.565" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<g transform="translate(231.28 151.03)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m496.66 409.87v0.71l-0.02 0.68-0.03 0.66-0.04 0.64-0.06 0.62-0.07 0.6-0.09 0.57-0.11 0.56-0.13 0.55-0.15 0.53-0.17 0.51-0.19 0.5-0.21 0.49-0.24 0.48-0.26 0.47-0.14 0.23-0.15 0.23c-1.08 1.61-3.23 3-6.03 3v-0.98c1.89 0 3.7-1.14 4.33-3.17 0.56-1.88 0.59-4.39 0.59-7.43 0-2.57 0-5.15-0.45-7.34-0.7-3.17-3.06-3.94-4.47-3.94-1.59 0-3.72 0.94-4.42 3.8-0.49 2.05-0.49 4.91-0.49 7.48 0 2.55 0 5.21 0.52 7.11 0.73 2.75 2.97 3.49 4.39 3.49v0.98c-8.08 0-8.08-9.51-8.08-12.03 0-2.5 0-11.81 8.08-11.81 8.09 0 8.09 9.31 8.09 11.81z"/></g>
</g>
<g transform="translate(267.87 94.212)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m490.35 420.92v0.35l-0.01 0.03v0.09l-0.01 0.03v0.05l-0.01 0.03v0.02l-0.01 0.03v0.02l-0.02 0.04-0.01 0.04-0.08 0.12-0.09 0.06-0.08 0.02-0.05 0.02h-0.04l-0.03 0.01h-0.03l-0.02 0.01h-0.12l-0.04 0.01h-0.4c-2.23-2.2-5.39-2.23-6.82-2.23v-1.25c0.84 0 3.14 0 5.04 0.97v-17.77c0-1.16 0-1.61-3.48-1.61h-1.31v-1.25c0.62 0.03 4.9 0.14 6.2 0.14 1.08 0 5.47-0.11 6.23-0.14v1.25h-1.32c-3.49 0-3.49 0.45-3.49 1.61z"/></g>
</g>
<g transform="translate(193.98 93.995)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m496.27 405.11h-1.18c-0.1-0.77-0.46-2.83-0.91-3.18-0.27-0.2-2.95-0.2-3.44-0.2h-6.42c3.66 3.23 4.88 4.2 6.97 5.84 2.58 2.07 4.98 4.22 4.98 7.54 0 4.21-3.68 6.79-8.15 6.79-4.32 0-7.25-3.03-7.25-6.23 0-1.78 1.5-1.96 1.86-1.96 0.82 0 1.84 0.6 1.84 1.85 0 0.62-0.25 1.84-2.06 1.84 1.08 2.47 3.45 3.24 5.09 3.24 3.49 0 5.3-2.71 5.3-5.53 0-3.04-2.16-5.44-3.28-6.69l-8.39-8.3c-0.36-0.31-0.36-0.39-0.36-1.36h14.36z"/></g>
</g>
<g transform="translate(177.91 139.86)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m488.2 410.4h0.25l0.25-0.02 0.24-0.03 0.24-0.04 0.23-0.05 0.23-0.06 0.22-0.07 0.21-0.08 0.21-0.1 0.2-0.1 0.2-0.12 0.19-0.12 0.18-0.14 0.17-0.15 0.17-0.16 0.16-0.17 0.15-0.18 0.14-0.19 0.14-0.2 0.13-0.22 0.11-0.22 0.11-0.24 0.1-0.24 0.09-0.26 0.08-0.27 0.07-0.28 0.06-0.29 0.05-0.3 0.04-0.31 0.02-0.32 0.02-0.33 0.01-0.35c0-4.33-2.52-5.61-4.53-5.61-1.39 0-4.47 0.38-5.93 2.44 1.63 0.06 2.02 1.22 2.02 1.95 0 1.11-0.84 1.91-1.92 1.91-0.97 0-1.96-0.59-1.96-2.02 0-3.28 3.63-5.4 7.85-5.4 4.84 0 8.19 3.25 8.19 6.73 0 2.72-2.22 5.44-6.07 6.24 3.66 1.33 4.99 3.93 4.99 6.06 0 2.75-3.17 4.81-7.03 4.81-3.88 0-6.83-1.89-6.83-4.67 0-1.19 0.76-1.84 1.81-1.84 1.08 0 1.77 0.79 1.77 1.76 0 1.02-0.69 1.75-1.77 1.81 1.22 1.55 3.61 1.93 4.91 1.93 1.56 0 3.76-0.77 3.76-3.8 0-1.47-0.48-3.06-1.39-4.14-1.15-1.33-2.12-1.41-3.87-1.5-0.88-0.08-0.94-0.08-1.11-0.11-0.08 0-0.36-0.06-0.36-0.45 0-0.49 0.31-0.49 0.9-0.49z"/></g>
</g>
<g transform="translate(225.58 116.93)" fill="#5050dc">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill="#5050dc" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m483.07 442.17-0.46-0.38-0.46-0.36-0.47-0.35-0.47-0.33-0.47-0.31-0.48-0.29-0.48-0.27-0.48-0.25-0.48-0.22-0.48-0.2-0.24-0.08-0.24-0.09-0.25-0.07-0.24-0.07-0.24-0.06-0.48-0.1-0.24-0.04-0.24-0.02-0.24-0.03-0.24-0.01h-0.24c-1.99 0-3.44 0.84-5.17 1.84-1.46 0.84-3 1.69-4.99 1.69-1.25 0-2.54-0.39-3.64-0.89-1-0.5-2-1.05-2.84-1.75l-2.69-2.19 0.7-0.84c2.44 2.03 5.08 3.53 7.61 3.53 2 0 3.46-0.85 5.19-1.85 1.45-0.84 2.99-1.68 4.99-1.68 1.25 0 2.54 0.39 3.64 0.89 0.98 0.5 1.98 1.04 2.82 1.75l2.71 2.18z"/><path d="m464.83 417.71 0.14 0.01h0.5l0.19 0.01h0.2l0.21 0.01 0.44 0.02 0.23 0.01 0.24 0.01 0.75 0.06 0.53 0.05 0.53 0.07 0.55 0.07 0.54 0.1 0.54 0.11 0.54 0.12 0.26 0.07 0.26 0.08 0.5 0.16 0.24 0.09 0.24 0.1c3.48 1.5 3.73 4.43 3.73 5.12 0 2.2-1.89 4.23-5.33 4.23v-1.09c2.35 0 3.69-1.44 3.69-3.14 0-5.17-7.97-5.17-10.01-5.17h-2.05c1.95 7.56 7.08 8.31 8.37 8.31v1.09c-5.53 0-13.04-4.82-13.04-13.54 0-5.08 2.93-9.02 7.81-9.02 7.12 0 11.31 5.28 11.31 5.88 0 0.29-0.3 0.65-0.59 0.65-0.25 0-0.35-0.11-0.66-0.5-3.94-4.93-9.36-4.93-9.95-4.93-3.89 0-4.35 4.18-4.35 5.78 0 0.59 0.05 2.14 0.8 5.18z"/></g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 247 KiB

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="164.78mm" height="156.08mm" version="1.1" viewBox="0 0 164.78 156.08" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<rect x="-4.5357" y="-7.5595" width="172.36" height="172.36" fill="#fff" stroke="#fc0000" stroke-width=".076"/>
<g transform="translate(-11.849 -14.534)">
<g transform="translate(.37798 -77.863)">
<g transform="rotate(22.62 93.825 170.85)">
<path d="m67.909 111.4c0.15285 0.15806 0.30098 0.31908 0.46294 0.4686 0.69532 0.57384 1.5083 0.98126 2.3115 1.3797 1.4914 0.71788 3.0686 1.2228 4.6544 1.683 2.0616 0.59347 4.1794 0.93422 6.3051 1.1932 2.4261 0.27854 4.8686 0.33413 7.3081 0.32892 2.4817-0.01 4.9545-0.22484 7.4191-0.49712 2.184-0.24192 4.3531-0.59224 6.513-0.99246 1.6727-0.31601 3.3306-0.70268 4.9766-1.1352 1.242-0.32639 2.4642-0.72084 3.6731-1.1528 0.91499-0.32875 1.81-0.70891 2.7095-1.0769 0.64138-0.27075 1.2918-0.51909 1.9358-0.78342 0.38757-0.17948 0.79264-0.30223 1.2101-0.38664 8e-3 -2e-3 0.0314 0.1094 0.0236 0.11106-0.36689 0.24265-0.74728 0.46177-1.1544 0.63102-0.63896 0.29429-1.2706 0.6044-1.9141 0.88886-0.89648 0.40482-1.8019 0.79002-2.7194 1.145-1.218 0.46138-2.4502 0.88427-3.7024 1.2436-1.6561 0.4739-3.324 0.90702-5.0105 1.2599-2.1741 0.45217-4.3623 0.83752-6.5674 1.1061-2.4905 0.28936-4.9911 0.49685-7.5006 0.49193-2.4674-7e-3 -4.938-0.0804-7.387-0.40604-2.1484-0.3078-4.2882-0.69621-6.3626-1.3488-1.5961-0.51409-3.1814-1.0817-4.6614-1.8795-0.80628-0.4553-1.6234-0.92838-2.2563-1.6174-0.14604-0.17744-0.31728-0.3697-0.35303-0.60549-0.0035-6e-3 0.08274-0.0554 0.08623-0.0493z" style="paint-order:stroke markers fill"/>
<path d="m33.608 147.08c0.21985 4e-3 0.43845 0.0128 0.6587 4e-3 0.89743-0.0859 1.7604-0.3727 2.6101-0.65888 1.5622-0.54696 3.0345-1.3052 4.4813-2.1011 1.8774-1.0381 3.6159-2.2947 5.3021-3.6146 1.9125-1.5186 3.6789-3.2063 5.4002-4.935 1.7478-1.7619 3.3444-3.6624 4.8946-5.5976 1.3733-1.7154 2.6593-3.4968 3.9036-5.3071 0.95932-1.4062 1.8582-2.852 2.7163-4.3217 0.64747-1.109 1.2328-2.2522 1.7822-3.4124 0.41453-0.87946 0.77857-1.7811 1.1544-2.6774 0.26207-0.64497 0.5464-1.2805 0.81487-1.9228 0.14713-0.40096 0.34676-0.77418 0.58226-1.129 4e-3 -7e-3 0.0996 0.0551 0.0952 0.0618-0.0879 0.43102-0.20189 0.85494-0.37012 1.2625-0.24372 0.65992-0.47106 1.3258-0.72493 1.982-0.34765 0.92016-0.7155 1.8328-1.1132 2.7325-0.53498 1.1875-1.1073 2.3578-1.7386 3.4974-0.83595 1.5062-1.7091 2.9918-2.6521 4.4339-1.2176 1.8571-2.4924 3.6768-3.8617 5.426-1.5564 1.9656-3.1779 3.8806-4.9559 5.6516-1.7496 1.7398-3.5486 3.4348-5.5105 4.9363-1.7368 1.3015-3.5245 2.5399-5.4527 3.5453-1.4921 0.76507-3.0145 1.4847-4.6252 1.9671-0.89207 0.24818-1.8044 0.49147-2.7391 0.45178-0.22874-0.0222-0.48577-0.0371-0.67778-0.17851-0.0067-2e-3 0.01933-0.0977 0.02611-0.0958z" style="paint-order:stroke markers fill"/>
<path d="m34.468 196.58c0.15828-0.15262 0.31909-0.30098 0.4686-0.46294 0.57383-0.69532 0.98126-1.5083 1.3797-2.3115 0.71789-1.4914 1.2228-3.0686 1.6831-4.6544 0.59347-2.0616 0.93422-4.1794 1.1932-6.3051 0.27854-2.4261 0.33413-4.8686 0.32892-7.3081-0.01-2.4817-0.22484-4.9545-0.49712-7.4191-0.24192-2.184-0.59224-4.3531-0.99246-6.513-0.31601-1.6727-0.70268-3.3306-1.1352-4.9766-0.32639-1.242-0.72084-2.4642-1.1528-3.6731-0.32875-0.91499-0.70891-1.81-1.0769-2.7095-0.27075-0.64137-0.51909-1.2918-0.78342-1.9358-0.17948-0.38756-0.30223-0.79262-0.38664-1.2101-2e-3 -8e-3 0.10939-0.0315 0.11102-0.0236 0.24262 0.36693 0.46177 0.74729 0.63101 1.1544 0.2943 0.63897 0.6044 1.2706 0.88887 1.9141 0.40482 0.89647 0.79002 1.8019 1.145 2.7194 0.46138 1.218 0.88427 2.4502 1.2436 3.7024 0.4739 1.6561 0.90702 3.324 1.2599 5.0106 0.45217 2.1741 0.83751 4.3623 1.1061 6.5674 0.28936 2.4905 0.49685 4.9911 0.49193 7.5006-7e-3 2.4674-0.0804 4.938-0.40604 7.387-0.3078 2.1484-0.69621 4.2882-1.3488 6.3626-0.51409 1.5961-1.0817 3.1814-1.8795 4.6614-0.4553 0.80627-0.92837 1.6234-1.6174 2.2563-0.17744 0.14604-0.36973 0.31726-0.60549 0.35303-6e-3 4e-3 -0.0554-0.0827-0.0493-0.0862z" style="paint-order:stroke markers fill"/>
<path d="m70.13 231.06c4e-3 -0.21984 0.0128-0.43846 4e-3 -0.6587-0.0859-0.89742-0.3727-1.7604-0.65888-2.6101-0.54696-1.5622-1.3052-3.0345-2.1011-4.4813-1.0382-1.8774-2.2947-3.6159-3.6146-5.3021-1.5186-1.9125-3.2063-3.6789-4.935-5.4002-1.7619-1.7478-3.6624-3.3444-5.5976-4.8946-1.7154-1.3733-3.4969-2.6593-5.3071-3.9036-1.4062-0.95931-2.8519-1.8582-4.3217-2.7163-1.109-0.64747-2.2522-1.2328-3.4124-1.7822-0.87945-0.41453-1.7811-0.77857-2.6774-1.1544-0.64497-0.26207-1.2805-0.5464-1.9228-0.81487-0.40095-0.14714-0.77417-0.34676-1.129-0.58226-7e-3 -4e-3 0.0551-0.0996 0.0618-0.0952 0.43102 0.0879 0.85493 0.20189 1.2625 0.37012 0.65992 0.24371 1.3258 0.47106 1.982 0.72492 0.92015 0.34765 1.8328 0.7155 2.7325 1.1132 1.1875 0.53498 2.3578 1.1073 3.4974 1.7386 1.5062 0.83596 2.9918 1.7091 4.4339 2.6521 1.8571 1.2176 3.6768 2.4924 5.426 3.8617 1.9656 1.5564 3.8806 3.1779 5.6516 4.9559 1.7398 1.7496 3.4348 3.5486 4.9363 5.5105 1.3015 1.7368 2.5399 3.5245 3.5453 5.4527 0.76508 1.4921 1.4847 3.0145 1.9671 4.6252 0.24818 0.89206 0.49147 1.8044 0.45179 2.7391-0.0222 0.22874-0.0371 0.48578-0.17852 0.67778-1e-3 7e-3 -0.0976-0.0193-0.0958-0.0261z" style="paint-order:stroke markers fill"/>
<path d="m119.73 230.23c-0.15262-0.15828-0.30098-0.31908-0.46293-0.46859-0.69532-0.57384-1.5083-0.98126-2.3115-1.3797-1.4914-0.71788-3.0686-1.2228-4.6544-1.6831-2.0616-0.59346-4.1794-0.93421-6.3051-1.1932-2.4261-0.27855-4.8686-0.33415-7.3081-0.32892-2.4817 0.01-4.9545 0.22483-7.4191 0.49711-2.184 0.24192-4.3531 0.59224-6.513 0.99246-1.6727 0.31601-3.3306 0.70268-4.9766 1.1352-1.242 0.32639-2.4642 0.72084-3.6731 1.1528-0.91498 0.32875-1.81 0.70891-2.7095 1.0769-0.64138 0.27075-1.2918 0.51909-1.9358 0.78343-0.38756 0.17947-0.79262 0.30222-1.2101 0.38664-8e-3 2e-3 -0.0315-0.10939-0.0236-0.11102 0.36693-0.24262 0.74728-0.46177 1.1544-0.63101 0.63896-0.2943 1.2706-0.6044 1.9141-0.88887 0.89647-0.40482 1.8019-0.79002 2.7194-1.145 1.218-0.46139 2.4502-0.88427 3.7024-1.2436 1.6561-0.4739 3.324-0.90702 5.0106-1.2599 2.1741-0.45218 4.3623-0.83751 6.5674-1.1061 2.4905-0.28936 4.9911-0.49685 7.5006-0.49193 2.4674 7e-3 4.938 0.0804 7.387 0.40604 2.1484 0.30781 4.2882 0.69621 6.3626 1.3488 1.5961 0.51408 3.1814 1.0817 4.6614 1.8796 0.80626 0.45528 1.6234 0.92836 2.2563 1.6174 0.14604 0.17745 0.31726 0.36974 0.35304 0.60551 4e-3 6e-3 -0.0827 0.0554-0.0862 0.0493z" style="paint-order:stroke markers fill"/>
<path d="m154.12 194.62c-0.21984-4e-3 -0.43845-0.0128-0.65868-4e-3 -0.89743 0.0859-1.7604 0.37271-2.6101 0.65889-1.5622 0.54696-3.0345 1.3052-4.4813 2.1011-1.8774 1.0382-3.6159 2.2947-5.3021 3.6146-1.9125 1.5186-3.6789 3.2063-5.4002 4.935-1.7478 1.7619-3.3444 3.6624-4.8946 5.5976-1.3733 1.7154-2.6593 3.4969-3.9036 5.3071-0.95932 1.4062-1.8582 2.852-2.7163 4.3217-0.64747 1.1091-1.2328 2.2522-1.7822 3.4124-0.41452 0.87945-0.77856 1.7811-1.1544 2.6774-0.26208 0.64497-0.54641 1.2805-0.81487 1.9228-0.14715 0.40095-0.34677 0.77416-0.58226 1.129-4e-3 7e-3 -0.0996-0.0551-0.0952-0.0618 0.0879-0.43102 0.20188-0.85493 0.37011-1.2625 0.24371-0.65991 0.47106-1.3258 0.72493-1.982 0.34764-0.92015 0.7155-1.8328 1.1132-2.7325 0.53498-1.1875 1.1073-2.3578 1.7386-3.4974 0.83597-1.5062 1.7091-2.9918 2.6521-4.4339 1.2176-1.8571 2.4924-3.6768 3.8617-5.426 1.5564-1.9656 3.1779-3.8806 4.9559-5.6516 1.7496-1.7398 3.5486-3.4348 5.5105-4.9363 1.7368-1.3015 3.5245-2.5399 5.4527-3.5453 1.4921-0.76509 3.0145-1.4847 4.6252-1.9671 0.89204-0.24818 1.8044-0.49147 2.7391-0.45179 0.22874 0.0222 0.48578 0.0371 0.6778 0.17852 7e-3 1e-3 -0.0193 0.0977-0.0261 0.0958z" style="paint-order:stroke markers fill"/>
<path d="m153.29 145.02c-0.15828 0.15262-0.31907 0.30097-0.46858 0.46292-0.57384 0.69532-0.98126 1.5083-1.3797 2.3115-0.71787 1.4914-1.2228 3.0686-1.683 4.6544-0.59346 2.0616-0.93421 4.1794-1.1932 6.3051-0.27855 2.4262-0.33415 4.8686-0.32892 7.3081 0.01 2.4817 0.22483 4.9545 0.49711 7.4191 0.24192 2.184 0.59224 4.3531 0.99246 6.513 0.316 1.6727 0.70268 3.3306 1.1352 4.9766 0.32639 1.2421 0.72085 2.4642 1.1528 3.6731 0.32876 0.91498 0.70892 1.81 1.0769 2.7095 0.27076 0.64139 0.51909 1.2918 0.78344 1.9358 0.17947 0.38757 0.30221 0.79262 0.38663 1.2101 2e-3 8e-3 -0.10938 0.0315-0.11101 0.0236-0.24262-0.36693-0.46177-0.74727-0.63102-1.1544-0.29429-0.63895-0.60439-1.2706-0.88886-1.9141-0.40482-0.89646-0.79001-1.8019-1.145-2.7193-0.46139-1.218-0.88427-2.4502-1.2436-3.7024-0.4739-1.6561-0.90701-3.324-1.2599-5.0106-0.45218-2.1741-0.83751-4.3623-1.1061-6.5674-0.28935-2.4905-0.49684-4.9911-0.49193-7.5006 7e-3 -2.4674 0.0804-4.938 0.40604-7.387 0.30782-2.1484 0.69622-4.2882 1.3488-6.3626 0.51407-1.5961 1.0817-3.1814 1.8796-4.6614 0.45528-0.80626 0.92835-1.6234 1.6174-2.2563 0.17745-0.14603 0.36974-0.31725 0.60552-0.35304 6e-3 -4e-3 0.0554 0.0827 0.0493 0.0862z" style="paint-order:stroke markers fill"/>
<path d="m117.41 110.54c-4e-3 0.21984-0.0128 0.43844-4e-3 0.65867 0.0859 0.89744 0.3727 1.7604 0.65889 2.6101 0.54696 1.5622 1.3052 3.0345 2.1011 4.4813 1.0382 1.8774 2.2947 3.6159 3.6146 5.3021 1.5186 1.9125 3.2063 3.6789 4.935 5.4002 1.7619 1.7478 3.6624 3.3444 5.5976 4.8946 1.7154 1.3733 3.4969 2.6593 5.3072 3.9036 1.4062 0.95932 2.8519 1.8582 4.3217 2.7163 1.1091 0.64748 2.2522 1.2328 3.4124 1.7822 0.87945 0.41452 1.7811 0.77856 2.6774 1.1544 0.64499 0.26207 1.2805 0.54641 1.9228 0.81487 0.40096 0.14715 0.77416 0.34677 1.129 0.58226 7e-3 4e-3 -0.0551 0.0996-0.0618 0.0952-0.43102-0.0879-0.85492-0.20188-1.2625-0.37011-0.6599-0.24371-1.3258-0.47106-1.982-0.72493-0.92015-0.34764-1.8328-0.7155-2.7325-1.1132-1.1875-0.53498-2.3578-1.1073-3.4974-1.7386-1.5062-0.83596-2.9918-1.7091-4.4339-2.6521-1.8571-1.2176-3.6768-2.4924-5.426-3.8617-1.9656-1.5564-3.8806-3.1779-5.6516-4.9559-1.7398-1.7497-3.4349-3.5486-4.9363-5.5105-1.3015-1.7368-2.5399-3.5245-3.5453-5.4527-0.76508-1.4921-1.4847-3.0145-1.9671-4.6252-0.24818-0.89205-0.49147-1.8044-0.45179-2.7391 0.0222-0.22874 0.0371-0.48578 0.17852-0.67782 1e-3 -7e-3 0.0977 0.0193 0.0958 0.0261z" style="paint-order:stroke markers fill"/>
<ellipse cx="33.435" cy="147.39" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="68.036" cy="111.79" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="117.36" cy="110.85" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="153.27" cy="145.43" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="154.21" cy="194.19" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="119.63" cy="230.1" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="70.493" cy="230.85" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
<ellipse cx="34.585" cy="196.65" rx="2.2836" ry="2.3896" style="paint-order:stroke markers fill"/>
</g>
<g transform="translate(79.753 72.193)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m496.66 409.87v0.71l-0.02 0.68-0.03 0.66-0.04 0.64-0.06 0.62-0.07 0.6-0.09 0.57-0.11 0.56-0.13 0.55-0.15 0.53-0.17 0.51-0.19 0.5-0.21 0.49-0.24 0.48-0.26 0.47-0.14 0.23-0.15 0.23c-1.08 1.61-3.23 3-6.03 3v-0.98c1.89 0 3.7-1.14 4.33-3.17 0.56-1.88 0.59-4.39 0.59-7.43 0-2.57 0-5.15-0.45-7.34-0.7-3.17-3.06-3.94-4.47-3.94-1.59 0-3.72 0.94-4.42 3.8-0.49 2.05-0.49 4.91-0.49 7.48 0 2.55 0 5.21 0.52 7.11 0.73 2.75 2.97 3.49 4.39 3.49v0.98c-8.08 0-8.08-9.51-8.08-12.03 0-2.5 0-11.81 8.08-11.81 8.09 0 8.09 9.31 8.09 11.81z"/></g>
</g>
<g transform="translate(57.452 20.033)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m490.35 420.92v0.35l-0.01 0.03v0.09l-0.01 0.03v0.05l-0.01 0.03v0.02l-0.01 0.03v0.02l-0.02 0.04-0.01 0.04-0.08 0.12-0.09 0.06-0.08 0.02-0.05 0.02h-0.04l-0.03 0.01h-0.03l-0.02 0.01h-0.12l-0.04 0.01h-0.4c-2.23-2.2-5.39-2.23-6.82-2.23v-1.25c0.84 0 3.14 0 5.04 0.97v-17.77c0-1.16 0-1.61-3.48-1.61h-1.31v-1.25c0.62 0.03 4.9 0.14 6.2 0.14 1.08 0 5.47-0.11 6.23-0.14v1.25h-1.32c-3.49 0-3.49 0.45-3.49 1.61z"/></g>
</g>
<g transform="translate(1.5119 -1.8899)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m496.27 405.11h-1.18c-0.1-0.77-0.46-2.83-0.91-3.18-0.27-0.2-2.95-0.2-3.44-0.2h-6.42c3.66 3.23 4.88 4.2 6.97 5.84 2.58 2.07 4.98 4.22 4.98 7.54 0 4.21-3.68 6.79-8.15 6.79-4.32 0-7.25-3.03-7.25-6.23 0-1.78 1.5-1.96 1.86-1.96 0.82 0 1.84 0.6 1.84 1.85 0 0.62-0.25 1.84-2.06 1.84 1.08 2.47 3.45 3.24 5.09 3.24 3.49 0 5.3-2.71 5.3-5.53 0-3.04-2.16-5.44-3.28-6.69l-8.39-8.3c-0.36-0.31-0.36-0.39-0.36-1.36h14.36z"/></g>
</g>
<g transform="translate(-53.673 19.277)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m488.2 410.4h0.25l0.25-0.02 0.24-0.03 0.24-0.04 0.23-0.05 0.23-0.06 0.22-0.07 0.21-0.08 0.21-0.1 0.2-0.1 0.2-0.12 0.19-0.12 0.18-0.14 0.17-0.15 0.17-0.16 0.16-0.17 0.15-0.18 0.14-0.19 0.14-0.2 0.13-0.22 0.11-0.22 0.11-0.24 0.1-0.24 0.09-0.26 0.08-0.27 0.07-0.28 0.06-0.29 0.05-0.3 0.04-0.31 0.02-0.32 0.02-0.33 0.01-0.35c0-4.33-2.52-5.61-4.53-5.61-1.39 0-4.47 0.38-5.93 2.44 1.63 0.06 2.02 1.22 2.02 1.95 0 1.11-0.84 1.91-1.92 1.91-0.97 0-1.96-0.59-1.96-2.02 0-3.28 3.63-5.4 7.85-5.4 4.84 0 8.19 3.25 8.19 6.73 0 2.72-2.22 5.44-6.07 6.24 3.66 1.33 4.99 3.93 4.99 6.06 0 2.75-3.17 4.81-7.03 4.81-3.88 0-6.83-1.89-6.83-4.67 0-1.19 0.76-1.84 1.81-1.84 1.08 0 1.77 0.79 1.77 1.76 0 1.02-0.69 1.75-1.77 1.81 1.22 1.55 3.61 1.93 4.91 1.93 1.56 0 3.76-0.77 3.76-3.8 0-1.47-0.48-3.06-1.39-4.14-1.15-1.33-2.12-1.41-3.87-1.5-0.88-0.08-0.94-0.08-1.11-0.11-0.08 0-0.36-0.06-0.36-0.45 0-0.49 0.31-0.49 0.9-0.49z"/></g>
</g>
<g transform="translate(-73.327 73.705)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m497.12 404.48v1.25h-3.88v15.55c0 0.72 0 0.97-0.76 0.97-0.43 0-0.57 0-0.91-0.49l-11.53-16.03v-1.25h10.25l0.23 1.25h-9.2l9.2 12.75v-12.75l-0.23-1.25v-2.86c0-1.19 0-1.61-2.83-1.61h-0.94v-1.25c1.74 0.06 3.97 0.14 5.22 0.14 1.3 0 3.52-0.08 5.27-0.14v1.25h-0.94c-2.83 0-2.83 0.42-2.83 1.61v2.86z"/></g>
</g>
<g transform="translate(-50.649 126.62)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m484.09 418.2 0.32-0.08 0.15-0.04 0.3-0.06 0.28-0.06 0.14-0.02 0.13-0.03 0.13-0.02 0.12-0.02 0.12-0.01 0.12-0.02 0.11-0.01 0.11-0.02 0.1-0.01 0.11-0.01 0.09-0.01h0.1l0.18-0.02h0.17l0.07-0.01h0.52c4.59 0 7.31 3.14 7.31 3.67 0 0.37-0.23 0.48-0.4 0.48-0.08 0-0.14 0-0.28-0.11-0.85-0.31-2.69-1.01-5.27-1.01-0.97 0-2.83 0.08-5.09 0.95-0.35 0.17-0.41 0.17-0.46 0.17-0.45 0-0.45-0.39-0.45-0.94v-10.28c0-0.59 0-1.01 0.56-1.01 0.32 0 0.35 0.06 0.71 0.48 1.5 1.92 3.62 2.21 4.84 2.21 2.08 0 3.03-1.68 3.2-1.96 0.63-1.15 0.83-2.47 0.83-4.5 0-1.04 0-3.09-1.05-4.62-0.86-1.27-2.36-2.1-4.06-2.1-2.26 0-4.61 1.25-5.48 3.55 1.33-0.09 1.98 0.77 1.98 1.7 0 1.5-1.28 1.78-1.73 1.78-0.07 0-1.75 0-1.75-1.87 0-3.14 2.86-6.28 7.04-6.28 4.46 0 8.36 3.31 8.36 7.7 0 3.94-3 7.56-7.31 7.56-1.53 0-3.34-0.37-4.87-1.7z"/></g>
</g>
<g transform="translate(4.5357 145.14)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m483.91 410.15 0.02 1.06 0.01 0.52 0.03 0.51 0.04 0.51 0.05 0.49 0.06 0.49 0.08 0.48 0.09 0.47 0.11 0.46 0.13 0.46 0.14 0.44 0.08 0.22 0.09 0.21 0.09 0.22 0.2 0.42 0.11 0.2 0.24 0.4c1.18 1.9 3.06 3.18 5.29 3.18 1.05 0 2.44-0.28 3.14-1.22-0.87-0.06-1.61-0.66-1.61-1.67 0-0.88 0.6-1.64 1.65-1.64 1.04 0 1.67 0.7 1.67 1.7 0 2.03-1.47 3.84-4.92 3.84-5.02 0-10.15-4.61-10.15-12.09 0-9.03 4.25-11.75 8.1-11.75 4.25 0 7.94 3.25 7.94 7.81 0 4.42-3.52 7.7-7.6 7.7l-0.17-0.98c1.61 0 2.69-0.63 3.55-1.91 0.84-1.32 0.87-2.79 0.87-4.81 0-1.98 0-3.45-0.94-4.81-0.84-1.22-1.95-1.88-3.65-1.88-1.75 0-3.11 1-3.85 2.55-0.51 1.03-0.79 2.78-0.79 4.88 0 3.37 2.03 5.98 4.81 5.98l0.17 0.98c-2.78 0-4.31-1.84-5.08-3.42z"/></g>
</g>
<g transform="translate(58.208 124.73)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><path d="m462.14 410.34 0.25 0.27 0.48 0.5 0.23 0.24 0.22 0.23 0.22 0.22 0.21 0.22 0.2 0.21 0.2 0.2 0.2 0.19 0.38 0.38 0.18 0.17 0.19 0.18 0.35 0.33 0.34 0.32 0.33 0.3 0.33 0.29 0.32 0.29 0.65 0.56 0.33 0.29 0.33 0.28c0 0.05 3.08 2.69 4.88 4.49 4.73 4.64 5.83 7.03 5.83 7.21 0 0.5-0.46 0.5-0.55 0.5-0.35 0-0.5-0.09-0.75-0.54-1.49-2.39-2.53-3.19-3.74-3.19-1.2 0-1.79 0.75-2.54 1.59-0.94 1.16-1.78 2.14-3.44 2.14-3.73 0-6.02-4.62-6.02-5.67 0-0.25 0.14-0.54 0.6-0.54 0.45 0 0.54 0.25 0.64 0.54 0.95 2.3 3.84 2.35 4.23 2.35 1.05 0 2-0.36 3.14-0.75 2-0.75 2.55-0.75 3.85-0.75-1.8-2.14-5.99-5.74-6.92-6.53l-4.49-4.18c-3.39-3.34-5.14-6.18-5.14-6.53 0-0.5 0.5-0.5 0.59-0.5 0.41 0 0.5 0.1 0.8 0.64 1.16 1.75 2.64 3.1 4.24 3.1 1.15 0 1.65-0.46 2.89-1.89 0.86-1.05 1.75-1.85 3.18-1.85 4.94 0 7.83 6.33 7.83 7.67 0 0.25-0.2 0.5-0.59 0.5-0.46 0-0.55-0.29-0.71-0.65-1.14-3.24-4.32-4.17-5.98-4.17-0.98 0-1.89 0.29-2.94 0.64-1.68 0.64-2.43 0.84-3.48 0.84-0.1 0-0.89 0-1.35-0.14z"/><path d="m497.32 419.81 0.03 0.04 0.03 0.03 0.03 0.04 0.02 0.03 0.03 0.03 0.02 0.04 0.06 0.09 0.01 0.03 0.02 0.03 0.01 0.02 0.01 0.04 0.03 0.09 0.01 0.04 0.01 0.03v0.04l0.01 0.04v0.09l0.01 0.05v0.59h-9.12c-1.39 0-1.78 0.03-3.03 0.14-1.81 0.14-1.88 0.39-1.99 0.98h-1.18l-1.22-7.46h1.18c0.07 0.53 0.43 2.82 0.97 3.17 0.28 0.22 3.11 0.22 3.63 0.22h7.59c-1.11-1.47-2.89-3.63-3.61-4.61-4.58-5.99-4.98-11.53-4.98-13.58 0-0.39 0-2 1.62-2 1.68 0 1.68 1.58 1.68 2.03v1.39c0 6.77 1.4 9.86 2.9 11.73z"/></g>
</g>
<g transform="translate(65.012 47.247)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill="none" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" xml:space="preserve"><path d="m464.44 411.93-0.19-0.3-0.18-0.29-0.19-0.28-0.19-0.26-0.18-0.25-0.19-0.23-0.19-0.22-0.18-0.21-0.19-0.2-0.19-0.18-0.18-0.17-0.19-0.16-0.19-0.15-0.18-0.14-0.19-0.13-0.19-0.12-0.19-0.11-0.19-0.1-0.38-0.18-0.19-0.07-0.2-0.07-0.19-0.07-0.2-0.05-0.19-0.05-0.4-0.08-0.19-0.03-0.41-0.05-0.4-0.03c-0.61-0.05-1.05-0.05-1.05-1 0-0.3 0.25-0.55 0.64-0.55 1.34 0 2.89 0.16 4.28 0.16 1.64 0 3.39-0.16 4.99-0.16 0.29 0 0.95 0 0.95 0.95 0 0.55-0.45 0.6-0.8 0.6-1.15 0.09-2.34 0.5-2.34 1.73 0 0.61 0.3 1.16 0.69 1.84l3.79 6.39h12.5l-0.14 1.54h-11.42l9.83 16.45 1.59-16.45 0.14-1.54c0.11-1.04 0.8-7.82 0.8-8.32 0-1.5-2.59-1.64-3.58-1.64-0.7 0-1.2 0-1.2-1 0-0.55 0.59-0.55 0.7-0.55 2.03 0 4.19 0.16 6.22 0.16 1.25 0 4.39-0.16 5.64-0.16 0.3 0 0.89 0 0.89 1 0 0.55-0.5 0.55-1.14 0.55-3.09 0-3.09 0.34-3.25 1.79l-3.03 31.13c-0.11 1-0.11 1.2-0.95 1.2-0.8 0-0.99-0.34-1.3-0.84z" fill="#000" stroke-width="0"/></g>
</g>
<g transform="translate(28.726 13.985)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill="none" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" xml:space="preserve"><path d="m463.49 410.09-0.05-0.18-0.04-0.17-0.05-0.16-0.08-0.3-0.1-0.26-0.05-0.12-0.05-0.11-0.06-0.11-0.07-0.1-0.14-0.18-0.09-0.07-0.09-0.08-0.11-0.06-0.11-0.07-0.26-0.1-0.15-0.05-0.16-0.04-0.09-0.02-0.09-0.01-0.09-0.02-0.1-0.02-0.2-0.02-0.11-0.01-0.12-0.02-0.11-0.01-0.13-0.01h-0.12l-0.13-0.01-0.14-0.01h-0.14l-0.14-0.01h-0.15l-0.16-0.01h-0.85c-0.85 0-1.35 0-1.35-1 0-0.55 0.46-0.55 1.35-0.55h17.78c7.87 0 13.75 5.87 13.75 10.76 0 3.58-2.89 6.47-7.72 7.02 5.19 0.95 10.42 4.64 10.42 9.38 0 3.68-3.3 6.87-9.28 6.87l-0.69-1.55c4.38 0 5.42-2.93 5.42-5.12 0-4.39-4.28-9.13-10.35-9.13h-7.27l-0.3-1.09h9.41c4.78 0 5.73-3.69 5.73-5.83 0-4.94-4.43-9.76-10.31-9.76h-6.78c-0.69 0-0.8 0-1.09 0.04-0.5 0.05-0.64 0.1-0.64 0.5 0 0.14 0 0.25 0.25 1.14l3.43 13.91 0.3 1.09 3.08 12.36c0.45 1.74 0.54 1.89 2.7 1.89h6.42l0.69 1.55h-16.73c-0.94 0-1.44 0-1.44-1 0-0.55 0.44-0.55 1.39-0.55 0.09 0 1.05 0 1.89-0.09 0.89-0.11 1.34-0.16 1.34-0.8 0-0.2-0.04-0.36-0.2-0.95z" fill="#000" stroke-width="0"/></g>
</g>
<g transform="translate(-20.789 12.851)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill="none" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" xml:space="preserve"><path d="m493.38 440.82v0.05l-0.01 0.02v0.04l-0.01 0.02v0.02l-0.03 0.06v0.02l-0.02 0.02-0.03 0.06-0.08 0.08-0.02 0.01-0.02 0.02-0.03 0.01-0.02 0.02-0.03 0.01-0.01 0.01h-0.02l-0.01 0.01h-0.02l-0.02 0.01h-0.03l-0.02 0.01h-0.12c-0.14 0-0.2-0.04-0.75-0.59l-3.48-3.84c-0.44 0.7-2.74 4.43-8.27 4.43-11.11 0-22.33-11.01-22.33-22.56 0-8.23 5.89-13.65 13.52-13.65 4.33 0 8.11 1.98 10.75 4.28 4.64 4.09 5.48 8.62 5.48 8.76 0 0.5-0.5 0.5-0.59 0.5-0.3 0-0.55-0.09-0.66-0.5-0.43-1.44-1.59-4.98-5.03-7.87-3.43-2.78-6.58-3.63-9.15-3.63-4.49 0-9.77 2.6-9.77 10.36 0 2.85 1.05 10.91 6.02 16.74 3.04 3.54 7.73 6.03 12.15 6.03 5.1 0 8.03-3.83 8.03-9.61 0-2-0.15-2.05-0.15-2.55s0.54-0.5 0.75-0.5c0.64 0 0.64 0.11 0.89 1z" fill="#000" stroke-width="0"/></g>
</g>
<g transform="translate(-56.318 48.381)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill="none" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" xml:space="preserve"><path d="m463.44 410.09-0.04-0.18-0.05-0.17-0.04-0.16-0.05-0.15-0.04-0.15-0.05-0.13-0.04-0.13-0.05-0.12-0.12-0.22-0.06-0.1-0.07-0.09-0.08-0.09-0.09-0.07-0.09-0.08-0.11-0.06-0.11-0.07-0.12-0.05-0.14-0.05-0.15-0.05-0.16-0.04-0.09-0.02-0.08-0.01-0.2-0.04-0.2-0.02-0.11-0.01-0.11-0.02-0.24-0.02h-0.13l-0.26-0.02h-0.15l-0.14-0.01h-0.15l-0.16-0.01h-0.85c-0.84 0-1.39 0-1.39-0.96 0-0.59 0.44-0.59 1.39-0.59h16.48l-0.89 1.55h-5.62c-0.7 0-0.8 0-1.11 0.04-0.48 0.05-0.64 0.1-0.64 0.5 0 0.14 0 0.25 0.25 1.14l6.83 27.36c0.43 1.74 0.54 1.89 2.68 1.89h5.33c4.89 0 9.02-2.64 9.02-9.22 0-2.43-1-10.6-5.24-16.09-1.43-1.84-5.37-5.62-11.5-5.62l0.89-1.55c10.36 0 20.19 10.51 20.19 21.42 0 7.03-4.23 12.61-11.72 12.61h-16.73c-0.95 0-1.5 0-1.5-0.95 0-0.6 0.45-0.6 1.45-0.6 0.64 0 1.55-0.04 2.14-0.09 0.8-0.11 1.1-0.25 1.1-0.8 0-0.2-0.05-0.36-0.21-0.95z" fill="#000" stroke-width="0"/></g>
</g>
<g transform="translate(-56.696 99.03)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><polyline points="456 446 493.44 446 493.44 448.04 456 448.04" fill-rule="nonzero"/><path d="m464.44 411.93-0.19-0.3-0.18-0.29-0.19-0.28-0.19-0.26-0.18-0.25-0.19-0.23-0.19-0.22-0.18-0.21-0.19-0.2-0.19-0.18-0.18-0.17-0.19-0.16-0.19-0.15-0.18-0.14-0.19-0.13-0.19-0.12-0.19-0.11-0.19-0.1-0.38-0.18-0.19-0.07-0.2-0.07-0.19-0.07-0.2-0.05-0.19-0.05-0.4-0.08-0.19-0.03-0.41-0.05-0.4-0.03c-0.61-0.05-1.05-0.05-1.05-1 0-0.3 0.25-0.55 0.64-0.55 1.34 0 2.89 0.16 4.28 0.16 1.64 0 3.39-0.16 4.99-0.16 0.29 0 0.95 0 0.95 0.95 0 0.55-0.45 0.6-0.8 0.6-1.15 0.09-2.34 0.5-2.34 1.73 0 0.61 0.3 1.16 0.69 1.84l3.79 6.39h12.5l-0.14 1.54h-11.42l9.83 16.45 1.59-16.45 0.14-1.54c0.11-1.04 0.8-7.82 0.8-8.32 0-1.5-2.59-1.64-3.58-1.64-0.7 0-1.2 0-1.2-1 0-0.55 0.59-0.55 0.7-0.55 2.03 0 4.19 0.16 6.22 0.16 1.25 0 4.39-0.16 5.64-0.16 0.3 0 0.89 0 0.89 1 0 0.55-0.5 0.55-1.14 0.55-3.09 0-3.09 0.34-3.25 1.79l-3.03 31.13c-0.11 1-0.11 1.2-0.95 1.2-0.8 0-0.99-0.34-1.3-0.84z"/></g>
</g>
<g transform="translate(-23.435 136.07)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><polyline points="456 446 496.32 446 496.32 448.04 456 448.04" fill-rule="nonzero"/><path d="m463.49 410.09-0.05-0.18-0.04-0.17-0.05-0.16-0.08-0.3-0.1-0.26-0.05-0.12-0.05-0.11-0.06-0.11-0.07-0.1-0.14-0.18-0.09-0.07-0.09-0.08-0.11-0.06-0.11-0.07-0.26-0.1-0.15-0.05-0.16-0.04-0.09-0.02-0.09-0.01-0.09-0.02-0.1-0.02-0.2-0.02-0.11-0.01-0.12-0.02-0.11-0.01-0.13-0.01h-0.12l-0.13-0.01-0.14-0.01h-0.14l-0.14-0.01h-0.15l-0.16-0.01h-0.85c-0.85 0-1.35 0-1.35-1 0-0.55 0.46-0.55 1.35-0.55h17.78c7.87 0 13.75 5.87 13.75 10.76 0 3.58-2.89 6.47-7.72 7.02 5.19 0.95 10.42 4.64 10.42 9.38 0 3.68-3.3 6.87-9.28 6.87l-0.69-1.55c4.38 0 5.42-2.93 5.42-5.12 0-4.39-4.28-9.13-10.35-9.13h-7.27l-0.3-1.09h9.41c4.78 0 5.73-3.69 5.73-5.83 0-4.94-4.43-9.76-10.31-9.76h-6.78c-0.69 0-0.8 0-1.09 0.04-0.5 0.05-0.64 0.1-0.64 0.5 0 0.14 0 0.25 0.25 1.14l3.43 13.91 0.3 1.09 3.08 12.36c0.45 1.74 0.54 1.89 2.7 1.89h6.42l0.69 1.55h-16.73c-0.94 0-1.44 0-1.44-1 0-0.55 0.44-0.55 1.39-0.55 0.09 0 1.05 0 1.89-0.09 0.89-0.11 1.34-0.16 1.34-0.8 0-0.2-0.04-0.36-0.2-0.95z"/></g>
</g>
<g transform="translate(30.994 135.69)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><polyline points="456 446 495.24 446 495.24 448.04 456 448.04" fill-rule="nonzero"/><path d="m493.38 440.82v0.05l-0.01 0.02v0.04l-0.01 0.02v0.02l-0.03 0.06v0.02l-0.02 0.02-0.03 0.06-0.08 0.08-0.02 0.01-0.02 0.02-0.03 0.01-0.02 0.02-0.03 0.01-0.01 0.01h-0.02l-0.01 0.01h-0.02l-0.02 0.01h-0.03l-0.02 0.01h-0.12c-0.14 0-0.2-0.04-0.75-0.59l-3.48-3.84c-0.44 0.7-2.74 4.43-8.27 4.43-11.11 0-22.33-11.01-22.33-22.56 0-8.23 5.89-13.65 13.52-13.65 4.33 0 8.11 1.98 10.75 4.28 4.64 4.09 5.48 8.62 5.48 8.76 0 0.5-0.5 0.5-0.59 0.5-0.3 0-0.55-0.09-0.66-0.5-0.43-1.44-1.59-4.98-5.03-7.87-3.43-2.78-6.58-3.63-9.15-3.63-4.49 0-9.77 2.6-9.77 10.36 0 2.85 1.05 10.91 6.02 16.74 3.04 3.54 7.73 6.03 12.15 6.03 5.1 0 8.03-3.83 8.03-9.61 0-2-0.15-2.05-0.15-2.55s0.54-0.5 0.75-0.5c0.64 0 0.64 0.11 0.89 1z"/></g>
</g>
<g transform="translate(63.878 98.274)">
<g transform="matrix(.3 0 0 -.3 -52.5 222.75)" fill-rule="evenodd" stroke="#000" stroke-miterlimit="10.433" stroke-width="0" xml:space="preserve"><polyline points="456 446 498.72 446 498.72 448.04 456 448.04" fill-rule="nonzero"/><path d="m463.44 410.09-0.04-0.18-0.05-0.17-0.04-0.16-0.05-0.15-0.04-0.15-0.05-0.13-0.04-0.13-0.05-0.12-0.12-0.22-0.06-0.1-0.07-0.09-0.08-0.09-0.09-0.07-0.09-0.08-0.11-0.06-0.11-0.07-0.12-0.05-0.14-0.05-0.15-0.05-0.16-0.04-0.09-0.02-0.08-0.01-0.2-0.04-0.2-0.02-0.11-0.01-0.11-0.02-0.24-0.02h-0.13l-0.26-0.02h-0.15l-0.14-0.01h-0.15l-0.16-0.01h-0.85c-0.84 0-1.39 0-1.39-0.96 0-0.59 0.44-0.59 1.39-0.59h16.48l-0.89 1.55h-5.62c-0.7 0-0.8 0-1.11 0.04-0.48 0.05-0.64 0.1-0.64 0.5 0 0.14 0 0.25 0.25 1.14l6.83 27.36c0.43 1.74 0.54 1.89 2.68 1.89h5.33c4.89 0 9.02-2.64 9.02-9.22 0-2.43-1-10.6-5.24-16.09-1.43-1.84-5.37-5.62-11.5-5.62l0.89-1.55c10.36 0 20.19 10.51 20.19 21.42 0 7.03-4.23 12.61-11.72 12.61h-16.73c-0.95 0-1.5 0-1.5-0.95 0-0.6 0.45-0.6 1.45-0.6 0.64 0 1.55-0.04 2.14-0.09 0.8-0.11 1.1-0.25 1.1-0.8 0-0.2-0.05-0.36-0.21-0.95z"/></g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.12...3.31)
project( Triangulation_on_hyperbolic_surface_2_Examples )
# CGAL and its components
find_package( CGAL REQUIRED )
# create a target per cppfile
file(
GLOB cppfiles
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
foreach(cppfile ${cppfiles})
create_single_source_cgal_program("${cppfile}")
endforeach()

View File

@ -0,0 +1,38 @@
#include <CGAL/Exact_rational.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_factory_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2_IO.h>
#include <time.h>
typedef CGAL::Exact_rational Rational;
typedef CGAL::Simple_cartesian<Rational> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef CGAL::Hyperbolic_fundamental_domain_factory_2<Traits> Factory;
typedef CGAL::Triangulation_on_hyperbolic_surface_2<Traits> Triangulation;
int main() {
// Generates the domain:
Factory factory = Factory();
Domain domain = factory.make_hyperbolic_fundamental_domain_g2(time(NULL)); // get a random seed with time(NULL)
// Triangulates the domain:
Triangulation triangulation = Triangulation(domain);
// Applies the Delaunay flip algorithm to the triangulation:
triangulation.make_Delaunay();
// Saves the triangulation:
std::ofstream output_file = std::ofstream ("OutputTriangulation.txt");
output_file << triangulation;
output_file.close();
// Prints the triangulation:
std::cout << triangulation << std::endl;
return 0;
}

View File

@ -0,0 +1,175 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallée (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_COMPLEX_NUMBER_H
#define CGAL_COMPLEX_NUMBER_H
#include <fstream>
#include <sstream>
#include <utility>
namespace CGAL {
/*
Templated by a field FT. Represents a complex number over FT.
*/
template <class FT>
class Complex_number
{
typedef Complex_number<FT> Self;
FT real_, imag_;
public:
Complex_number(const FT& real_part)
: real_(real_part),
imag_(0)
{}
Complex_number(const FT& real_part, const FT& imaginary_part)
: real_(real_part),
imag_(imaginary_part)
{}
Complex_number()
: Complex_number(FT(0), FT(0))
{}
template<class U,class V>
Complex_number(U&& real_part, V&& imaginary_part)
: real_(std::forward<U>(real_part)),
imag_(std::forward<V>(imaginary_part))
{}
void real(const FT& real_part) {
real_ = real_part;
}
void imag(const FT& imaginary_part) {
imag_ = imaginary_part;
}
FT real() const {
return real_;
}
FT imag() const {
return imag_;
}
Self& operator+=(const Self& other);
Self& operator-=(const Self& other);
Self& operator*=(const Self& other);
Self& operator/=(const Self& other);
// These member versions are not working ?
/* Self operator+(const Self& z) const; */
/* Self operator-(const Self& z) const; */
// Hidden friends
friend Self operator+(const Self& z) {
return z;
}
friend Self operator-(const Self& z) {
return Self(-z.real_,-z.imag_);
}
friend bool operator==(const Self& z1, const Self& z2) {
return (z1.real_==z2.real_ && z1.imag_==z2.imag_);
}
friend bool operator!=(const Self& z1, const Self& z2) {
return !operator==(z1, z2);
}
friend Self operator+(const Self& z1, const Self& z2) {
return Self(z1.real_+z2.real_, z1.imag_+z2.imag_);
}
friend Self operator-(const Self& z1, const Self& z2) {
return Self(z1.real_-z2.real_, z1.imag_-z2.imag_);
}
friend Self operator*(const Self& z1, const Self& z2) {
return Self(z1.real_*z2.real_-z1.imag_*z2.imag_, z1.real_*z2.imag_+z1.imag_*z2.real_);
}
friend Self operator/(const Self& z1, const Self& z2) {
FT m2 = norm(z2);
return Self(z1.real_/m2, z1.imag_/m2)*conj(z2);
}
friend std::ostream& operator<<(std::ostream& s, const Self& z) {
s << z.real_ << std::endl << z.imag_ << std::endl;
return s;
}
friend void operator>>(std::istream& s, Self& z) {
FT ft;
s >> ft;
z.real(ft);
s >> ft;
z.imag(ft);
}
};
////////////////////////////////////////////////////////////////////////////////
template<class FT>
Complex_number<FT>& Complex_number<FT>::operator+=(const Complex_number<FT>& other)
{
real_ += other.real();
imag_ += other.imag();
return *this;
}
template<class FT>
Complex_number<FT>& Complex_number<FT>::operator-=(const Complex_number<FT>& other)
{
real_ -= other.real();
imag_ -= other.imag();
return *this;
}
template<class FT>
Complex_number<FT>& Complex_number<FT>::operator*=(const Complex_number<FT>& other)
{
real_ = real_*other.real() - imag_*other.imag();
imag_ = real_*other.imag() + imag_*other.real();
return *this;
}
template<class FT>
Complex_number<FT>& Complex_number<FT>::operator/=(const Complex_number<FT>& other)
{
FT m2 = norm(other);
real_ /= m2;
imag_ /= m2;
this *= conj(other);
return *this;
}
template<class FT>
FT norm(const Complex_number<FT>& z)
{
return z.real()*z.real() + z.imag()*z.imag();
}
template<class FT>
Complex_number<FT> conj(const Complex_number<FT>& z)
{
return Complex_number<FT>(z.real(), -z.imag());
}
} // namespace CGAL
#endif // CGAL_COMPLEX_NUMBER_H

View File

@ -0,0 +1,221 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2_H
#define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2_H
#include <CGAL/license/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Hyperbolic_isometry_2.h>
#include <CGAL/assertions.h>
#include <iostream>
#include <vector>
namespace CGAL {
/*
Represents a convex geodesic hyperbolic domain D of a closed orientable hyperbolic surface.
The domain D is given as a convex geodesic hyperbolic polygon P given by the list of its vertices in the hyperbolic plane,
together with a pairing of the sides of P, such that every two paired sides have the same length, and such that
identifying every two paired sides in a way that respects the orientation of P would result in a closed
orientable hyperbolic surface.
*/
template<class Traits>
class Hyperbolic_fundamental_domain_2
{
public:
typedef typename Traits::Hyperbolic_point_2 Point;
Hyperbolic_fundamental_domain_2() {};
template<class PointRange, class PairingRange>
Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings)
{
vertices_ = std::vector<Point>(vertices.begin(), vertices.end());
pairings_ = std::vector<std::size_t>(pairings.begin(), pairings.end());
}
// returns the number of vertices (equivalently, the number of sides)
std::size_t size() const;
// returns the index-th vertex
const Point& vertex(std::size_t index) const;
// returns the index of the side paired to side A, where A is the index-th side
std::size_t paired_side(std::size_t index) const;
// returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B
Hyperbolic_isometry_2<Traits> side_pairing(std::size_t index) const;
std::istream& from_stream(std::istream& s);
std::ostream& to_stream(std::ostream& s) const;
bool is_valid() const;
private:
std::vector<Point> vertices_;
std::vector<std::size_t> pairings_;
};
//template<class Traits> std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2<Traits>& domain);
//template<class Traits> std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2<Traits>& domain);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
std::size_t
Hyperbolic_fundamental_domain_2<Traits>::
size() const
{
CGAL_precondition(is_valid());
return vertices_.size();
}
template<class Traits>
const typename Hyperbolic_fundamental_domain_2<Traits>::Point&
Hyperbolic_fundamental_domain_2<Traits>::
vertex(std::size_t index) const
{
CGAL_precondition(is_valid());
return vertices_[index];
}
template<class Traits>
std::size_t
Hyperbolic_fundamental_domain_2<Traits>::
paired_side(std::size_t index) const
{
CGAL_precondition(is_valid());
return pairings_[index];
}
template<class Traits>
Hyperbolic_isometry_2<Traits>
Hyperbolic_fundamental_domain_2<Traits>::
side_pairing(std::size_t index) const
{
CGAL_precondition(is_valid());
std::size_t n = size();
std::size_t paired_index = paired_side(index);
//const Point& p1,p2,q1,q2;
const Point& q1 = vertex(index);
const Point& q2 = vertex((index+1)%n);
const Point& p2 = vertex(paired_index);
const Point& p1 = vertex((paired_index+1)%n);
Hyperbolic_isometry_2<Traits> isom = isometry_pairing_the_sides<Traits>(p1,p2,q1,q2);
return isom;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
std::ostream&
Hyperbolic_fundamental_domain_2<Traits>::
to_stream(std::ostream& s) const
{
std::size_t n = size();
s << std::to_string(n) << std::endl;
for (std::size_t k=0; k<n; ++k) {
s << paired_side(k) << std::endl;
}
for (std::size_t k=0; k<n; ++k) {
s << vertex(k) << std::endl;
}
return s;
}
template<class Traits>
std::istream&
Hyperbolic_fundamental_domain_2<Traits>::
from_stream(std::istream& s)
{
vertices_.clear();
pairings_.clear();
std::string line;
s >> line;
std::size_t size = std::stoi(line);
vertices_.reserve(size);
pairings_.reserve(size);
for (std::size_t k=0; k<size; ++k) {
s >> line;
pairings_.push_back(std::stoi(line));
}
for (std::size_t k=0; k<size; ++k) {
Point p;
s >> p;
vertices_.push_back(p);
}
return s;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
bool
Hyperbolic_fundamental_domain_2<Traits>::
is_valid()const
{
// Get the number of vertices
std::size_t n = vertices_.size();
// Check that the number of vertices is even
if (n%2) {
return false;
}
// Check that there are as many side pairings as vertices
if (pairings_.size() != n) {
return false;
}
// Check that the pairings_ vector encodes a perfect matching of the set {0,1,\dots,n-1}
std::vector<bool> already_paired(n);
for (std::size_t k=0; k<n; ++k) {
already_paired[k] = false;
}
for (std::size_t k=0; k<n; ++k) {
std::size_t paired_side = pairings_[k];
if (paired_side>=n) {
return false;
}
if (already_paired[paired_side]) {
return false;
}
already_paired[paired_side] = true;
}
// Check that the vertices all lie within the open unit disk
for (std::size_t k=0; k<n; ++k) {
if (norm(Complex_number(vertices_[k].x(), vertices_[k].y())) >= typename Traits::FT(1)) {
return false;
}
}
return true;
}
} // namespace CGAL
#endif // CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2_H

View File

@ -0,0 +1,284 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2_H
#define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2_H
#include <CGAL/license/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_2.h>
#include <CGAL/Random.h>
#include <cmath>
#include <vector>
namespace CGAL {
/*
Factory class, whose only purpose is to construct random fundamental domains of
closed orientable hyperbolic surfaces. The function
`make_hyperbolic_fundamental_domain_g2()` constructs such a domain for a surface of
genus 2.
*/
template<class Traits>
class Hyperbolic_fundamental_domain_factory_2
{
private:
typedef typename Traits::FT FT;
typedef typename Traits::Complex Cmplx;
typedef typename Traits::Hyperbolic_point_2 Point;
Random random_;
public:
Hyperbolic_fundamental_domain_factory_2();
Hyperbolic_fundamental_domain_2<Traits> make_hyperbolic_fundamental_domain_g2(unsigned int seed);
private:
float random_positive_float(); // returns number in [0,1]
float random_float(); // returns number in [-1,1]
Complex_number<float> random_complex_float(); // returns complex z such that modulus(z) < 1 and imag(z) > 0
FT exact_number_from_float(float x);
Cmplx exact_complex_from_float_complex(const Complex_number<float>& z);
bool try_to_compute_inexact_z0_from_z1_z2_z3(Complex_number<float>& z0, Complex_number<float>& z1, Complex_number<float>& z2, Complex_number<float>& z3);
bool try_to_compute_exact_z3_from_z0_z1_z2(Cmplx& z0, Cmplx& z1, Cmplx& z2, Cmplx& z3);
bool sanity_check(Cmplx& z0, Cmplx& z1, Cmplx& z2, Cmplx& z3);
const int CGAL_DENOMINATOR_FOR_GENERATION = 10000;
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
Hyperbolic_fundamental_domain_factory_2<Traits>::Hyperbolic_fundamental_domain_factory_2() {}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
Hyperbolic_fundamental_domain_2<Traits>
Hyperbolic_fundamental_domain_factory_2<Traits>::
make_hyperbolic_fundamental_domain_g2(unsigned int seed)
{
random_ = Random(seed);
bool is_domain_generated = false;
Cmplx exact_z0, exact_z1, exact_z2, exact_z3;
while (!is_domain_generated) {
// 1. Generate inexact z0,z1,z2,z3
Complex_number<float> z0, z1, z2, z3;
z1 = random_complex_float();
z2 = random_complex_float();
z3 = random_complex_float();
while (! try_to_compute_inexact_z0_from_z1_z2_z3(z0,z1,z2,z3)) {
z1 = random_complex_float();
z2 = random_complex_float();
z3 = random_complex_float();
}
// 2. Compute exact z0,z1,z2,z3 nearby
exact_z0 = exact_complex_from_float_complex(z0);
exact_z1 = exact_complex_from_float_complex(z1);
exact_z2 = exact_complex_from_float_complex(z2);
exact_z3 = exact_complex_from_float_complex(z3);
// 3. Modify z3 to fix the area...
is_domain_generated = try_to_compute_exact_z3_from_z0_z1_z2(exact_z0, exact_z1, exact_z2, exact_z3);
if (is_domain_generated) {
// ... and perform a sanity check
is_domain_generated = sanity_check(exact_z0, exact_z1, exact_z2, exact_z3);
}
}
Cmplx exact_zero(FT(0), FT(0));
std::vector<Point> vertices;
vertices.push_back(Point(exact_z0.real(), exact_z0.imag()));
vertices.push_back(Point(exact_z1.real(), exact_z1.imag()));
vertices.push_back(Point(exact_z2.real(), exact_z2.imag()));
vertices.push_back(Point(exact_z3.real(), exact_z3.imag()));
vertices.push_back(Point(-exact_z0.real(), -exact_z0.imag()));
vertices.push_back(Point(-exact_z1.real(), -exact_z1.imag()));
vertices.push_back(Point(-exact_z2.real(), -exact_z2.imag()));
vertices.push_back(Point(-exact_z3.real(), -exact_z3.imag()));
std::vector<int> pairings;
for (int k=0; k<8; ++k) {
pairings.push_back((k+4)%8);
}
Hyperbolic_fundamental_domain_2<Traits> domain(vertices, pairings);
return domain;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
float Hyperbolic_fundamental_domain_factory_2<Traits>::random_positive_float() {
return random_.uniform_01<float>();
}
template<class Traits>
float Hyperbolic_fundamental_domain_factory_2<Traits>::random_float() {
return random_.uniform_01<float>() * 2 - 1;
}
template<class Traits>
Complex_number<float>
Hyperbolic_fundamental_domain_factory_2<Traits>::
random_complex_float()
{
Complex_number<float> result (random_float(), random_positive_float());
while (norm(result) >= 1) {
result.real(random_float());
result.imag(random_positive_float());
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
typename Traits::FT
Hyperbolic_fundamental_domain_factory_2<Traits>::
exact_number_from_float(float x)
{
if (x < 0) {
return FT(0)-exact_number_from_float(-x);
}
return FT(int(x*CGAL_DENOMINATOR_FOR_GENERATION)%CGAL_DENOMINATOR_FOR_GENERATION)/FT(CGAL_DENOMINATOR_FOR_GENERATION);
}
template<class Traits>
typename Traits::Complex
Hyperbolic_fundamental_domain_factory_2<Traits>::
exact_complex_from_float_complex(const Complex_number<float>& z)
{
return Cmplx(exact_number_from_float(z.real()), exact_number_from_float(z.imag()));
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
bool Hyperbolic_fundamental_domain_factory_2<Traits>::
try_to_compute_inexact_z0_from_z1_z2_z3(Complex_number<float>& z0,
Complex_number<float>& z1,
Complex_number<float>& z2,
Complex_number<float>& z3)
{
if (((z2/z1).imag()<=0) || ((z3/z2).imag()<=0)) {
return false;
}
Complex_number<float> one(1.0f, 0.0f);
Complex_number<float> u = (one - conj(z1*z2)) * (one - conj(z2*z3));
float a = -(conj(u*z1)*z3).imag();
float b = (u*(conj(z3-z1))).imag();
float c = u.imag();
const float COMPUTATION_TRESHOLD = 0.00001f;
if (a+b+c> 0 - COMPUTATION_TRESHOLD) {
return false;
}
z0.real(2.0f * c / (std::sqrt(b * b - 4.0f * a * c) - b));
z0.imag(0.0f);
return true;
}
template<class Traits>
bool
Hyperbolic_fundamental_domain_factory_2<Traits>::
try_to_compute_exact_z3_from_z0_z1_z2(Cmplx& z0, Cmplx& z1, Cmplx& z2, Cmplx& z3)
{
FT zero_number (0);
FT one_number (1);
if ((z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number)) {
return false;
}
if ((norm(z0)>=one_number) || (norm(z1)>=one_number) || (norm(z2)>=one_number) || (norm(z3)>=one_number)) {
return false;
}
if (((z1/z0).imag()<=zero_number) || ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number)) {
return false;
}
Cmplx one_cmplx (FT(1), FT(0));
Cmplx two_cmplx(FT(2), FT(0));
Cmplx f_of_z0 = two_cmplx * z0 / (z0*z0 + one_cmplx);
Cmplx f_of_z1 = (z0 + z1) / (z0*z1 + one_cmplx);
Cmplx f_of_z2 = (z0 + z2) / (z0*z2 + one_cmplx);
Cmplx f_of_z3 = (z0 + z3) / (z0*z3 + one_cmplx);
Cmplx intermediate = (one_cmplx - f_of_z0*conj(f_of_z1)) * (one_cmplx - f_of_z1*conj(f_of_z2));
FT P_of_zero = intermediate.imag();
FT P_of_one = (intermediate * (one_cmplx-f_of_z2*conj(f_of_z3))).imag();
if (P_of_one == P_of_zero) {
return false;
}
FT lbda = P_of_zero / (P_of_zero - P_of_one);
Cmplx V (lbda*(f_of_z3.real()), lbda*(f_of_z3.imag()));
if ((V.imag()<=zero_number) || (norm(V)>=one_number) || ((V/f_of_z2).imag()<=zero_number)) {
return false;
}
z3 = (V - z0) / (one_cmplx - z0*V);
return true;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
bool
Hyperbolic_fundamental_domain_factory_2<Traits>::
sanity_check(Cmplx& z0, Cmplx& z1, Cmplx& z2, Cmplx& z3)
{
FT zero_number(0);
FT one_number(1);
// 1. Check the positions
if ((z0.imag()!=zero_number) || (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number)) {
return false;
}
if ((norm(z0)>=one_number) || (norm(z1)>=one_number) || (norm(z2)>=one_number) || (norm(z3)>=one_number)) {
return false;
}
if (((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number)) {
return false;
}
// 2. Check the area
Cmplx one_cmplx (one_number, zero_number);
Cmplx Z = (one_cmplx-z0*conj(z1)) * (one_cmplx-z1*conj(z2)) *(one_cmplx-z2*conj(z3)) *(one_cmplx+z3*conj(z0));
if (Z.imag()!=zero_number) {
return false;
}
return true;
}
} // namespace CGAL
#endif // CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2_H

View File

@ -0,0 +1,235 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_HYPERBOLIC_ISOMETRY_2_H
#define CGAL_HYPERBOLIC_ISOMETRY_2_H
#include <CGAL/license/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Complex_number.h>
namespace CGAL {
/*
Represents a hyperbolic isometry in the Poincare disk model the hyperbolic plane.
The isometry f is stored as list (c0, c1, c2, c3) of 4 complex numbers,
so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk.
*/
template<class Traits>
class Hyperbolic_isometry_2
{
public:
typedef Hyperbolic_isometry_2<Traits> Self;
typedef typename Traits::FT FT;
typedef typename Traits::Complex Complex_number;
typedef typename Traits::Hyperbolic_point_2 Point;
Hyperbolic_isometry_2();
Hyperbolic_isometry_2(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3);
void set_to_identity();
// Can be used to set the coefficients manually. Warning: the implementation does not check that the resulting moebius transform fixes the unit circle.
void set_coefficients(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3);
void set_coefficient(int index, const Complex_number& coefficient);
// returns the index-th coefficient
const Complex_number& get_coefficient(int index) const;
// evaluates the isometry at point
Point evaluate(const Point& point) const;
Point operator()(const Point& point) const;
private:
Complex_number coefficients_[4];
};
// returns the composition of two isometries.
template<class Traits>
Hyperbolic_isometry_2<Traits> operator*(const Hyperbolic_isometry_2<Traits>& iso1, const Hyperbolic_isometry_2<Traits>& iso2);
// template<class Traits> std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2<Traits>& isometry);
// When inverse is 'false', returns the hyperbolic translation that maps -p to zero, and zero to p.
// Otherwise, returns the hyperbolic translation that maps p to zero, and zero to -p.
template<class Traits>
Hyperbolic_isometry_2<Traits> hyperbolic_translation(const typename Traits::Hyperbolic_point_2& p,
bool inverse = false);
// When inverse is 'false', returns the hyperbolic rotation around zero that maps p to q.
// Otherwise, returns the hyperbolic rotation around zero that maps q to p.
template<class Traits>
Hyperbolic_isometry_2<Traits> hyperbolic_rotation(const typename Traits::Hyperbolic_point_2& p,
const typename Traits::Hyperbolic_point_2& q,
bool inverse = false);
// returns the hyperbolic isometry that maps p1 to q1 and p2 to q2
template<class Traits>
Hyperbolic_isometry_2<Traits> isometry_pairing_the_sides(const typename Traits::Hyperbolic_point_2& p1,
const typename Traits::Hyperbolic_point_2& p2,
const typename Traits::Hyperbolic_point_2& q1,
const typename Traits::Hyperbolic_point_2& q2);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
Hyperbolic_isometry_2<Traits>::
Hyperbolic_isometry_2()
{
set_to_identity();
}
template<class Traits>
Hyperbolic_isometry_2<Traits>::
Hyperbolic_isometry_2(const Complex_number& c0,
const Complex_number& c1,
const Complex_number& c2,
const Complex_number& c3)
{
set_coefficients(c0,c1,c2,c3);
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
void
Hyperbolic_isometry_2<Traits>::
set_to_identity()
{
set_coefficients(Complex_number(FT(1)),
Complex_number(FT(0)),
Complex_number(FT(0)),
Complex_number(FT(1)));
}
template<class Traits>
void
Hyperbolic_isometry_2<Traits>::
set_coefficients(const Complex_number& c0,
const Complex_number& c1,
const Complex_number& c2,
const Complex_number& c3)
{
set_coefficient(0, c0);
set_coefficient(1, c1);
set_coefficient(2, c2);
set_coefficient(3, c3);
}
template<class Traits>
void
Hyperbolic_isometry_2<Traits>::
set_coefficient(int index, const Complex_number& coefficient)
{
coefficients_[index] = coefficient;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
const typename Traits::Complex&
Hyperbolic_isometry_2<Traits>::
get_coefficient(int index) const
{
return coefficients_[index];
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
typename Traits::Hyperbolic_point_2
Hyperbolic_isometry_2<Traits>::
evaluate(const Point& point) const
{
Complex_number z(point.x(), point.y());
Complex_number numerator_of_the_result = coefficients_[0] * z + coefficients_[1];
Complex_number denominator_of_the_result = coefficients_[2] * z + coefficients_[3];
Complex_number result = numerator_of_the_result / denominator_of_the_result;
return Point(result.real(), result.imag());
}
template<class Traits>
typename Traits::Hyperbolic_point_2
Hyperbolic_isometry_2<Traits>::
operator()(const Point& point) const
{
return evaluate(point);
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
Hyperbolic_isometry_2<Traits> operator*(const Hyperbolic_isometry_2<Traits>& iso1,
const Hyperbolic_isometry_2<Traits>& iso2)
{
Hyperbolic_isometry_2<Traits> result;
for (int i=0; i<2; i++) {
for (int j=0; j<2; j++) {
result.set_coefficient(2*i+j,
iso1.get_coefficient(2*i) * iso2.get_coefficient(j) + iso1.get_coefficient(2*i+1) * iso2.get_coefficient(2+j));
}
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
Hyperbolic_isometry_2<Traits> hyperbolic_translation(const typename Traits::Hyperbolic_point_2& p,
bool inverse)
{
typename Traits::Complex one (typename Traits::FT(1));
typename Traits::Complex z;
if (inverse) {
z = typename Traits::Complex(p.x(), p.y());
} else {
z = - typename Traits::Complex(p.x(), p.y());
}
Hyperbolic_isometry_2<Traits> result;
result.set_coefficients(one, z, conj(z), one);
return result;
}
template<class Traits>
Hyperbolic_isometry_2<Traits> hyperbolic_rotation(const typename Traits::Hyperbolic_point_2& p,
const typename Traits::Hyperbolic_point_2& q,
bool inverse)
{
typename Traits::Complex zero (typename Traits::FT(0));
Hyperbolic_isometry_2<Traits> result;
if (inverse) {
result.set_coefficients(typename Traits::Complex(p.x(), p.y()), zero, zero, typename Traits::Complex(q.x(), q.y()));
} else {
result.set_coefficients(typename Traits::Complex(q.x(), q.y()), zero, zero, typename Traits::Complex(p.x(), p.y()));
}
return result;
}
template<class Traits>
Hyperbolic_isometry_2<Traits> isometry_pairing_the_sides(const typename Traits::Hyperbolic_point_2& p1,
const typename Traits::Hyperbolic_point_2& p2,
const typename Traits::Hyperbolic_point_2& q1,
const typename Traits::Hyperbolic_point_2& q2)
{
Hyperbolic_isometry_2<Traits> A,B,Binv,C;
A = hyperbolic_translation<Traits>(p1);
B = hyperbolic_translation<Traits>(q1);
Binv = hyperbolic_translation<Traits>(q1, true);
C = hyperbolic_rotation<Traits>(A.evaluate(p2), B.evaluate(q2));
return (Binv*C)*A;
}
} // namespace CGAL
#endif // CGAL_HYPERBOLIC_ISOMETRY_2_H

View File

@ -0,0 +1,34 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_HYPERBOLIC_SURFACE_TRAITS_2
#define CGAL_HYPERBOLIC_SURFACE_TRAITS_2
#include <CGAL/license/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Complex_number.h>
namespace CGAL {
template<class HyperbolicTraitsClass>
class Hyperbolic_surface_traits_2
: public HyperbolicTraitsClass
{
public:
typedef typename HyperbolicTraitsClass::FT FT;
typedef typename HyperbolicTraitsClass::Hyperbolic_point_2 Hyperbolic_point_2;
typedef Complex_number<FT> Complex;
};
} // namespace CGAL
#endif // CGAL_HYPERBOLIC_SURFACE_TRAITS_2

View File

@ -0,0 +1,835 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_H
#define CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_H
#include <CGAL/license/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Combinatorial_map.h>
#include <CGAL/Hyperbolic_fundamental_domain_2.h>
#include <CGAL/assertions.h>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <vector>
#include <tuple>
#include <unordered_map>
#include <utility>
namespace CGAL {
/*
Represents a geodesic triangulation of a closed orientable hyperbolic surface.
The triangulation is stored as combinatorial map decorated with one cross-ratio per edge.
It is also possible to specify an anchor for the triangulation. An anchor consists in 1) a dart of the combinatorial map, belonging by definition to a vertex V and a triangle T, together with
2) three points A,B,C in the hyperbolic plane. The points A,B,C are the three vertices in counter-clockwise order of a triangle. This triangle is a lift
of T, and A is a lift of V.
*/
template<class Traits>
struct Combinatorial_map_with_cross_ratios_item
{
template <class CMap>
struct Dart_wrapper
{
typedef Cell_attribute<CMap, Complex_number<typename Traits::FT> > Edge_attrib;
typedef std::tuple<void, Edge_attrib, void> Attributes;
};
};
template<class Traits, class Attributes = Combinatorial_map_with_cross_ratios_item<Traits> >
class Triangulation_on_hyperbolic_surface_2
{
public:
typedef Combinatorial_map<2, Attributes> Combinatorial_map_with_cross_ratios;
struct Anchor
{
typename Combinatorial_map_with_cross_ratios::Dart_descriptor dart;
typename Traits::Hyperbolic_point_2 vertices[3];
Anchor(){};
Anchor(typename Combinatorial_map_with_cross_ratios::Dart_descriptor dart,
typename Traits::Hyperbolic_point_2 a, typename Traits::Hyperbolic_point_2 b, typename Traits::Hyperbolic_point_2 c)
{
this->dart = dart;
vertices[0] = a;
vertices[1] = b;
vertices[2] = c;
}
};
typedef typename Combinatorial_map_with_cross_ratios::Dart_descriptor Dart_descriptor;
// typedef typename Combinatorial_map_with_cross_ratios::Dart_range Dart_range;
// typedef typename Combinatorial_map_with_cross_ratios::Dart_range::iterator Dart_iterator;
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> Vertex_range;
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> Edge_range;
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> Face_range;
typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor;
typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range Dart_const_range;
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<0> Vertex_const_range;
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> Edge_const_range;
typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range;
typedef typename Traits::FT Number;
typedef typename Traits::Complex Complex_number;
typedef typename Traits::Hyperbolic_point_2 Point;
typedef Hyperbolic_isometry_2<Traits> Isometry;
typedef Hyperbolic_fundamental_domain_2<Traits> Domain;
Triangulation_on_hyperbolic_surface_2() {};
Triangulation_on_hyperbolic_surface_2(const Hyperbolic_fundamental_domain_2<Traits>& domain);
// Triangulation_on_hyperbolic_surface_2(Combinatorial_map_with_cross_ratios& cmap);
Triangulation_on_hyperbolic_surface_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& anchor);
Combinatorial_map_with_cross_ratios& combinatorial_map();
bool has_anchor() const;
Anchor& anchor();
const Anchor& anchor() const;
void to_stream(std::ostream& s) const;
void from_stream(std::istream& s);
bool is_Delaunay_flippable(Dart_const_descriptor dart) const;
void flip(Dart_descriptor dart);
bool is_Delaunay() const;
int make_Delaunay();
std::vector<std::tuple<Dart_const_descriptor, Point, Point, Point> > lift(bool center=true) const;
bool is_valid() const;
// The following methods are not documented but they are non private for internal future use.
Dart_descriptor ccw(Dart_descriptor dart);
Dart_descriptor cw(Dart_descriptor dart);
Dart_descriptor opposite(Dart_descriptor dart);
Dart_const_descriptor const_ccw(Dart_const_descriptor dart) const;
Dart_const_descriptor const_cw(Dart_const_descriptor dart) const;
Dart_const_descriptor const_opposite(Dart_const_descriptor dart) const;
Complex_number get_cross_ratio(Dart_const_descriptor dart) const;
// returns the cross ratio of the points a,b,c,d
Complex_number cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const;
// returns the point d such that the cross ratio of a,b,c,d is cratio
Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const Complex_number& cratio) const;
// Wrapper around the Cmap for iterating over vertices, edges or faces.
Vertex_range vertices_range() {
return combinatorial_map_.template one_dart_per_cell<0>();
}
Edge_range edges_range() {
return combinatorial_map_.template one_dart_per_cell<1>();
}
Face_range faces_range() {
return combinatorial_map_.template one_dart_per_cell<2>();
}
Vertex_const_range vertices_const_range() const {
return combinatorial_map_.template one_dart_per_cell<0>();
}
Edge_const_range edges_const_range() const {
return combinatorial_map_.template one_dart_per_cell<1>();
}
Face_const_range faces_const_range() const {
return combinatorial_map_.template one_dart_per_cell<2>();
}
protected:
Combinatorial_map_with_cross_ratios combinatorial_map_;
bool has_anchor_ = false;
Anchor anchor_;
Dart_descriptor pick_edge_to_flip();
Dart_const_descriptor pick_edge_to_flip() const;
void copy_from(Combinatorial_map_with_cross_ratios& cmap);
void copy_from(Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor);
};
// template<class Traits, class Attributes> std::ostream& operator<<(std::ostream& s, const Triangulation_on_hyperbolic_surface_2<Traits, Attributes>& triangulation);
// template<class Traits, class Attributes> void operator>>(std::istream& s, Triangulation_on_hyperbolic_surface_2<Traits, Attributes>& triangulation);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
Triangulation_on_hyperbolic_surface_2<Traits,Attributes>::
Triangulation_on_hyperbolic_surface_2(const Domain& domain)
{
// (Triangulates by adding an internal edge between domain.vertex(size-1) and the other vertices)
combinatorial_map_.clear();
std::size_t size = domain.size();
// Make the triangles
std::vector<Dart_descriptor> dart_of_triangle(size-2);
for (std::size_t k=0; k<size-2; ++k) {
dart_of_triangle[k] = combinatorial_map_.make_combinatorial_polygon(3);
}
// Sew the internal edges and set their cross ratios
Dart_descriptor dart_1, dart_2;
Point p0, p1, p2, p3;
for (std::size_t k=1; k<size-2; ++k) {
dart_1 = dart_of_triangle[k];
dart_2 = cw(dart_of_triangle[k-1]);
p0 = domain.vertex(size-1);
p1 = domain.vertex(k-1);
p2 = domain.vertex(k);
p3 = domain.vertex(k+1);
combinatorial_map_.template sew<2>(dart_1, dart_2);
combinatorial_map_.template set_attribute<1>(dart_1, combinatorial_map_.template create_attribute<1>(cross_ratio(p0,p1,p2,p3)));
}
// Sew the boundary edges and set their cross ratios
for (std::size_t k1=0; k1<size; k1++) {
std::size_t k2 = domain.paired_side(k1);
p0 = domain.vertex((k1+1)%size);
p2 = domain.vertex(k1);
if (k1 == size-1) {
dart_1 = dart_of_triangle[0];
p1 = domain.vertex(1);
} else if (k1 == size-2) {
dart_1 = cw(dart_of_triangle[size-3]);
p1 = domain.vertex(size-3);
} else {
dart_1 = ccw(dart_of_triangle[k1]);
p1 = domain.vertex(size-1);
}
if (k2 == size-1) {
dart_2 = dart_of_triangle[0];
p3 = domain.vertex(1);
} else if (k2 == size-2) {
dart_2 = cw(dart_of_triangle[size-3]);
p3 = domain.vertex(size-3);
} else {
dart_2 = ccw(dart_of_triangle[k2]);
p3 = domain.vertex(size-1);
}
p3 = domain.side_pairing(k1).evaluate(p3);
if (combinatorial_map_.template is_sewable<2>(dart_1, dart_2)) {
combinatorial_map_.template sew<2>(dart_1, dart_2);
combinatorial_map_.template set_attribute<1>(dart_1, combinatorial_map_.template create_attribute<1>(cross_ratio(p0,p1,p2,p3)));
}
}
// Set the anchor
anchor_.dart = dart_of_triangle[0];
anchor_.vertices[0] = domain.vertex(size-1);
anchor_.vertices[1] = domain.vertex(0);
anchor_.vertices[2] = domain.vertex(1);
has_anchor_ = true;
}
/* template<class Traits, class Attributes> */
/* Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Triangulation_on_hyperbolic_surface_2(Combinatorial_map_with_cross_ratios& cmap) { */
/* copy_from(cmap); */
/* } */
template<class Traits, class Attributes>
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
Triangulation_on_hyperbolic_surface_2(Combinatorial_map_with_cross_ratios& cmap,
Anchor& anchor)
{
copy_from(cmap, anchor);
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Combinatorial_map_with_cross_ratios&
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
combinatorial_map()
{
return combinatorial_map_;
}
template<class Traits, class Attributes>
bool
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
has_anchor() const
{
CGAL_precondition(is_valid());
return has_anchor_;
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Anchor&
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
anchor()
{
CGAL_precondition(is_valid() && has_anchor());
return anchor_;
}
template<class Traits, class Attributes>
const typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Anchor&
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
anchor() const
{
CGAL_precondition(is_valid() && has_anchor());
return anchor_;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
bool
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
is_Delaunay_flippable(Dart_const_descriptor dart) const
{
CGAL_precondition(is_valid());
return (get_cross_ratio(dart).imag() > Number(0));
}
template<class Traits, class Attributes>
void
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
flip(Dart_descriptor dart)
{
CGAL_precondition(is_valid());
// First gather all the information needed
Dart_descriptor a = opposite(dart); // Get a fresh descriptor
Dart_descriptor b = ccw(a);
Dart_descriptor c = cw(a);
Dart_descriptor d = opposite(a);
Dart_descriptor e = ccw(d);
Dart_descriptor f = cw(d);
Complex_number cross_ratio_AB = get_cross_ratio(e);
Complex_number cross_ratio_BC = get_cross_ratio(f);
Complex_number cross_ratio_CD = get_cross_ratio(b);
Complex_number cross_ratio_DA = get_cross_ratio(c);
Complex_number cross_ratio_AC = get_cross_ratio(a);
// Modify the anchor
if (anchor_.dart == a) {
anchor_.dart = e;
anchor_.vertices[1] = Point(fourth_point_from_cross_ratio(anchor_.vertices[1], anchor_.vertices[2], anchor_.vertices[0], cross_ratio_AC));
} else if (anchor_.dart == b) {
anchor_.vertices[2] = Point(fourth_point_from_cross_ratio(anchor_.vertices[0], anchor_.vertices[1], anchor_.vertices[2], cross_ratio_AC));
} else if (anchor_.dart == c) {
anchor_.vertices[2] = Point(fourth_point_from_cross_ratio(anchor_.vertices[2], anchor_.vertices[0], anchor_.vertices[1], cross_ratio_AC));
} else if (anchor_.dart == d) {
anchor_.dart = b;
anchor_.vertices[1] = Point(fourth_point_from_cross_ratio(anchor_.vertices[1], anchor_.vertices[2], anchor_.vertices[0], cross_ratio_AC));
} else if (anchor_.dart == e) {
anchor_.vertices[2] = Point(fourth_point_from_cross_ratio(anchor_.vertices[0], anchor_.vertices[1], anchor_.vertices[2], cross_ratio_AC));
} else if (anchor_.dart == f) {
anchor_.vertices[2] = Point(fourth_point_from_cross_ratio(anchor_.vertices[2], anchor_.vertices[0], anchor_.vertices[1], cross_ratio_AC));
}
// Compute the new cross ratios
Complex_number one (Number(1), Number(0));
Complex_number cross_ratio_BD = (cross_ratio_AC) / ((cross_ratio_AC) - one);
Complex_number cross_ratio_AB_2 = one - (one - (cross_ratio_AB)) * (cross_ratio_AC);
Complex_number cross_ratio_BC_2 = one - (one - (cross_ratio_BC)) / (cross_ratio_BD);
Complex_number cross_ratio_CD_2 = one - (one - (cross_ratio_CD)) * (cross_ratio_AC);
Complex_number cross_ratio_DA_2 = one - (one - (cross_ratio_DA)) / (cross_ratio_BD);
// Make the topological flip
combinatorial_map_.template unlink_beta<1>(a);
combinatorial_map_.template unlink_beta<1>(b);
combinatorial_map_.template unlink_beta<1>(c);
combinatorial_map_.template unlink_beta<1>(d);
combinatorial_map_.template unlink_beta<1>(e);
combinatorial_map_.template unlink_beta<1>(f);
combinatorial_map_.template link_beta<1>(b, a);
combinatorial_map_.template link_beta<1>(a, f);
combinatorial_map_.template link_beta<1>(f, b);
combinatorial_map_.template link_beta<1>(e, d);
combinatorial_map_.template link_beta<1>(d, c);
combinatorial_map_.template link_beta<1>(c, e);
// And give the new cross ratios to the edges
combinatorial_map_.template info<1>(a) = cross_ratio_BD;
combinatorial_map_.template info<1>(e) = cross_ratio_AB_2;
combinatorial_map_.template info<1>(f) = cross_ratio_BC_2;
combinatorial_map_.template info<1>(b) = cross_ratio_CD_2;
combinatorial_map_.template info<1>(c) = cross_ratio_DA_2;
// Take care of the particular cases where we need to "flip again"
if (opposite(e) == b) {
combinatorial_map_.template info<1>(e) = one - (one - cross_ratio_AB_2) * (cross_ratio_AC);
}
if (opposite(f) == c) {
combinatorial_map_.template info<1>(f) = one - (one - cross_ratio_BC_2) / (cross_ratio_BD);
}
}
template<class Traits, class Attributes>
bool
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
is_Delaunay() const
{
if (! is_valid()) {
return false;
}
return (pick_edge_to_flip() == nullptr);
}
template<class Traits, class Attributes>
int
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
make_Delaunay()
{
CGAL_precondition(is_valid());
int number_of_flips_done = 0;
Dart_descriptor edge_to_flip = pick_edge_to_flip();
while (edge_to_flip != nullptr) {
flip(edge_to_flip);
edge_to_flip = pick_edge_to_flip();
number_of_flips_done++;
}
return number_of_flips_done;
}
template<class Traits, class Attributes>
std::vector<std::tuple<typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_const_descriptor,
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Point,
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Point,
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Point> >
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
lift(bool center) const
{
CGAL_precondition(is_valid() && has_anchor());
std::vector<std::tuple<Dart_const_descriptor, Point, Point, Point> > realizations;
size_t visited_darts_mark = combinatorial_map_.get_new_mark();
combinatorial_map_.unmark_all(visited_darts_mark);
struct Compare
{
bool operator()(const std::pair<Dart_const_descriptor,double>& x,
const std::pair<Dart_const_descriptor,double>& y)
{
return x.second > y.second;
}
};
std::priority_queue<std::pair<Dart_const_descriptor, double>,
std::vector<std::pair<Dart_const_descriptor, double> >, Compare> queue;
std::unordered_map<Dart_const_descriptor, Point> positions;
Dart_const_range darts = combinatorial_map_.darts();
combinatorial_map_.mark(anchor_.dart, visited_darts_mark);
combinatorial_map_.mark(const_ccw(anchor_.dart), visited_darts_mark);
combinatorial_map_.mark(const_cw(anchor_.dart), visited_darts_mark);
if (center) {
Isometry center_the_drawing = hyperbolic_translation<Traits>(anchor_.vertices[0]);
positions[anchor_.dart] = center_the_drawing.evaluate(anchor_.vertices[0]);
positions[const_ccw(anchor_.dart)] = center_the_drawing.evaluate(anchor_.vertices[1]);
positions[const_cw(anchor_.dart)] = center_the_drawing.evaluate(anchor_.vertices[2]);
} else {
positions[anchor_.dart] = anchor_.vertices[0];
positions[const_ccw(anchor_.dart)] = anchor_.vertices[1];
positions[const_cw(anchor_.dart)] = anchor_.vertices[2];
}
std::tuple<Dart_const_descriptor, Point, Point, Point> value =
std::make_tuple(anchor_.dart,
positions[anchor_.dart],
positions[const_ccw(anchor_.dart)],
positions[const_cw(anchor_.dart)]);
realizations.push_back(value);
Complex_number anchor_z0(anchor_.vertices[0].x(), anchor_.vertices[0].y());
Complex_number anchor_z1(anchor_.vertices[1].x(), anchor_.vertices[1].y());
Complex_number anchor_z2(anchor_.vertices[2].x(), anchor_.vertices[2].y());
double weight_of_anchor_dart = CGAL::to_double(norm(anchor_z0) + norm(anchor_z1));
double weight_of_ccw_anchor_dart = CGAL::to_double(norm(anchor_z1) + norm(anchor_z2));
double weight_of_cw_anchor_dart = CGAL::to_double(norm(anchor_z2) + norm(anchor_z0));
queue.push(std::make_pair(anchor_.dart, weight_of_anchor_dart));
queue.push(std::make_pair(const_ccw(anchor_.dart), weight_of_ccw_anchor_dart));
queue.push(std::make_pair(const_cw(anchor_.dart), weight_of_cw_anchor_dart));
while (! queue.empty()) {
Dart_const_descriptor invader = queue.top().first;
queue.pop();
Dart_const_descriptor invaded = const_opposite(invader);
if (!combinatorial_map_.is_marked(invaded, visited_darts_mark)) {
combinatorial_map_.mark(invaded, visited_darts_mark);
combinatorial_map_.mark(const_ccw(invaded), visited_darts_mark);
combinatorial_map_.mark(const_cw(invaded), visited_darts_mark);
const Point& a = positions[const_ccw(invader)];
const Point& b = positions[const_cw(invader)];
const Point& c = positions[invader];
Complex_number cross_ratio = get_cross_ratio(invader);
positions[invaded] = a;
positions[const_ccw(invaded)] = c;
Point d = fourth_point_from_cross_ratio(a, b, c, cross_ratio);
positions[const_cw(invaded)] = d;
Complex_number za(a.x(), a.y());
Complex_number zc(c.x(), c.y());
double invaded_distance_to_zero = CGAL::to_double(norm(za));
double invaded_ccw_distance_to_zero = CGAL::to_double(norm(zc));
Complex_number znew(positions[const_cw(invaded)].x(), positions[const_cw(invaded)].y());
double invaded_cw_distance_to_zero = CGAL::to_double(norm(znew));
double invaded_ccw_weight = invaded_ccw_distance_to_zero + invaded_cw_distance_to_zero;
double invaded_cw_weight = invaded_cw_distance_to_zero + invaded_distance_to_zero;
queue.push(std::make_pair(const_ccw(invaded), invaded_ccw_weight));
queue.push(std::make_pair(const_cw(invaded), invaded_cw_weight));
value = std::make_tuple(invaded, Point(a), Point(c), Point(d));
realizations.push_back(value);
}
}
combinatorial_map_.free_mark(visited_darts_mark);
return realizations;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
bool
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
is_valid() const
{
// 1. Check the combinatorial map
// Check that the combinatorial map is valid
if (!combinatorial_map_.is_valid()) {
return false;
}
// Check that the combinatorial map has no 1,2-boundary
for (int k=1; k<3; ++k) {
if (!combinatorial_map_.is_without_boundary(k)) {
return false;
}
}
// 2. Check the anchor, if any
if (has_anchor_) {
// Check that the dart descriptor of the anchor points to a dart of the combinatorial map
if (!combinatorial_map_.is_dart_used(anchor_.dart)) {
return false;
}
// Check that the three vertices of the anchor lie within the open unit disk
for (int k=0; k<3; ++k) {
// if (anchor_.vertices[k].get_z() >= Number(1)) {
if (norm(Complex_number(anchor_.vertices[k].x(),anchor_.vertices[k].y())) >= Number(1)) {
return false;
}
}
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
void
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
to_stream(std::ostream& s) const
{
CGAL_precondition(is_valid() && has_anchor());
// Give indices to the darts
std::map<Dart_const_descriptor, int> darts_indices;
int current_dart_index = 0;
for (typename Dart_const_range::const_iterator it=combinatorial_map_.darts().begin(); it!=combinatorial_map_.darts().end(); ++it) {
darts_indices[it] = current_dart_index;
current_dart_index++;
}
// Store the number of darts
s << current_dart_index << std::endl;
// Store the anchor, if any
if (has_anchor_) {
s << "yes" << std::endl;
s << darts_indices[anchor_.dart] << std::endl;
s << anchor_.vertices[0] << std::endl;
s << anchor_.vertices[1] << std::endl;
s << anchor_.vertices[2] << std::endl;
} else {
s << "no" << std::endl;
}
// Store the triangles
for (typename Face_const_range::const_iterator it = faces_const_range().begin(); it != faces_const_range().end(); ++it) {
s << darts_indices[it] << std::endl;
s << darts_indices[const_cw(it)] << std::endl;
s << darts_indices[const_ccw(it)] << std::endl;
}
// Store the edges
for (typename Edge_const_range::const_iterator it = edges_const_range().begin(); it != edges_const_range().end(); ++it) {
s << darts_indices[it] << std::endl;
s << darts_indices[const_opposite(it)] << std::endl;
s << get_cross_ratio(it);
}
}
template<class Traits, class Attributes>
void
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
from_stream(std::istream& s)
{
combinatorial_map_.clear();
// Load the number of darts
std::string line;
s >> line;
int nb_darts = std::stoi(line);
// Load the anchor
int anchor_dart_id = 0;
s >> line;
if (!line.compare("yes")) {
has_anchor_ = true;
s >> line;
anchor_dart_id = std::stoi(line); // (*) anchor_.dart_id is set at the end of the function
s >> anchor_.vertices[0];
s >> anchor_.vertices[1];
s >> anchor_.vertices[2];
} else {
has_anchor_ = false;
}
// Load the triangles
std::vector<Dart_descriptor> darts_by_id (nb_darts);
int index1, index2, index3;
for (int k=0; k<nb_darts/3; ++k) {
Dart_descriptor triangle_dart = combinatorial_map_.make_combinatorial_polygon(3);
s >> line;
index1 = std::stoi(line);
s >> line;
index2 = std::stoi(line);
s >> line;
index3 = std::stoi(line);
darts_by_id[index1] = triangle_dart;
darts_by_id[index2] = cw(triangle_dart);
darts_by_id[index3] = ccw(triangle_dart);
}
// Load the edges
Dart_descriptor dart_1, dart_2;
Complex_number cross_ratio;
for (int k=0; k<nb_darts/2; ++k) {
s >> line;
index1 = std::stoi(line);
s >> line;
index2 = std::stoi(line);
dart_1 = darts_by_id[index1];
dart_2 = darts_by_id[index2];
combinatorial_map_.template sew<2>(dart_1, dart_2);
s >> cross_ratio;
combinatorial_map_.template set_attribute<1>(dart_1, combinatorial_map_.template create_attribute<1>(cross_ratio));
}
// (*) here
if (has_anchor_) {
anchor_.dart = darts_by_id[anchor_dart_id];
}
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::ccw(Dart_descriptor dart) {
return combinatorial_map_.beta(dart, 1);
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::cw(Dart_descriptor dart) {
return combinatorial_map_.beta(dart, 0);
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::opposite(Dart_descriptor dart) {
return combinatorial_map_.opposite(dart);
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_const_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::const_ccw(Dart_const_descriptor dart) const {
return combinatorial_map_.beta(dart, 1);
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_const_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::const_cw(Dart_const_descriptor dart) const {
return combinatorial_map_.beta(dart, 0);
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_const_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::const_opposite(Dart_const_descriptor dart) const {
return combinatorial_map_.opposite(dart);
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Complex_number Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::get_cross_ratio(Dart_const_descriptor dart) const {
return combinatorial_map_.template info_of_attribute<1>(combinatorial_map_.template attribute<1>(dart));
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_descriptor Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
pick_edge_to_flip()
{
auto& cm = combinatorial_map_.darts();
for (auto it=cm.begin(); it!=cm.end(); ++it) {
if (is_Delaunay_flippable(it)) {
return it;
}
}
return nullptr;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Dart_const_descriptor
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
pick_edge_to_flip() const
{
const auto& cm = combinatorial_map_.darts();
for (auto it=cm.begin(); it!=cm.end(); ++it) {
if (is_Delaunay_flippable(it) ) {
return it;
}
}
return nullptr;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
void
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
copy_from(Combinatorial_map_with_cross_ratios& cmap)
{
//combinatorial_map_.copy_from_const(cmap);
combinatorial_map_.copy(cmap);
has_anchor_ = false;
}
template<class Traits, class Attributes>
void
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
copy_from(Combinatorial_map_with_cross_ratios& cmap,
const Anchor& anchor)
{
// Because of the anchor, we must operate the copy ourself
combinatorial_map_.clear();
// Copy the triangles and fill the darts conversion table
std::map<Dart_const_descriptor, Dart_descriptor> darts_table;
for (typename Face_const_range::const_iterator it=cmap.template one_dart_per_cell<2>().begin(); it!=cmap.template one_dart_per_cell<2>().end(); ++it) {
Dart_descriptor new_dart = combinatorial_map_.make_combinatorial_polygon(3);
darts_table[it] = new_dart;
darts_table[cmap.beta(it,0)] = combinatorial_map_.beta(new_dart,0);
darts_table[cmap.beta(it,1)] = combinatorial_map_.beta(new_dart,1);
}
// Sew the edges and set their cross-ratios
for (typename Edge_const_range::const_iterator it=cmap.template one_dart_per_cell<1>().begin(); it!=cmap.template one_dart_per_cell<1>().end(); ++it) {
Dart_descriptor dart_1 = darts_table[it];
Dart_descriptor dart_2 = darts_table[cmap.opposite(it)];
Complex_number cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it));
combinatorial_map_.template sew<2>(dart_1, dart_2);
combinatorial_map_.template set_attribute<1>(dart_1, combinatorial_map_.template create_attribute<1>(cratio));
}
cmap.opposite(anchor.dart);
// Set the anchor
anchor_.dart = darts_table[anchor.dart];
for (int k=0; k<3; ++k) {
anchor_.vertices[k] = anchor.vertices[k];
}
has_anchor_ = true;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
typename Traits::Complex
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const
{
Complex_number za (a.x(), a.y());
Complex_number zb (b.x(), b.y());
Complex_number zc (c.x(), c.y());
Complex_number zd (d.x(), d.y());
return (zd-zb)*(zc-za) / ((zd-za)*(zc-zb));
}
template<class Traits, class Attributes>
typename Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::Point
Triangulation_on_hyperbolic_surface_2<Traits, Attributes>::
fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c,
const Complex_number& cratio) const
{
Complex_number za (a.x(), a.y());
Complex_number zb (b.x(), b.y());
Complex_number zc (c.x(), c.y());
Complex_number result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc));
return Point(result.real(), result.imag());
}
} // namespace CGAL
#endif // CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_H

View File

@ -0,0 +1,66 @@
// Copyright (c) 2024
// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud
#ifndef CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_IO_H
#define CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_IO_H
#include <CGAL/license/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/assertions.h>
#include <iostream>
namespace CGAL {
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2<Traits>& domain)
{
CGAL_precondition(domain.is_valid());
return domain.to_stream(s);
}
template<class Traits>
std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2<Traits>& domain)
{
return domain.from_stream(s);
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits>
std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2<Traits>& isometry)
{
for (int k=0; k<4; ++k) {
s << isometry.get_coefficient(k);
}
return s;
}
////////////////////////////////////////////////////////////////////////////////
template<class Traits, class Attributes>
std::ostream& operator<<(std::ostream& s, const Triangulation_on_hyperbolic_surface_2<Traits, Attributes>& triangulation)
{
triangulation.to_stream(s);
return s;
}
template<class Traits, class Attributes>
void operator>>(std::istream& s, Triangulation_on_hyperbolic_surface_2<Traits, Attributes>& triangulation)
{
triangulation.from_stream(s);
}
} // namespace CGAL
#endif // CGAL_TRIANGULATION_ON_HYPERBOLIC_SURFACE_2_IO_H

View File

@ -0,0 +1,3 @@
INRIA Nancy -- France
Université de Lorraine -- France
Université Gustave Eiffel Marne-la-Vallee -- France

View File

@ -0,0 +1,26 @@
Algebraic_foundations
Arithmetic_kernel
BGL
CGAL_Core
Cartesian_kernel
Circulator
Combinatorial_map
Distance_2
Distance_3
Filtered_kernel
Hash_map
Homogeneous_kernel
Installation
Intersections_2
Intersections_3
Interval_support
Kernel_23
Kernel_d
Modular_arithmetic
Number_types
Profiling_tools
Property_map
Random_numbers
STL_Extension
Stream_support
Triangulation_on_hyperbolic_surface_2

View File

@ -0,0 +1,5 @@
Package Triangulation_on_hyperbolic_surface_2 : provides
triangulations of closed oriented hyperbolic surfaces,
Delaunay flip algorithm on those triangulations,
construction of the triangulations from convex geodesic fundamental domains,
construction of such domains for genus 2 surfaces

View File

@ -0,0 +1,3 @@
Vincent Despré <vincent.despre@loria.fr>
Loïc Dubois <loic.dubois@univ-eiffel.fr>
Monique Teillaud <monique.teillaud@inria.fr>

View File

@ -0,0 +1,16 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.12...3.31)
project(Triangulation_on_hyperbolic_surface_2_Tests)
find_package(CGAL REQUIRED)
# create a target per cppfile
file(
GLOB cppfiles
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
foreach(cppfile ${cppfiles})
create_single_source_cgal_program("${cppfile}")
endforeach()

View File

@ -0,0 +1,65 @@
#include <CGAL/Exact_rational.h>
#include <CGAL/Cartesian.h>
#include <CGAL/Algebraic_kernel_for_circles_2_2.h>
#include <CGAL/Circular_kernel_2/Intersection_traits.h>
#include <CGAL/Circular_kernel_2.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_factory_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2_IO.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h>
#include <iostream>
#include <sstream>
#include <vector>
typedef CGAL::Circular_kernel_2<CGAL::Cartesian<CGAL::Exact_rational>,CGAL::Algebraic_kernel_for_circles_2_2<CGAL::Exact_rational>> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef CGAL::Hyperbolic_fundamental_domain_factory_2<Traits> Factory;
typedef CGAL::Triangulation_on_hyperbolic_surface_2<Traits> Triangulation;
typedef typename Traits::Hyperbolic_point_2 Point;
int main()
{
Factory factory;
Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459);
Triangulation triangulation0 = Triangulation(domain);
assert(triangulation0.is_valid());
Triangulation triangulation (triangulation0);
assert(triangulation.has_anchor());
std::stringstream buffer;
buffer << triangulation;
buffer >> triangulation;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> input_not_centered;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> input_centered;
input_not_centered = triangulation.lift(false);
input_centered = triangulation.lift();
triangulation.make_Delaunay();
assert(triangulation.is_Delaunay());
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> output_not_centered;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> output_centered;
output_not_centered = triangulation.lift(false);
output_centered = triangulation.lift();
Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.combinatorial_map();
Triangulation::Anchor& anchor = triangulation.anchor();
assert(cmap.is_dart_used(anchor.dart));
std::cout << "printing triangulation for test purposes: " << std::endl << triangulation;
return 0;
}

View File

@ -0,0 +1,51 @@
#include <CGAL/Complex_number.h>
#include <CGAL/Exact_rational.h>
#include <CGAL/Interval_nt.h>
#include <iostream>
#include <sstream>
typedef CGAL::Exact_rational Exact_rational;
typedef CGAL::Interval_nt<> Interval;
typedef CGAL::Complex_number<Exact_rational> Complex_rational;
typedef CGAL::Complex_number<Interval> Complex_interval;
int main()
{
// Complex_rational tests :
Complex_rational zero_rational = Complex_rational ();
assert(zero_rational == Complex_rational(Exact_rational(0), Exact_rational(0)));
Complex_rational one_rational (Exact_rational(1));
assert(one_rational == Complex_rational(Exact_rational(1), Exact_rational(0)));
Complex_rational z1_rational (Exact_rational(1,2), Exact_rational(-3));
z1_rational = - z1_rational;
Complex_rational z2_rational;
z2_rational.real(Exact_rational(-5,7));
z2_rational.imag(Exact_rational(11,13));
z2_rational = conj(z2_rational) + z1_rational - one_rational;
assert(- z1_rational * z1_rational / z2_rational == -Complex_rational(Exact_rational(855491,632146), Exact_rational(844298,316073)));
assert(z1_rational.real() == Exact_rational(-1,2));
assert(z1_rational.imag() == Exact_rational(3));
assert(norm(z1_rational) == Exact_rational(37,4));
assert(z1_rational != z2_rational);
assert(z2_rational == z2_rational);
assert(z2_rational == Complex_rational(Exact_rational(-31,14), Exact_rational(28,13)));
std::cout << "printing a complex for test purposes : " << std::endl << z2_rational << std::endl;
Complex_rational z3_rational;
std::stringstream buffer;
buffer << z2_rational;
buffer >> z3_rational;
assert(z3_rational == z2_rational);
// Complex_interval test :
Complex_interval z_interval (Interval(1, 2), Interval(1, 2));
assert(norm(z_interval * z_interval / Complex_interval(Interval(5, 6))) < Interval(10,20));
return 0;
}

View File

@ -0,0 +1,81 @@
#include <CGAL/Exact_rational.h>
#include <CGAL/Cartesian.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2_IO.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <iostream>
#include <vector>
typedef CGAL::Cartesian<CGAL::Exact_rational> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef typename Traits::FT FT;
typedef typename Traits::Hyperbolic_point_2 Point;
typedef typename Traits::Complex Complex;
int main()
{
std::vector<Point> vertices;
Point z0 = Point(FT("4881/5000"),FT("0"));
Point z1 = Point(FT("9211/10000"),FT("2733/10000"));
Point z2 = Point(FT("1709/5000"),FT("7253/10000"));
Point z3 = Point(FT("-427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000"));
Point z4 = Point(FT("-4881/5000"),FT("0"));
Point z5 = Point(FT("-9211/10000"),FT("-2733/10000"));
Point z6 = Point(FT("-1709/5000"),FT("-7253/10000"));
Point z7 = Point(FT("427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("-582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000"));
vertices.push_back(z0);
vertices.push_back(z1);
vertices.push_back(z2);
vertices.push_back(z3);
vertices.push_back(z4);
vertices.push_back(z5);
vertices.push_back(z6);
vertices.push_back(z7);
std::vector<std::size_t> pairings;
for (std::size_t k=0; k<8; ++k) {
pairings.push_back((k+4)%8);
}
Domain domain = Domain(vertices, pairings);
assert(domain.size()==8);
for (std::size_t k=0; k<8; ++k) {
assert(domain.vertex(k)==vertices[k]);
assert(domain.paired_side(k)==(k+4)%8);
assert(domain.side_pairing(k).evaluate(domain.vertex((k+4)%8))==domain.vertex((k+1)%8));
assert(domain.side_pairing(k).evaluate(domain.vertex((k+5)%8))==domain.vertex(k));
}
assert(domain.is_valid());
Domain domain_prime = Domain(vertices, pairings);
assert(domain_prime.size()==8);
for (std::size_t k=0; k<8; ++k) {
assert(domain_prime.vertex(k)==vertices[k]);
assert(domain_prime.paired_side(k)==(k+4)%8);
assert(domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+4)%8))==domain_prime.vertex((k+1)%8));
assert(domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+5)%8))==domain_prime.vertex(k));
}
Domain domain_ter = Domain();
std::stringstream buffer;
buffer << domain;
buffer >> domain_ter;
assert(domain_ter.size()==8);
for (std::size_t k=0; k<8; ++k) {
assert(domain_ter.vertex(k)==vertices[k]);
assert(domain_ter.paired_side(k)==(k+4)%8);
}
std::cout << "printing a domain for test purposes : " << std::endl << domain << std::endl;
return 0;
}

View File

@ -0,0 +1,31 @@
#include <CGAL/Exact_rational.h>
#include <CGAL/Cartesian.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_factory_2.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <iostream>
typedef CGAL::Cartesian<CGAL::Exact_rational> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef CGAL::Hyperbolic_fundamental_domain_factory_2<Traits> Factory;
typedef typename Traits::FT FT;
typedef typename Traits::Hyperbolic_point_2 Point;
typedef typename Traits::Complex Complex;
int main()
{
Factory factory;
Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459);
assert(domain.size()==8);
for (std::size_t k=0; k<8; ++k) {
assert(domain.paired_side(k)==(k+4)%8);
}
return 0;
}

View File

@ -0,0 +1,88 @@
#include <CGAL/Exact_rational.h>
#include <CGAL/Cartesian.h>
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_isometry_2.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2_IO.h>
#include <iostream>
typedef CGAL::Cartesian<CGAL::Exact_rational> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_isometry_2<Traits> Isometry;
typedef typename Traits::FT FT;
typedef typename Traits::Hyperbolic_point_2 Point;
typedef typename Traits::Complex Complex;
int main()
{
Isometry identity_1 = Isometry ();
assert(identity_1.get_coefficient(0)==Complex(FT(1)));
assert(identity_1.get_coefficient(1)==Complex(FT(0)));
assert(identity_1.get_coefficient(2)==Complex(FT(0)));
assert(identity_1.get_coefficient(3)==Complex(FT(1)));
Isometry identity_2;
identity_2.set_to_identity();
assert(identity_2.get_coefficient(0)==Complex(FT(1)));
assert(identity_2.get_coefficient(1)==Complex(FT(0)));
assert(identity_2.get_coefficient(2)==Complex(FT(0)));
assert(identity_2.get_coefficient(3)==Complex(FT(1)));
Isometry f;
f.set_coefficient(0, Complex(FT(-12,17), FT(1,3)));
f.set_coefficient(1, Complex(FT(56,7), FT(21,5)));
f.set_coefficient(2, Complex(FT(56,7), FT(-21,5)));
f.set_coefficient(3, Complex(FT(-12,17), FT(-1,3)));
assert(f.get_coefficient(0)==Complex(FT(-12,17), FT(1,3)));
assert(f.get_coefficient(1)==Complex(FT(56,7), FT(21,5)));
assert(f.get_coefficient(2)==Complex(FT(56,7), FT(-21,5)));
assert(f.get_coefficient(3)==Complex(FT(-12,17), FT(-1,3)));
Isometry g;
g.set_coefficients(Complex(FT(-12,17), FT(1,3)), Complex(FT(56,7), FT(21,5)), Complex(FT(56,7), FT(-21,5)), Complex(FT(-12,17), FT(-1,3)));
assert(g.get_coefficient(0)==Complex(FT(-12,17), FT(1,3)));
assert(g.get_coefficient(1)==Complex(FT(56,7), FT(21,5)));
assert(g.get_coefficient(2)==Complex(FT(56,7), FT(-21,5)));
assert(g.get_coefficient(3)==Complex(FT(-12,17), FT(-1,3)));
Isometry h = f*g;
assert(h.get_coefficient(0) == Complex(FT(5333816,65025),FT(-8,17)));
assert(h.get_coefficient(1) == Complex(FT(-192,17),FT(-504,85)));
assert(h.get_coefficient(2) == Complex(FT(-192,17),FT(504,85)));
assert(h.get_coefficient(3) == Complex(FT(5333816,65025),FT(8,17)));
Point point (FT(3,11),FT(-1,73));
Point image_point = h.evaluate(point);
assert(image_point==Point(FT("9146011623056232") /
FT("66567955527962869"),
-FT("12617302915955411") /
FT("133135911055925738")));
std::cout << "printing an isometry for test purposes : " << std::endl << h;
Isometry tau_1 = CGAL::hyperbolic_translation<Traits>(point);
Isometry tau_1_prime = CGAL::hyperbolic_translation<Traits>(Point (FT(-3,11),FT(1,73)), true);
Isometry tau_1_inv = CGAL::hyperbolic_translation<Traits>(point, true);
assert(tau_1.evaluate(image_point) == tau_1_prime.evaluate(image_point));
assert((tau_1*tau_1_inv).evaluate(image_point) == image_point);
Point p (FT(2,15),FT(0));
Point q (FT(0),FT(17,93));
Isometry rotation = CGAL::hyperbolic_rotation<Traits>(p, q);
Isometry rotation_prime = CGAL::hyperbolic_rotation<Traits>(q, p, true);
Isometry rotation_inv = CGAL::hyperbolic_rotation<Traits>(p, q, true);
assert(rotation.evaluate(image_point) == rotation_prime.evaluate(image_point));
assert((rotation*rotation_inv).evaluate(image_point) == image_point);
Point p_imag = rotation.evaluate(p);
Point q_imag = rotation.evaluate(q);
Isometry pairing = CGAL::isometry_pairing_the_sides<Traits>(p, q, p_imag, q_imag);
assert(pairing.evaluate(p) == p_imag);
assert(pairing.evaluate(q) == q_imag);
return 0;
}

View File

@ -0,0 +1,63 @@
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Hyperbolic_fundamental_domain_factory_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2_IO.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <CGAL/Exact_rational.h>
#include <CGAL/Lazy_exact_nt.h>
#include <CGAL/Cartesian.h>
#include <iostream>
#include <sstream>
#include <tuple>
#include <vector>
typedef CGAL::Cartesian<CGAL::Lazy_exact_nt<CGAL::Exact_rational>> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef CGAL::Hyperbolic_fundamental_domain_factory_2<Traits> Factory;
typedef CGAL::Triangulation_on_hyperbolic_surface_2<Traits> Triangulation;
typedef typename Traits::Hyperbolic_point_2 Point;
int main()
{
Factory factory;
Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459);
Triangulation triangulation0 = Triangulation(domain);
assert(triangulation0.is_valid());
Triangulation triangulation (triangulation0);
assert(triangulation.has_anchor());
std::stringstream buffer;
buffer << triangulation;
buffer >> triangulation;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> input_not_centered;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> input_centered;
input_not_centered = triangulation.lift(false);
input_centered = triangulation.lift();
triangulation.make_Delaunay();
assert(triangulation.is_Delaunay());
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> output_not_centered;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> output_centered;
output_not_centered = triangulation.lift(false);
output_centered = triangulation.lift();
Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.combinatorial_map();
Triangulation::Anchor& anchor = triangulation.anchor();
assert(cmap.is_dart_used(anchor.dart));
std::cout << "printing triangulation for test purposes: " << std::endl << triangulation;
return 0;
}

View File

@ -0,0 +1,80 @@
#include <CGAL/Hyperbolic_surface_traits_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2.h>
#include <CGAL/Triangulation_on_hyperbolic_surface_2_IO.h>
#include <CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h>
#include <CGAL/Exact_rational.h>
#include <CGAL/Cartesian.h>
#include <iostream>
#include <sstream>
#include <vector>
typedef CGAL::Cartesian<CGAL::Exact_rational> Kernel;
typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2<Kernel> ParentTraits;
typedef CGAL::Hyperbolic_surface_traits_2<ParentTraits> Traits;
typedef CGAL::Hyperbolic_fundamental_domain_2<Traits> Domain;
typedef CGAL::Triangulation_on_hyperbolic_surface_2<Traits> Triangulation;
typedef typename Traits::FT FT;
typedef typename Traits::Hyperbolic_point_2 Point;
typedef typename Traits::Complex Complex;
Domain build_domain()
{
std::vector<Point> vertices;
vertices.push_back( Point(FT(809,10000),FT(0)));
vertices.push_back( Point(FT(7359,10000),FT(1877,10000)));
vertices.push_back( Point(FT(-999,2500),FT(881,1000)));
vertices.push_back( Point(FT("-22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")));
vertices.push_back( Point(FT(-809,10000),FT(0)));
vertices.push_back( Point(FT(-7359,10000),FT(-1877,10000)));
vertices.push_back( Point(FT(999,2500),FT(-881,1000)));
vertices.push_back( Point(FT("22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("-9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")));
std::vector<int> pairings;
for (int k=0; k<8; ++k) {
pairings.push_back((k+4)%8);
}
return Domain(vertices, pairings);
}
int main()
{
Domain domain = build_domain();
Triangulation triangulation0 = Triangulation(domain);
assert(triangulation0.is_valid());
Triangulation triangulation (triangulation0);
assert(triangulation.has_anchor());
std::stringstream buffer;
buffer << triangulation;
buffer >> triangulation;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> input_not_centered;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> input_centered;
input_not_centered = triangulation.lift(false);
input_centered = triangulation.lift();
triangulation.make_Delaunay();
assert(triangulation.is_Delaunay());
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> output_not_centered;
std::vector<std::tuple<typename Triangulation::Combinatorial_map_with_cross_ratios::Dart_const_handle,Point,Point,Point>> output_centered;
output_not_centered = triangulation.lift(false);
output_centered = triangulation.lift();
Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.combinatorial_map();
Triangulation::Anchor& anchor = triangulation.anchor();
assert(cmap.is_dart_used(anchor.dart));
std::cout << "printing triangulation for test purposes: " << std::endl << triangulation;
return 0;
}