diff options
author | Siva Chandra Reddy <sivachandra@google.com> | 2019-10-15 13:25:36 -0700 |
---|---|---|
committer | Siva Chandra Reddy <sivachandra@google.com> | 2019-11-01 11:06:12 -0700 |
commit | 9364107cf348c7d4a2d05b8906bda6ba384ce6f6 (patch) | |
tree | 6e9b56d55d882f360a19eb927be5af4e1998640e /libc | |
parent | 9b0dfdf5e1939b4129df75cc8e8d57fcf451b786 (diff) | |
download | bcm5719-llvm-9364107cf348c7d4a2d05b8906bda6ba384ce6f6.tar.gz bcm5719-llvm-9364107cf348c7d4a2d05b8906bda6ba384ce6f6.zip |
Illustrate a redirector using the example of round function from math.h.
Setup demonstrated in this patch is only for ELF-ish platforms.
Also note:
1. Use of redirectors is a temporary scheme. They will be removed once
LLVM-libc has implementations for the redirected functions.
2. Redirectors are optional. One can choose to not include them in the
LLVM-libc build for their platform.
3. Even with redirectors used, we want to link to the system libc
dynamically.
Reviewers: dlj, hfinkel, jakehehrlich, phosek, stanshebs, theraven, alexshap
Subscribers: mgorny, libc-commits
Tags: #libc-project
Differential Revision: https://reviews.llvm.org/D69020
Diffstat (limited to 'libc')
-rw-r--r-- | libc/cmake/modules/LLVMLibCRules.cmake | 76 | ||||
-rw-r--r-- | libc/docs/build_system.rst | 19 | ||||
-rw-r--r-- | libc/docs/redirectors.rst | 69 | ||||
-rw-r--r-- | libc/docs/redirectors_schematic.svg | 1 | ||||
-rw-r--r-- | libc/lib/CMakeLists.txt | 15 | ||||
-rw-r--r-- | libc/src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libc/src/math/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libc/src/math/round/CMakeLists.txt | 14 | ||||
-rw-r--r-- | libc/src/math/round/round.cpp | 21 | ||||
-rw-r--r-- | libc/src/math/round/round.h | 18 | ||||
-rw-r--r-- | libc/src/math/round/round_redirector.cpp | 17 |
11 files changed, 247 insertions, 5 deletions
diff --git a/libc/cmake/modules/LLVMLibCRules.cmake b/libc/cmake/modules/LLVMLibCRules.cmake index 026cd38a3ef..f35afdc2db1 100644 --- a/libc/cmake/modules/LLVMLibCRules.cmake +++ b/libc/cmake/modules/LLVMLibCRules.cmake @@ -100,6 +100,7 @@ set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ") # Usage: # add_entrypoint_object( # <target_name> +# [REDIRECTED] # Specified if the entrypoint is redirected. # SRCS <list of .cpp files> # HDRS <list of .h files> # DEPENDS <list of dependencies> @@ -107,7 +108,7 @@ set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ") function(add_entrypoint_object target_name) cmake_parse_arguments( "ADD_ENTRYPOINT_OBJ" - "" # No optional arguments + "REDIRECTED" # Optional argument "" # No single value arguments "SRCS;HDRS;DEPENDS" # Multi value arguments ${ARGN} @@ -131,7 +132,7 @@ function(add_entrypoint_object target_name) ${target_name}_objects BEFORE PRIVATE - -fpie -std=${LLVM_CXX_STD_default} + -fpie ${LLVM_CXX_STD_default} ) target_include_directories( ${target_name}_objects @@ -158,10 +159,16 @@ function(add_entrypoint_object target_name) COMMAND ${CMAKE_LINKER} -r $<TARGET_OBJECTS:${target_name}_objects> -o ${object_file_raw} ) + set(alias_attributes "0,function,global") + if(ADD_ENTRYPOINT_OBJ_REDIRECTED) + set(alias_attributes "${alias_attributes},hidden") + endif() + add_custom_command( OUTPUT ${object_file} - DEPENDS ${object_file_raw} - COMMAND ${CMAKE_OBJCOPY} --add-symbol "${target_name}=.llvm.libc.entrypoint.${target_name}:0,function,weak,global" ${object_file_raw} ${object_file} + # We llvm-objcopy here as GNU-binutils objcopy does not support the 'hidden' flag. + DEPENDS ${object_file_raw} ${llvm-objcopy} + COMMAND $<TARGET_FILE:llvm-objcopy> --add-symbol "${target_name}=.llvm.libc.entrypoint.${target_name}:${alias_attributes}" ${object_file_raw} ${object_file} ) add_custom_target( @@ -219,6 +226,67 @@ function(add_entrypoint_library target_name) ) endfunction(add_entrypoint_library) +# Rule build a redirector object file. +function(add_redirector_object target_name) + cmake_parse_arguments( + "REDIRECTOR_OBJECT" + "" # No optional arguments + "SRC" # The cpp file in which the redirector is defined. + "" # No multivalue arguments + ${ARGN} + ) + if(NOT REDIRECTOR_OBJECT_SRC) + message(FATAL_ERROR "'add_redirector_object' rule requires SRC option listing one source file.") + endif() + + add_library( + ${target_name} + OBJECT + ${REDIRECTOR_OBJECT_SRC} + ) + target_compile_options( + ${target_name} + BEFORE PRIVATE -fPIC + ) +endfunction(add_redirector_object) + +# Rule to build a shared library of redirector objects +function(add_redirector_library target_name) + cmake_parse_arguments( + "REDIRECTOR_LIBRARY" + "" + "" + "DEPENDS" + ${ARGN} + ) + + set(obj_files "") + foreach(dep IN LISTS REDIRECTOR_LIBRARY_DEPENDS) + # TODO: Ensure that each dep is actually a add_redirector_object target. + list(APPEND obj_files $<TARGET_OBJECTS:${dep}>) + endforeach(dep) + + # TODO: Call the linker explicitly instead of calling the compiler driver to + # prevent DT_NEEDED on C++ runtime. + add_library( + ${target_name} + SHARED + ${obj_files} + ) + set_target_properties(${target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + target_link_libraries( + ${target_name} + -nostdlib -lc -lm + ) + + set_target_properties( + ${target_name} + PROPERTIES + LINKER_LANGUAGE "C" + ) +endfunction(add_redirector_library) + function(add_libc_unittest target_name) if(NOT LLVM_INCLUDE_TESTS) return() diff --git a/libc/docs/build_system.rst b/libc/docs/build_system.rst index f34ffe054b4..84431ccceea 100644 --- a/libc/docs/build_system.rst +++ b/libc/docs/build_system.rst @@ -13,6 +13,10 @@ Every entrypoint in LLVM-libc has its own build target. This target is listed using the ``add_entrypoint_object`` rule. This rule generates a single object file containing the implementation of the entrypoint. +Targets for redirecting entrypoints are also listed using the +``add_entrypoint_object`` rule. However, one will have to additionally specify +the ``REDIRECTED`` option with the rule. + Targets for entrypoint libraries -------------------------------- @@ -22,3 +26,18 @@ the ``lib`` directory as ``add_entrypoint_library`` targets. An ``add_entrypoint_library`` target takes a list of ``add_entrypoint_object`` targets and produces a static library containing the object files corresponding to the ``add_entrypoint_targets``. + +Targets for redirectors +----------------------- + +Similar to how every entrypoint in LLVM-libc has its own build target, every +redirector function also has its own build target. This target is listed using +the ``add_redirector_object`` rule. This rule generates a single object file +which can be packaged along with other redirector objects into shared library +of redirectors (see below). + +Targets for library of redirectors +---------------------------------- + +Targets for shared libraries of redirectors are listed using the +``add_redirector_library`` rule. diff --git a/libc/docs/redirectors.rst b/libc/docs/redirectors.rst new file mode 100644 index 00000000000..6a59835bb49 --- /dev/null +++ b/libc/docs/redirectors.rst @@ -0,0 +1,69 @@ +Redirectors +=========== + +When implementing a new C standard library (referred to as *libc* henceforth in +this document) starting from scratch, it is unrealistic to expect that we will +have the entire library available from day one. In such a scenario, a practical +approach is to redirect calls to the unimplemented functions to the same +functions from another fully functional libc implementation. Such a scheme can +also serve users who would like to mix and match implementations from LLVM libc +and another libc implementation. On most platforms, this other libc can be the +system libc itself. In this document, we present a strategy one can employ to +build redirectors to redirect from LLVM libc to the system libc. For now, the +scheme presented is limited to ELF platforms. + +Highlevel Mechanism +------------------- + +The highlevel scheme is as below: + +<img src="./redirectors_schematic.svg"> + +As shown in the diagram, the mechanism involves a redirector dynamic library +which goes in between the llvm-libc static library and the system libc dynamic +library. Essentially, LLVM libc provides implementations for all public +functions. However, some of the implementations do not actually implement the +expected functionality. Instead, they just call the corresponding function in +the redirector library, which in turn calls the same function from the system +libc. + +Implementation of redirecting entrypoints +----------------------------------------- + +Let us take the ``round`` function from ``math.h`` as an example to see what +it's implementation looks like when it just redirects to the ``round`` function +from the system libc. + +:: + namespace llvm_libc { + + double __redirected_round(double); + + double LLVM_LIBC_ENTRYPOINT(round)(double x) { + return __redirected_round(x); + } + + } // namespace llvm_libc + +As can be seen, the ``round`` function from LLVM libc does not call the +``round`` function from the system libc directly. It calls a function +``__redirected_round`` from the redirector library. The rest of the +code follows the conventions described in the *implementation standard* +document. + +Implementation of the redirector function +----------------------------------------- + +The function ``__redirected_round`` calls the ``round`` function from the system +libc. Its implementation is as follows:: + + #include <math.h> // Header file from the system libc + + namespace llvm_libc { + + double __redirected_round(double x) { + return ::round(x); // Call to round from the system libc + } + + } // namespace llvm_libc + diff --git a/libc/docs/redirectors_schematic.svg b/libc/docs/redirectors_schematic.svg new file mode 100644 index 00000000000..7e8d5dfb19f --- /dev/null +++ b/libc/docs/redirectors_schematic.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 751.0 223.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l751.0 0l0 223.0l-751.0 0l0 -223.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l751.0 0l0 223.0l-751.0 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m8.0 2.0003755l109.732285 0l0 220.0l-109.732285 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m8.0 2.0003755l109.732285 0l0 220.0l-109.732285 0z" fill-rule="evenodd"/><path fill="#000000" d="m16.96875 117.860374l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm8.453125 7.890625l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6328125 7.296875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6015625 4.109375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.0 2.015625q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m167.98366 45.483875l134.96062 0l0 133.03938l-134.96062 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m167.98366 45.483875l134.96062 0l0 133.03938l-134.96062 0z" fill-rule="evenodd"/><path fill="#000000" d="m201.6632 108.36356l0 -11.453125l1.515625 0l0 10.09375l5.640625 0l0 1.359375l-7.15625 0zm8.8984375 0l0 -11.453125l1.515625 0l0 10.09375l5.640625 0l0 1.359375l-7.15625 0zm11.0546875 0l-4.4375 -11.453125l1.640625 0l2.96875 8.3125q0.359375 1.0 0.609375 1.875q0.265625 -0.9375 0.609375 -1.875l3.09375 -8.3125l1.546875 0l-4.484375 11.453125l-1.546875 0zm7.34375 0l0 -11.453125l2.28125 0l2.71875 8.109375q0.375 1.125 0.546875 1.6875q0.1875 -0.625 0.609375 -1.828125l2.734375 -7.96875l2.046875 0l0 11.453125l-1.46875 0l0 -9.59375l-3.328125 9.59375l-1.359375 0l-3.3125 -9.75l0 9.75l-1.46875 0zm12.65625 -3.4375l0 -1.421875l4.3125 0l0 1.421875l-4.3125 0zm5.84375 3.4375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.89060974 -1.109375 2.2812347 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.2968597 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40623474 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.67185974 0.796875 -0.67185974 2.3125zm13.023422 1.171875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125z" fill-rule="nonzero"/><path fill="#000000" d="m193.2882 124.87919l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm7.0078125 3.046875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.6015625 4.21875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4374847 0.453125l-0.48435974 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.749985 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.28125 3.2031174l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.0468674q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.3749924 -0.78125 1.8906174q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m361.19687 59.55118l0 0c0 9.65411 32.411774 17.480312 72.39371 17.480312c39.981934 0 72.39368 -7.8262024 72.39368 -17.480312l0 104.8819c0 9.654114 -32.411743 17.480316 -72.39368 17.480316c-39.981934 0 -72.39371 -7.8262024 -72.39371 -17.480316z" fill-rule="evenodd"/><path fill="#e2edf7" d="m361.19687 59.55118l0 0c0 -9.654114 32.411774 -17.480316 72.39371 -17.480316c39.981934 0 72.39368 7.8262024 72.39368 17.480316l0 0c0 9.65411 -32.411743 17.480312 -72.39368 17.480312c-39.981934 0 -72.39371 -7.8262024 -72.39371 -17.480312z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m505.98425 59.55118l0 0c0 9.65411 -32.411743 17.480312 -72.39368 17.480312c-39.981934 0 -72.39371 -7.8262024 -72.39371 -17.480312l0 0c0 -9.654114 32.411774 -17.480316 72.39371 -17.480316c39.981934 0 72.39368 7.8262024 72.39368 17.480316l0 104.8819c0 9.654114 -32.411743 17.480316 -72.39368 17.480316c-39.981934 0 -72.39371 -7.8262024 -72.39371 -17.480316l0 -104.8819" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m505.98425 59.55118l0 0c0 9.65411 -32.411743 17.480312 -72.39368 17.480312c-39.981934 0 -72.39371 -7.8262024 -72.39371 -17.480312l0 0c0 -9.654114 32.411774 -17.480316 72.39371 -17.480316c39.981934 0 72.39368 7.8262024 72.39368 17.480316l0 104.8819c0 9.654114 -32.411743 17.480316 -72.39368 17.480316c-39.981934 0 -72.39371 -7.8262024 -72.39371 -17.480316l0 -104.8819" fill-rule="evenodd"/><path fill="#000000" d="m397.95386 117.092285l0 -11.453125l5.078125 0q1.53125 0 2.328125 0.3125q0.796875 0.296875 1.265625 1.078125q0.484375 0.78125 0.484375 1.734375q0 1.21875 -0.796875 2.0625q-0.78125 0.828125 -2.4375 1.046875q0.609375 0.296875 0.921875 0.578125q0.65625 0.609375 1.25 1.515625l2.0 3.125l-1.90625 0l-1.515625 -2.390625q-0.671875 -1.03125 -1.109375 -1.578125q-0.421875 -0.546875 -0.765625 -0.765625q-0.328125 -0.21875 -0.6875 -0.296875q-0.25 -0.0625 -0.84375 -0.0625l-1.75 0l0 5.09375l-1.515625 0zm1.515625 -6.40625l3.25 0q1.046875 0 1.625 -0.203125q0.59375 -0.21875 0.890625 -0.6875q0.3125 -0.484375 0.3125 -1.03125q0 -0.8125 -0.59375 -1.328125q-0.59375 -0.53125 -1.859375 -0.53125l-3.625 0l0 3.78125zm15.5078125 3.734375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9609375 -5.703125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5390625 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m386.2351 136.09229l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.8984375 7.34375l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm8.0625 -3.203125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.328125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm7.0078125 3.046875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.6015625 4.21875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.28125 3.203125l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m559.5439 25.17323l0 0c0 12.80257 41.5141 23.181103 92.724365 23.181103c51.210327 0 92.72443 -10.378532 92.72443 -23.181103l0 173.63779c0 12.802567 -41.5141 23.181107 -92.72443 23.181107c-51.210266 0 -92.724365 -10.37854 -92.724365 -23.181107z" fill-rule="evenodd"/><path fill="#e2edf7" d="m559.5439 25.17323l0 0c0 -12.80257 41.5141 -23.181103 92.724365 -23.181103c51.210327 0 92.72443 10.378532 92.72443 23.181103l0 0c0 12.80257 -41.5141 23.181103 -92.72443 23.181103c-51.210266 0 -92.724365 -10.378532 -92.724365 -23.181103z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m744.9927 25.17323l0 0c0 12.80257 -41.5141 23.181103 -92.72443 23.181103c-51.210266 0 -92.724365 -10.378532 -92.724365 -23.181103l0 0c0 -12.80257 41.5141 -23.181103 92.724365 -23.181103c51.210327 0 92.72443 10.378532 92.72443 23.181103l0 173.63779c0 12.802567 -41.5141 23.181107 -92.72443 23.181107c-51.210266 0 -92.724365 -10.37854 -92.724365 -23.181107l0 -173.63779" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m744.9927 25.17323l0 0c0 12.80257 -41.5141 23.181103 -92.72443 23.181103c-51.210266 0 -92.724365 -10.378532 -92.724365 -23.181103l0 0c0 -12.80257 41.5141 -23.181103 92.724365 -23.181103c51.210327 0 92.72443 10.378532 92.72443 23.181103l0 173.63779c0 12.802567 -41.5141 23.181107 -92.72443 23.181107c-51.210266 0 -92.724365 -10.37854 -92.724365 -23.181107l0 -173.63779" fill-rule="evenodd"/><path fill="#000000" d="m612.08856 116.25518l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm10.953125 6.890625l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm7.5 -5.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm17.742188 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm13.0234375 1.171875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125z" fill-rule="nonzero"/><path fill="#000000" d="m596.89716 142.31767q-1.171875 -1.46875 -1.984375 -3.4375q-0.796875 -1.984375 -0.796875 -4.09375q0 -1.859375 0.609375 -3.5625q0.703125 -1.96875 2.171875 -3.9374924l1.0 0q-0.9375 1.6249924 -1.25 2.3281174q-0.46875 1.078125 -0.75 2.25q-0.328125 1.453125 -0.328125 2.9375q0 3.75 2.328125 7.515625l-1.0 0zm8.015625 -3.375l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.1093674l1.40625 0l0 11.453117l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.8984375 7.34375l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm8.0625 -3.203125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.328125 -9.84375l0 -1.6093674l1.40625 0l0 1.6093674l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm7.0078125 3.046875l0 -11.453117l1.40625 0l0 11.453117l-1.40625 0zm3.5859375 -9.84375l0 -1.6093674l1.40625 0l0 1.6093674l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453117l1.40625 0l0 4.0781174q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.6015625 4.21875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.28125 3.203125l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm8.984375 0.171875l-1.015625 0q2.34375 -3.765625 2.34375 -7.515625q0 -1.46875 -0.34375 -2.921875q-0.265625 -1.171875 -0.734375 -2.25q-0.3125 -0.703125 -1.265625 -2.3437424l1.015625 0q1.46875 1.9687424 2.171875 3.9374924q0.59375 1.703125 0.59375 3.5625q0 2.109375 -0.8125 4.09375q-0.796875 1.96875 -1.953125 3.4375z" fill-rule="nonzero"/><path fill="#6aa84f" d="m125.73122 107.76389l30.7874 0l0 -5.2362213l10.472443 10.472443l-10.472443 10.472435l0 -5.2362137l-30.7874 0l5.2362213 -5.2362213z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m125.73122 107.76389l30.7874 0l0 -5.2362213l10.472443 10.472443l-10.472443 10.472435l0 -5.2362137l-30.7874 0l5.2362213 -5.2362213z" fill-rule="evenodd"/><path fill="#6aa84f" d="m315.4399 107.76389l30.787415 0l0 -5.2362213l10.472443 10.472443l-10.472443 10.472435l0 -5.2362137l-30.787415 0l5.236206 -5.2362213z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m315.4399 107.76389l30.787415 0l0 -5.2362213l10.472443 10.472443l-10.472443 10.472435l0 -5.2362137l-30.787415 0l5.236206 -5.2362213z" fill-rule="evenodd"/><path fill="#6aa84f" d="m512.21436 107.76389l30.787415 0l0 -5.2362213l10.472412 10.472443l-10.472412 10.472435l0 -5.2362137l-30.787415 0l5.236206 -5.2362213z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m512.21436 107.76389l30.787415 0l0 -5.2362213l10.472412 10.472443l-10.472412 10.472435l0 -5.2362137l-30.787415 0l5.236206 -5.2362213z" fill-rule="evenodd"/></g></svg>
\ No newline at end of file diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt index 49e2d2f10d7..121cd1fbb77 100644 --- a/libc/lib/CMakeLists.txt +++ b/libc/lib/CMakeLists.txt @@ -2,8 +2,21 @@ add_entrypoint_library( llvmlibc DEPENDS - ### C standard library entrypoints # string.h entrypoints + ## C standard library entrypoints strcpy strcat ) + +add_entrypoint_library( + llvmlibm + DEPENDS + # math.h entrypoints + round +) + +add_redirector_library( + llvmlibc_redirectors + DEPENDS + round_redirector +) diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt index b661a65d900..00df58860ff 100644 --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory(string) +add_subdirectory(math) add_subdirectory(__support) diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt new file mode 100644 index 00000000000..9501785fe1f --- /dev/null +++ b/libc/src/math/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(round) diff --git a/libc/src/math/round/CMakeLists.txt b/libc/src/math/round/CMakeLists.txt new file mode 100644 index 00000000000..e7ad9d2a73f --- /dev/null +++ b/libc/src/math/round/CMakeLists.txt @@ -0,0 +1,14 @@ +add_entrypoint_object( + round + REDIRECTED + SRCS + round.cpp + HDRS + round.h +) + +add_redirector_object( + round_redirector + SRC + round_redirector.cpp +) diff --git a/libc/src/math/round/round.cpp b/libc/src/math/round/round.cpp new file mode 100644 index 00000000000..7352b98269f --- /dev/null +++ b/libc/src/math/round/round.cpp @@ -0,0 +1,21 @@ +//===---------------------- Implementation of round -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/round/round.h" + +#include "src/__support/common.h" + +namespace llvm_libc { + +double __round_redirector(double x); + +double LLVM_LIBC_ENTRYPOINT(round)(double x) { + return __round_redirector(x); +} + +} // namespace llvm_libc diff --git a/libc/src/math/round/round.h b/libc/src/math/round/round.h new file mode 100644 index 00000000000..c13ecccfeca --- /dev/null +++ b/libc/src/math/round/round.h @@ -0,0 +1,18 @@ +//===------------------ Implementation header for round -------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_ROUND_H +#define LLVM_LIBC_SRC_MATH_ROUND_H + +namespace llvm_libc { + +double round(double x); + +} // namespace llvm_libc + +#endif // LLVM_LIBC_SRC_MATH_ROUND_H diff --git a/libc/src/math/round/round_redirector.cpp b/libc/src/math/round/round_redirector.cpp new file mode 100644 index 00000000000..8d37b0895c7 --- /dev/null +++ b/libc/src/math/round/round_redirector.cpp @@ -0,0 +1,17 @@ +//===---------------- Implementation of round redirector -----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <math.h> + +namespace llvm_libc { + +double __round_redirector(double x) { + return ::round(x); +} + +} // namespace llvm_libc |