Author SHA1 Message Date
Klagarge 3097b3ae8d feat(MP): add just recipe for full installation and run/stop 2026-06-07 23:20:59 +02:00
Klagarge 93c439abb8 refactor(MP/daemon): use mutex and atomic operations in application and ipc 2026-06-07 15:46:55 +02:00
Klagarge e46d3bb4b2 chore(MP/daemon): remove useless timer class 2026-06-07 15:25:59 +02:00
Klagarge 16e60f46e8 refactor(MP/daemon): use stack instead of heap for gpio 2026-06-07 15:25:42 +02:00
Klagarge 0f6502bf9b fix(MP/daemon): add mutex on gpio 2026-06-07 15:25:40 +02:00
Klagarge ca5dd30872 fix(MP/kernel): add mutex
Use only one mutex for regulator part, one for sysfs and one for the temperature. This is the simplest way to be thread safe and avoid concurrency
2026-06-07 14:37:29 +02:00
Fastium 5f1974da91 fix(MP/kernel): remove default period value in regulator 2026-06-06 23:46:21 +02:00
Fastium d727a75357 fix(MP/cli): change frequency with inc and dec 2026-06-06 23:45:41 +02:00
Klagarge c120e0d663 docs(MP): formatting 2026-06-06 22:54:09 +02:00
Klagarge 361b6eae4d docs(MP): proofread languagetool 2026-06-06 22:45:56 +02:00
Klagarge 6ef9b6a244 docs(MP): fix titles abreviations 2026-06-06 22:42:29 +02:00
Klagarge 08635f5080 docs(MP): abreviation check by gemini 2026-06-06 22:36:03 +02:00
Klagarge 4e9064aca2 docs(MP): rewrite kernel intro 2026-06-06 22:35:15 +02:00
Fastium 341b84e29a docs(MP): add daemon introduction 2026-06-06 22:29:13 +02:00
Klagarge 11cb58fdfe docs(MP): add gpio 2026-06-06 22:18:44 +02:00
Klagarge bd86f241c2 refactor(MP/daemon): use standard c class denomination for led and button 2026-06-06 22:18:42 +02:00
Fastium f99f8882c5 chore(MP/cli): update justfile 2026-06-06 22:17:12 +02:00
Fastium 56d92132b2 chore(MP): update justfile 2026-06-06 22:17:05 +02:00
Fastium 43ee262d4d chore(MP): remove unused makefile 2026-06-06 22:16:47 +02:00
Fastium 20eb84e22e chore(MP): add cli binary in gitignore 2026-06-06 22:16:22 +02:00
Fastium a3de85fccf docs(MP): add kernel and architecture introduction 2026-06-06 21:41:07 +02:00
Klagarge 937b32994d docs(MP): add kernel/blink and daemon/oled parts 2026-06-06 18:40:11 +02:00
Klagarge 7dfd644824 refactor(MP/kernel): use const instead of define 2026-06-06 18:40:08 +02:00
Fastium e9977acfaf docs(MP): add part Fastium 2026-06-06 18:28:00 +02:00
Klagarge 6740bd2318 docs(MP): init report 2026-06-06 17:37:06 +02:00
FastiumandFastium 89eced25e0 fix(MP/kernel): period is only over 0 2026-06-06 17:36:45 +02:00
FastiumandFastium f3a7577fea fix(MP/kernel): rename argument callback 2026-06-06 17:36:45 +02:00
FastiumandFastium 760d19f2a0 fix(MP/kernel): remove log temperature 2026-06-06 17:36:45 +02:00
FastiumandFastium bc6ee5e94d feat(MP/cli): refactor main 2026-06-06 17:06:47 +02:00
FastiumandFastium bc9c4aee23 fix(MP/daemon): add period in oled 2026-06-06 17:06:47 +02:00
FastiumandFastium 6519371c8d fix(MP/daemon): oled
- change device tree of the nanopi to use i2c
2026-06-06 17:06:47 +02:00
FastiumandFastium 5bde2024ee feat(MP/cli): add application files 2026-06-06 17:06:47 +02:00
FastiumandFastium ede642701a fix(MP/daemon): change frequency to period 2026-06-06 15:51:54 +02:00
FastiumandFastium 6efff669d5 fix(MP/daemon): comment oled broken 2026-06-06 15:24:11 +02:00
FastiumandFastium c76492ab42 fix(MP/daemon): button callbacks 2026-06-06 15:24:11 +02:00
FastiumandFastium d515871987 fix(MP/daemon): oled and app files 2026-06-06 15:24:11 +02:00
FastiumandFastium fa58b76bcd feat(MP/daemon): add logic file and sysfs 2026-06-06 15:24:11 +02:00
FastiumandFastium 28541d3222 feat(MP/daemon): display on oled 2026-06-06 11:21:10 +02:00
KlagargeandFastium 83532f3848 refactor(MP/daemon): move dts for i2c0 2026-06-06 11:21:10 +02:00
FastiumandFastium ad9c9adf7f feat(MP/daemon): add oled files and example 2026-06-06 11:21:10 +02:00
FastiumandFastium 9bf6c9ade4 feat(MP/daemon): implement ipc server with callbacks 2026-06-05 20:04:55 +02:00
FastiumandFastium 8c5e185b43 feat(MP/daemon): create ipc server to handle socketpair 2026-06-05 20:04:55 +02:00
FastiumandFastium 8b7afb6329 feat(MP/daemon): define common for ipc server 2026-06-05 20:04:55 +02:00
FastiumandFastium bbe3bb9fed fix(MP/daemon): button id 2026-06-05 20:04:55 +02:00
Klagarge c230621c34 chore(MP/daemon): tidy up 2026-06-05 18:38:37 +02:00
Klagarge f42d00a8f8 feat(MP/daemon): full implementation for button and led abstraction 2026-06-05 18:27:55 +02:00
Klagarge 52da239f31 feat(MP/daemon): WIP implementation for button and led functionalities 2026-06-05 17:32:06 +02:00
Klagarge 9f305c4626 feat(MP/daemon): new header for led and button functionalities 2026-06-05 17:32:04 +02:00
Klagarge 6e19040c50 ops(MP/daemon): add daemon build system 2026-06-05 17:32:02 +02:00
Klagarge 619dfb4720 feat(MP/daemon): add led-controle exercice as placeholder 2026-06-05 17:32:00 +02:00
Klagarge e581628178 chore(MP): allow to build multiple subfolders 2026-06-05 17:31:55 +02:00
FastiumandFastium 282d83894e fix(MP/kernel): change default period value 2026-06-05 17:30:08 +02:00
FastiumandFastium 943fcefc1c feat(MP/kernel): implement regulator in main 2026-06-05 16:27:10 +02:00
FastiumandFastium df7985033a feat(MP/kernel): create regulator
- contains the core of the module
- manual - auto mode for the temperature regulation

- use callback to communicate with temperature and led
2026-06-05 16:27:10 +02:00
FastiumandFastium deff0976e0 feat(MP/kernel): create sysfs to contains module attributs
- use callback to update sysfs with the core
2026-06-05 16:27:10 +02:00
FastiumandFastium aae80fe658 fix(MP/kernel): add header for blink.h 2026-06-05 16:27:10 +02:00
FastiumandFastium 3162b64d71 fix(MP/kernel): change frequency to period
- create confusion
2026-06-05 16:27:10 +02:00
Klagarge 6a92019cbe feat(MP/kernel): add blink part
Closes: #4
2026-06-05 12:32:20 +02:00
FastiumandFastium 995f9c43c5 feat(MP/kernel): add example 2026-06-05 12:15:11 +02:00
FastiumandFastium c012b2dcc4 fix(MP/kernel): remove unused function 2026-06-05 12:15:11 +02:00
FastiumandFastium db59e76527 feat(MP/kernel): makefile automatically detect source in subfolders 2026-06-05 11:56:16 +02:00
FastiumandFastium ce3b308d6d feat(MP/kernel): add temperature API
- init and exit fonction for the module
- read_temp(), to get the temperature
2026-06-05 11:56:16 +02:00
FastiumandFastium 66dd0c5192 feat(MP/kernel): add configuration file
These can be use to setup default parameters to the module
2026-06-05 11:56:16 +02:00
Klagarge 79480a37ef refactore(MP/kernel): use just module 2026-05-29 16:46:38 +00:00
Klagarge 84cebb07a1 chore: update just 2026-05-29 16:45:58 +00:00
Klagarge 5b1f51616a fix(MP): add subfolder in gitignore 2026-05-29 15:13:48 +00:00
Klagarge 3c3f8df8c7 chore(MP/kernel): init kernel part 2026-05-29 15:05:07 +00:00
Klagarge e313e95f9f chore(MP): init mini-project 2026-05-29 12:54:48 +00:00
Klagarge 04dad90d55 doc: proofread 2026-05-28 23:43:39 +02:00
Klagarge 0abaa8414e doc: format 2026-05-28 23:29:18 +02:00
Klagarge e54856dc00 doc: use cgroup instead of cgroups entry in glossary 2026-05-28 23:29:18 +02:00
Klagarge 5a2d352807 doc: AI proofread
Assisted-by: Zed:gemini-3.5-flash
2026-05-28 23:29:18 +02:00
Klagarge fd4e890483 doc: proofread 2026-05-28 23:29:12 +02:00
Fastium e07d1d8dd0 feat(lab05): refactor report and fix ex 1 2026-05-28 23:18:28 +02:00
Fastium bc6bf4f69b feat(lab05): refactor report 2026-05-28 22:59:36 +02:00
Fastium 4cca9903fb feat(lab05): finish exercise 3 with report 2026-05-28 22:26:45 +02:00
Fastium e9067f2051 chore(lab05): add lfs track files 2026-05-28 22:18:50 +02:00
Klagarge c0366b888e chore(lab04): tidy up 2026-05-28 21:12:39 +02:00
Klagarge 8aa79f62b7 feat(lab04): add cgroups CPU 2026-05-28 20:55:56 +02:00
Fastium 64b8cad953 feat(lab05): start report ex 3 2026-05-28 17:57:50 +02:00
Fastium 481a53d0f8 feat(lab05): add ex 2 with report 2026-05-28 17:03:51 +02:00
Fastium 6c5c8750b3 feat(lab05): add ex 1 with report 2026-05-28 15:37:12 +02:00
Fastium 5d8ef47e0e feat(lab05): add files 2026-05-28 15:36:24 +02:00
Fastium cb254f4d47 feat(lab04): finish report 2026-05-27 20:46:12 +02:00
Fastium 9a09f6cba6 fix(lab04): makefile and justfile 2026-05-27 20:05:08 +02:00
Fastium 286c73f8d5 feat(lab04): report process part 2026-05-27 14:11:43 +02:00
Klagarge eef8b28381 chore(lab04): add cgroups binary in gitignore 2026-05-26 13:59:59 +00:00
Klagarge 198265a515 chore(lab04): remove useless comments 2026-05-26 13:59:33 +00:00
Klagarge 362730f76f chore(lab04): add process section placeholder 2026-05-26 13:59:08 +00:00
Klagarge 4924a705be feat(lab03): add note about thread and timer design 2026-05-26 13:58:08 +00:00
Klagarge 4179e73ba9 feat(lab04): add exercices 2 cgroups 2026-05-26 15:07:00 +02:00
Fastium 820cbe6d86 feat(lab03): report 2026-05-26 12:04:48 +02:00
Fastium f554918ec4 fix(lab04): _GNU_SOURCE must be define in the .c not in the .clangd 2026-05-09 15:21:28 +02:00
Fastium a09c855503 fix(lab04): remove useless include 2026-05-09 15:19:06 +02:00
Fastium 390334d795 feat(lab04): finish exercice 1 2026-05-09 15:18:37 +02:00
Fastium 70a07f11bb feat(lab04): exercise 1 2026-05-08 15:26:31 +02:00
Fastium e04bf05b1a feat(lab04): ex1 2026-05-08 11:31:02 +02:00
Klagarge c408b57c14 doc(lab03): WIP add keyword on report 2026-05-08 09:28:47 +00:00
Klagarge e717434f29 feat(lab03): add syslog for frequency change 2026-05-08 08:25:15 +00:00
Fastium b74b2e5d19 feat(lab03): words for report 2026-05-08 09:39:52 +02:00
FastiumandKlagarge e036e18057 feat(lab03): modify frequency of the led with the buttons
Co-authored-by: Klagarge <remi@heredero.ch>
2026-04-25 12:14:14 +02:00
FastiumandKlagarge 1189c3374d refactor(lab03): split in dedicated files
Co-authored-by: Klagarge <remi@heredero.ch>
2026-04-25 11:43:43 +02:00
KlagargeandFastium d1189e8fda feat(lab03): add timer function
Manual (but ugly) merge of feat/timer

Co-authored-by: fastium <fastium.pro@proton.me>
2026-04-25 11:20:55 +02:00
Fastium e1cfb44e05 feat(readme): add command for setup boot.net 2026-04-25 10:55:53 +02:00
Fastium 734e23d272 fix(lab03): read file descriptor from the epoll event 2026-04-25 10:54:54 +02:00
Fastium 110ebe0d70 feat(lab03): add buttons case 2026-04-24 16:10:05 +02:00
Fastium 1221757fae feat(lab03): put button epoll in a thread and add the blinking LED in
main
2026-04-24 15:25:21 +02:00
Fastium 734e269533 feat(lab03): change epoll event flags 2026-04-24 14:37:22 +02:00
Fastium c94273f8bf feat(lab03): setup epoll on 3 button 2026-04-24 14:08:39 +02:00
Fastium fbb9b5e993 feat(readme): add boot.cifs 2026-04-24 14:07:59 +02:00
Fastium a9a5ecd4c7 feat(lab03): add trigger on button 1 with epoll 2026-04-18 16:07:19 +02:00
Fastium 6fc8edfd66 feat(lab03): WIP add buttons with epoll 2026-04-18 14:47:38 +02:00
Klagarge fb67d8aad7 fix(lab03): use right compiler on solution 2026-04-18 11:38:09 +00:00
Klagarge 5eddfb17a3 doc(lab03): init report 2026-04-18 11:37:07 +00:00
Klagarge 00bc81465c Revert "fix!(lab03): correct initialisation of the lab silly led"
Revert makefile in solution
2026-04-18 09:59:10 +00:00
Klagarge 95c86b3ea5 fix(lab03): use make instead of cmake 2026-04-18 09:27:37 +00:00
Klagarge a9c9d11521 fix!(lab03): correct initialisation of the lab silly led
BREAKING CHANGE: we now use the scope according to src / report
2026-04-18 09:16:45 +00:00
Fastium a65c061642 chore(gitignore): add cmake files and folders 2026-04-17 16:11:36 +02:00
Fastium 5aa46bc864 chore(lab04): add laboratory files 2026-04-17 16:11:03 +02:00
Klagarge a8a1080180 doc(lab01): add png 2026-04-02 23:23:15 +02:00
Klagarge 5a9295edfb chore(lab03): typo in code 2026-04-02 23:21:20 +02:00
Klagarge 15783a04b0 chore(lab03): remove useless file 2026-04-02 23:20:57 +02:00
Klagarge b72fca7b26 doc(lab03): add ex05 + typos 2026-04-02 23:20:35 +02:00
Klagarge 5978d25a1c doc(lab02): typo 2026-04-02 23:20:05 +02:00
Klagarge 6fb6bd811b doc(lab03): add to exercice 4 2026-04-02 22:56:28 +02:00
Klagarge 76699b8d19 doc: add end of report for lab01-module 2026-04-02 22:56:28 +02:00
Klagarge 6b0246b2a5 refactor: modify until exercice 4 2026-04-02 22:56:28 +02:00
Klagarge aa7342123d refactor: change structur of report 2026-04-02 22:56:28 +02:00
Fastium 8a610842f8 feat(lab03): add ex5 - sysfs 2026-04-02 22:54:39 +02:00
Fastium 8cfadd1bf9 feat(lab03): add exercice 04 2026-04-02 22:03:14 +02:00
Fastium ff22715a6b fix(lab03): ex3 read and write fop 2026-04-02 22:02:48 +02:00
Fastium 263b5c203e feat(lab03): WIP ex4 2026-04-02 21:16:33 +02:00
Fastium 86a5f88481 fix(lab03): display right exercice number 2026-04-02 21:07:20 +02:00
Fastium c501d368d5 fix(lab03): orthograph 2026-04-02 20:14:39 +02:00
Fastium 2130c96ada fix(lab03): finish ex 3 2026-04-02 20:05:31 +02:00
Fastium e3f234c088 chore(gitignore): ignore pdf in doc 2026-04-02 19:48:39 +02:00
Fastium 03b6f0beda fix(doc): delete pdf 2026-04-02 19:46:40 +02:00
Fastium baf46b7929 fix(lab03): fops read and write data 2026-04-02 18:50:16 +02:00
Fastium f26133499c feat(lab03): add ex 3 2026-04-02 18:24:13 +02:00
Fastium 83e10f098b doc(lab03): add doc for exercice 3 2026-04-02 16:28:38 +02:00
Fastium 9725e2c66b feat(lab03): ex 2 in one file 2026-04-02 14:41:31 +02:00
Fastium beac78bf94 feat(lab03): add module for ex 3 2026-04-02 13:53:01 +02:00
Fastium 62e059775c feat(lab03): update main with ex 1 2026-04-02 13:52:30 +02:00
Fastium 183e6243eb feat(lab02): remake a folder for all exercices 2026-04-02 13:48:11 +02:00
Fastium 1676b42d58 feat(lab03): refactor exrcice to make it in several files 2026-04-02 08:32:52 +02:00
Fastium a6d7b86637 feat(lab03): add ex1 with dev/mem 2026-04-01 21:50:39 +02:00
Fastium 7f12a642e2 chore(driver): setup files and module 2026-04-01 20:55:21 +02:00
Fastium 61cb96d2d7 chore(skeleton): rechange exercice files position 2026-04-01 20:54:07 +02:00
Fastium 6ba497d3e2 chore(skeleton): refactor all serie exercices intoi subfolders 2026-04-01 20:07:17 +02:00
Klagarge 7a376ff789 doc(lab02): add doc for ex08 2026-04-01 18:42:18 +02:00
Klagarge 906954a035 feat(lab02): add code for ex08 2026-04-01 18:25:39 +02:00
Fastium 59b7caf82e feat(lab02): add ex07 resouces 2026-04-01 13:07:56 +02:00
Fastium b1a1d6af60 doc(lab02): start doc for ex7 2026-04-01 13:07:06 +02:00
Fastium d477abe506 feat(lab02): add code for ex07 2026-04-01 10:20:35 +02:00
Klagarge 8fff875529 feat(lab02): add ex06 2026-03-31 21:06:44 +02:00
Klagarge e4089d2e05 fix(lab02): avoid to free a null pointer 2026-03-31 21:06:05 +02:00
Klagarge a6ef142912 doc(lab02): add doc for ex05 2026-03-31 16:35:21 +02:00
Klagarge 409e1565fb fix(lab02): typo for temperature calculation 2026-03-31 16:24:21 +02:00
Klagarge 7f46bd3940 refactor(lab02): split exercices for skeleton 2026-03-31 16:01:33 +02:00
Klagarge 786ed475ba fix(lab02): fix address in ex05 2026-03-31 14:11:35 +02:00
Klagarge fb8de73be8 feat(lab02): WIP add ex05 2026-03-31 13:57:53 +02:00
Klagarge da2639d6f3 feat(lab02): add ex04 2026-03-31 10:51:27 +02:00
Klagarge 841b7dead5 feat(lab02): update to ex3 2026-03-30 17:04:28 +02:00
Klagarge cc6c3f3112 chore: include IDE and src in gitignore 2026-03-30 17:04:00 +02:00
Klagarge 08191068ba feat(lab02): skeleton for ex 2,3,4 2026-03-30 17:03:13 +02:00
Fastium f5a7c11e62 feat(lab02): add ex 6,7,8 title and description 2026-03-27 16:21:54 +01:00
Fastium 32a7360248 feat(lab02): redo ex3, make ex 4 and 5 title and desciption 2026-03-27 15:59:47 +01:00
Fastium a4bef25652 feat(lab02): add exercice 3 2026-03-27 15:14:41 +01:00
Klagarge cc67357fc3 feat(lab01): init skeleton 2026-03-27 14:29:36 +01:00
FastiumandKlagarge 31ec94fa23 chore(clangd): add clang include and flags for modules 2026-03-21 16:33:40 +01:00
FastiumandKlagarge 7ce645248d doc(labo1): drawio develeopment environment 2026-03-21 16:29:27 +01:00
FastiumandKlagarge 4bbafc5bd6 feat(devcontainer): add tool for zed 2026-03-21 16:29:27 +01:00
FastiumandKlagarge 7366592611 chore(zed): add zed task and debug configuration 2026-03-21 16:29:27 +01:00
FastiumandKlagarge 7ec179071e chore(lab01): bootloader scripts (cifs and net) 2026-03-21 16:29:27 +01:00
FastiumandKlagarge e24ef885d6 chore(lab01): add binary script for bootloader 2026-03-21 16:29:26 +01:00
FastiumandKlagarge 4206747c17 chore(lab01): add command for zed 2026-03-21 16:29:26 +01:00
Klagarge 539e277d04 chore: migrate src to solutions 2026-03-21 16:12:58 +01:00
Klagarge eab03b73aa feat(lab02): add module/exercice1 2026-03-20 16:17:03 +01:00
Klagarge 6f10dd0333 feat(lab01): add questions 2026-03-15 12:12:35 +01:00
Klagarge 1484749eac doc: add initial reports 2026-02-28 17:17:38 +00:00
Jacques Supcik 2c06913abd Update debugger server address in launch and tasks configurations 2026-02-27 12:20:03 +00:00
Jacques Supcik 3967e73347 Initial commit 2026-02-18 13:34:35 +01:00
358 changed files with 8476 additions and 360 deletions
+16 -4
View File
@@ -5,8 +5,20 @@
"workspaceFolder": "/workspace",
"shutdownAction": "stopCompose",
"remoteUser": "root",
"settings": {},
"extensions": [
"ms-vscode.cpptools"
]
"customizations": {
"vscode": {
"settings": {},
"extensions": [
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.remote-ssh-edit",
"ms-vscode-remote.remote-wsl",
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
"dan-c-underwood.arm",
"editorconfig.editorconfig",
"myriad-dreamin.tinymist"
]
}
}
}
+13 -1
View File
@@ -37,7 +37,19 @@ services:
- rootfs:/rootfs
- home:/root-home
tftp:
image: csel/tftp
build:
context: tftp
dockerfile: Dockerfile
ports:
- "69:69/udp"
# - "10000-10010:10000-10010/udp"
volumes:
- buildroot:/buildroot
command: "dnsmasq --no-daemon --enable-tftp --tftp-root=/buildroot --tftp-no-blocksize --tftp-single-port --log-facility=- --log-dhcp"
volumes:
buildroot: {}
rootfs: {}
home: {}
home: {}
+11
View File
@@ -0,0 +1,11 @@
# https://github.com/devcontainers/images/tree/main/src/cpp
ARG VARIANT=ubuntu-24.04
FROM mcr.microsoft.com/devcontainers/base:${VARIANT}
EXPOSE 69/udp
RUN apt-get update && \
export DEBIAN_FRONTEND=noninteractive && \
apt-get -y install --no-install-recommends \
dnsmasq \
tcpdump
+9 -4
View File
@@ -1,5 +1,6 @@
ARG VARIANT=ubuntu-22.04
FROM mcr.microsoft.com/vscode/devcontainers/cpp:0-${VARIANT}
# https://github.com/devcontainers/images/tree/main/src/cpp
ARG VARIANT=ubuntu-24.04
FROM mcr.microsoft.com/devcontainers/cpp:${VARIANT}
RUN apt-get update && \
export DEBIAN_FRONTEND=noninteractive && \
@@ -8,6 +9,7 @@ RUN apt-get update && \
automake \
bc \
bison \
clang-format \
cpio \
device-tree-compiler \
file \
@@ -22,7 +24,10 @@ RUN apt-get update && \
rsync \
swig \
u-boot-tools \
wget
wget \
bear
RUN curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
COPY scripts/* /usr/local/bin/
RUN chmod +x /usr/local/bin/*
RUN chmod +x /usr/local/bin/*
@@ -5,7 +5,7 @@ set -o pipefail
set -o nounset
# set -o xtrace
git clone git://git.buildroot.net/buildroot /buildroot
git clone https://gitlab.com/buildroot.org/buildroot.git /buildroot
cd /buildroot
git checkout -b csel 2022.08.3
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
# set -o xtrace
GO_VERSION=1.24.1
remove_go() {
rm -rf /usr/local/go
rm -f /etc/profile.d/go.sh
}
install_go() {
remove_go
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
ARCH="amd64"
elif [ "$ARCH" = "aarch64" ]; then
ARCH="arm64"
else
echo "Unsupported architecture: ${ARCH}"
exit 1
fi
echo "Installing Go ${GO_VERSION} for ${ARCH}"
curl -sSfL https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz | tar -C /usr/local -xz
echo "Go ${GO_VERSION} installed successfully"
echo "export PATH=\$PATH:/usr/local/go/bin" >> /etc/profile.d/go.sh
}
install_go
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
# set -o xtrace
ZIG_VERSION=0.14.0
remove_zig() {
rm -rf /usr/local/bin/zio
rm -rf /usr/local/lib/zig
rm -rf /usr/local/share/zig
}
install_zig() {
remove_zig
ARCH=$(uname -m)
TMP=$(mktemp -d)
echo "Installing Zig ${ZIG_VERSION} for ${ARCH}"
echo "Downloading files to ${TMP}"
curl -sSfL https://ziglang.org/download/${ZIG_VERSION}/zig-linux-${ARCH}-${ZIG_VERSION}.tar.xz | tar -xJ -C $TMP
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/zig /usr/local/bin/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/lib /usr/local/lib/zig
mkdir -p /usr/local/share/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/doc /usr/local/share/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/README.md /usr/local/share/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/LICENSE /usr/local/share/zig
# rm -rf $TMP
}
install_zig
@@ -29,5 +29,6 @@ rsync -crlpgoD --itemize-changes \
--exclude=/etc/passwd \
--exclude=/etc/shadow \
--exclude=/etc/fstab \
--exclude=/run/lock \
--exclude=THIS_IS_NOT_YOUR_ROOT_FILESYSTEM \
$RSYNC_OPT $SRC $DST
+2
View File
@@ -0,0 +1,2 @@
src/05-optimization/ex03/access_log_NASA_Jul95 filter=lfs diff=lfs merge=lfs -text
src/05-optimization/ex03/access_log_NASA_Jul95_samples filter=lfs diff=lfs merge=lfs -text
+55 -8
View File
@@ -1,11 +1,32 @@
# IDE
.idea
.zed
.vscode
images
buildroot-images
solutions/
src/*/app
.obj
.deleted
.DS_Store
solutions/**/.Module.*
solutions/**/Module.symvers
solutions/**/.mymodule.*
solutions/**/mymodule.*
solutions/**/.modules.*
solutions/**/.*.cmd*
solutions/**/app
solutions/**/core
solutions/**/modules.order
solutions/**/.skeleton.*
src/**/*.o
src/**/*.dtb
src/**/*.ovl
src/**/.Module.*
src/**/Module.symvers
src/**/.mymodule.*
@@ -17,13 +38,39 @@ src/**/core
src/**/modules.order
src/**/.skeleton.*
src/**/*.o
src/**/*.dtb
src/**/*.ovl
solutions/02_modules/procstat/procstat
solutions/02_modules/procstat/procstat_s
src/02_modules/procstat/procstat
src/02_modules/procstat/procstat_s
solutions/03_drivers/sample01/main1
solutions/03_drivers/sample01/main2
solutions/03_drivers/sample01/main3
src/03_drivers/sample01/main1
src/03_drivers/sample01/main2
src/03_drivers/sample01/main3
.zig-cache
solutions/**/build
/SOLUTION
boot-scripts/boot.cifs
boot-scripts/boot.net
doc/**/*.pdf
build
src/03-led-controller/led-controller
src/04-multiprocessing/multiprocessing
src/04-multiprocessing/cgroups
src/04-multiprocessing/max-cpu
src/05-optimization/ex01/basic
src/05-optimization/ex01/optimized
src/05-optimization/ex02/optimized
src/05-optimization/ex02/basic
src/05-optimization/ex03/ApacheAccessLogAnalyzer.d
src/05-optimization/ex03/ApacheAccessLogAnalyzer.o
src/05-optimization/ex03/HostCounter.d
src/05-optimization/ex03/HostCounter.o
src/05-optimization/ex03/main.d
src/05-optimization/ex03/main.d
src/05-optimization/ex03/perf.data
src/05-optimization/ex03/read-apache-logs
+14 -4
View File
@@ -2,6 +2,17 @@
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/buildroot/output/host/bin/aarch64-linux-gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-arm64"
},
{
"name": "Linux-Kernel",
"includePath": [
"${workspaceFolder}/**",
"/buildroot/output/build/linux-headers-5.15.148/include",
@@ -10,10 +21,9 @@
"/buildroot/output/build/linux-headers-5.15.148/**"
],
"defines": [],
"compilerPath": "/usr/bin/clang",
"cStandard": "c99",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-arm64"
"compilerPath": "/buildroot/output/host/bin/aarch64-linux-gcc",
"cStandard": "gnu11",
"intelliSenseMode": "linux-gcc-arm64"
}
],
"version": 4
+23
View File
@@ -0,0 +1,23 @@
// Project-local debug tasks
//
// For more documentation on how to configure debug tasks,
// see: https://zed.dev/docs/debugger
[
{
"label": "Debug Fibonacci (CodeLLDB Remote)",
"adapter": "CodeLLDB",
"request": "launch",
"build": {
"command": "make",
"args": [
"-C",
"/workspace/src/01_environment/fibonacci"
]
},
"program": "/workspace/src/01_environment/fibonacci/app",
"cwd": "/workspace/src/01_environment/fibonacci",
"processCreateCommands": [
"gdb-remote 192.168.53.14:1234"
]
}
]
+64
View File
@@ -0,0 +1,64 @@
[
{
"label": "Get buildroot",
"command": "/usr/local/bin/get-buildroot.sh",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "Build linux",
"command": "cd /buildroot && make",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "Extract rootfs",
"command": "/usr/local/bin/extract-rootfs.sh",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "Sync image (sd card)",
"command": "/usr/local/bin/sync-images.sh",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "gdbserver (fibonacci)",
"command": "ssh",
"args": [
"-t",
"root@192.168.53.14",
"/usr/bin/gdbserver :1234 /workspace/src/01_environment/fibonacci/app 2"
],
"use_new_terminal": true
},
]
+29
View File
@@ -37,3 +37,32 @@ sync-images.sh
```
You can now "burn" the Compact Flash using [BalenaEtcher](https://www.balena.io/etcher/)
## Changing boot env
### CIFS
In the bootloader:
```bash
setenv boot_scripts boot.cifs
saveenv
boot
```
If the workspace isn't mount control if there is the line in `/etc/fstab`:
```text
//192.168.53.4/workspace /workspace cifs vers=1.0,username=root,password=toor,port=1445,noserverino
```
If the line isn't there, add it and mount:
```bash
mount -a
```
### NET
In the bootloader:
```bash
setenv boot_scripts boot.net
saveenv
boot
```
+5
View File
@@ -0,0 +1,5 @@
boot.cifs: boot_cifs.cmd
mkimage -T script -A arm -C none -d boot_cifs.cmd boot.cifs
boot.net: boot_net.cmd
mkimage -T script -A arm -C none -d boot_net.cmd boot.net
+12
View File
@@ -0,0 +1,12 @@
setenv ipaddr 192.168.53.14
setenv serverip 192.168.53.4
setenv netmask 255.255.255.0
setenv gatewayip 192.168.53.4
setenv hostname myhost
setenv mountpath rootfs
setenv bootargs console=ttyS0,115200 earlyprintk rootdelay=1 root=/dev/cifs rw cifsroot=//$serverip/$mountpath,username=root,password=toor,port=1445 ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname::off
fatload mmc 0 $kernel_addr_r Image
fatload mmc 0 $fdt_addr_r nanopi-neo-plus2.dtb
booti $kernel_addr_r - $fdt_addr_r
+18
View File
@@ -0,0 +1,18 @@
setenv ipaddr 192.168.53.14
setenv serverip 192.168.53.4
setenv netmask 255.255.255.0
setenv gatewayip 192.168.53.4
setenv hostname myhost
setenv mountpath rootfs
setenv tftppath output/images
setenv bootargs console=ttyS0,115200 earlyprintk rootdelay=1 root=/dev/cifs rw cifsroot=//$serverip/$mountpath,username=root,password=toor,port=1445 ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname::off
usb start
ping $serverip
setenv kernel_comp_addr_r 0x50000000
tftp $kernel_comp_addr_r $serverip:$tftppath/Image.gz
unzip $kernel_comp_addr_r $kernel_addr_r
tftp $fdt_addr_r $serverip:$tftppath/nanopi-neo-plus2.dtb
booti $kernel_addr_r - $fdt_addr_r
@@ -5,3 +5,7 @@
/ {
/delete-node/ leds;
};
&i2c0 {
status = "okay";
};
@@ -5,6 +5,6 @@ iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.14
address 192.168.53.14
netmask 255.255.255.0
gateway 192.168.0.4
gateway 192.168.53.4
+75
View File
@@ -0,0 +1,75 @@
// #import "@preview/hei-synd-report:0.1.1": *
#import "/doc/metadata.typ": *
#show:make-glossary
#register-glossary(entry-list)
#import "@preview/fractusist:0.1.1":*
//-------------------------------------
// Template config
//
#{
doc.title = "Environment & Kernel Programming"
doc.subtitle = [
Lab 01: Embedded Linux Environment \
& \
Lab 02: Linux Kernel Programming
]
doc.logos.tp_main = dragon-curve(
10,
step-size: 10,
stroke-style: stroke(
paint: gradient.radial(..color.map.rocket),
thickness: 3pt, join: "round"),
height: 10cm,
)
doc.version = "v0.1.0"
}
#show: report.with(
option: option,
doc: doc,
date: date,
tableof: tableof,
)
#v(5em)
#infobox()[
The repository for this labs can be found at the following address:
#align(center)[https://github.com/Klagarge/MSE-MA-CSEL]
]
#pagebreak()
//-------------------------------------
// Content
//
#include "lab00-env/main.typ"
#pagebreak()
#include "lab01-module/main.typ"
#pagebreak()
#include "lab02-peripheral/main.typ"
#pagebreak()
= #i18n("appendix-title", lang: option.lang) <sec:appendix>
== Exercices Lab 01
#include "lab01-module/ex01.typ"
#pagebreak()
#include "lab01-module/ex02.typ"
#include "lab01-module/ex03.typ"
#pagebreak()
#include "lab01-module/ex04.typ"
#pagebreak()
#include "lab01-module/ex05.typ"
#include "lab01-module/ex06.typ"
#pagebreak()
#include "lab01-module/ex07.typ"
#include "lab01-module/ex08.typ"
//-------------------------------------
// Glossary
//
// #heading(numbering:none, outlined: false)[] <sec:end>
// #make_glossary(gloss:gloss, title:i18n("gloss-title"))
+61
View File
@@ -0,0 +1,61 @@
// #import "@preview/hei-synd-report:0.1.1": *
#import "@preview/hei-synd-thesis:0.2.3": *
#import "/doc/metadata.typ": *
#import "/doc/resources/glossary.typ": *
#show:make-glossary
#register-glossary(entry-list)
#import "@preview/fractusist:0.1.1":*
//-------------------------------------
// Template config
//
#{
doc.title = "System Programming & Optimisation"
doc.subtitle = [
Lab 03: Linux System Programming \
& \
Lab 04: Linux System Optimisation
]
doc.logos.tp_main = dragon-curve(
11,
step-size: 10,
stroke-style: stroke(
paint: gradient.radial(..color.map.rocket),
thickness: 3pt, join: "round"),
height: 10cm,
)
doc.version = "v0.1.0"
}
#show: report.with(
option: option,
doc: doc,
date: date,
tableof: tableof,
)
#show link: set text(fill: blue.darken(60%))
#v(5em)
#infobox()[
The repository for these labs can be found at the following address:
#align(center)[https://github.com/Klagarge/MSE-MA-CSEL]
]
#pagebreak()
//-------------------------------------
// Content
//
#include "lab03-silly_led/main.typ"
#include "lab04-multiprocessing/main.typ"
#include "lab05-optimization/main.typ"
//-------------------------------------
// Glossary
//
#heading(numbering:none, outlined: false)[] <sec:end>
#make_glossary(gloss:gloss, title:i18n("gloss-title"))
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

+45
View File
@@ -0,0 +1,45 @@
= Embedded Linux Environment
In this laboratory, we see how to setup our environnement and how to have several way to boot. That include a `boot.cifs` that allow us to load the rootfs from samba to easily share the rootfs between the host and the target. And also a `boot.tftp` that allow us to load the kernel by tftp, which is really usefull when we want to modify the kernel and test it without having to reflash the whole system.
We also see how to debug our system with a remote debugger. That allow us to use debug in our code editor (vscode) a programm that run on the target.
#figure(
image("./dev-environment.png"),
caption: "Development environment schema"
) <fig:dev-env>
== Questions
=== How to generate U-Boot?
We use buildroot, a tool to build embedded Linux.
It can generate the U-Boot bootloader.
With `make menuconfig`, we can select the U-Boot package.
U-boot can be configured with `make uboot-menuconfig`
And finally, when we have configured everything, we can build the whole system with `make` command.
Or only uboot with `make uboot` command.
=== How to add and build a additional package in Buildroot?
In buildroot, with `make menuconfig`, we can select the package we want in `Target packages` section. We can specifically build it with `make <package-name>` command. Otherwise, it will be built with the whole system when we run `make` command.
=== How to modify the Linux kernel configuration?
Like all package, with `make <package-name>-menuconfig` command. So, for Linux kernel:
```bash
|> make linux-menuconfig
```
=== How to generate a custom rootfs?
First of all, select the type of filesystem you want to generate in `Filesystem images` section of `make menuconfig`. We can use an overlay to customise our rootfs.
The overlay is a directory (in the board folder) with the same structure as rootfs and it will merge with the generated rootfs. So, we can add files and directories in the overlay and they will be added to the final rootfs.
=== How to use the eMMC card instead of the SD card?
We need to change the boot script `(boot*.cmd)` to load from eMMC by changing the `fatload` command with the correct number. Probably 1 instead of 0.
```
fatload mmc 1 $kernel_addr_r Image
```
=== In cours support, we find several configurations of the development environment. What would be the optimal configuration for developing only user-space applications?
If we develop only user space program, we don't need to load kernel by tftp. But it's really usefull to have rootfs load by samba. So the best approach is to use the `boot.cifs`.
+95
View File
@@ -0,0 +1,95 @@
#import "/doc/metadata.typ": *
=== Generate kernel module out of tree <lab01:ex01>
#colorbox(title: "Exercise", color: hei-blue)[
Create the skeleton of a kernel module and generate it outside the kernel sources using a Makefile. The module should display a message when it is registered and when it is uninstalled.
]
//--------------
We already have a skeleton in `src/02-modules/exercice01` (now `solutions/02_modules/exercice01` that we move to `src/01-skeleton`). We see on the Makefile that the module is generated outside the kernel sources with the `KDIR` variable imported from `src/kernel_settings`. This variable point to the kernel sources.
The Makefile also use the `PWD` variable to the current directory.
The `make` command will use these variables to generate the module in the current directory.
```makefile
$(MAKE) -C $(KDIR) M=$(PWD) ARCH=$(CPU) CROSS_COMPILE=$(TOOLS) modules
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Test on the host machine the command modinfo1 on your module skeleton and compare the information returned with that of the source code.
]
```bash
|> modinfo mymodule.ko
filename: /workspace/src/01-skeleton/mymodule.ko
license: GPL
description: Module skeleton
author: Klagarge <remi@heredero.ch>
author: Fastium <fastium.pro@proton.me>
depends:
name: mymodule
vermagic: 5.15.148 SMP preempt mod_unload aarch64
parm: text:charp
parm: elements:int
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Install the module (insmod) and check the kernel log (dmesg)
]
```bash
|> insmod mymodule.ko
[ 1727.896902] mymodule: loading out-of-tree module taints kernel.
[ 1727.903442] Linux module 01 skeleton loaded
```
We can see the module is indead out-of-tree and correctly loaded.
```bash
|> dmesg | tail -5
[ 1381.694764] CIFS: Attempting to mount \\192.168.53.4\workspace
[ 1727.896902] mymodule: loading out-of-tree module taints kernel.
[ 1727.903442] Linux module 01 skeleton loaded
[ 1727.907659] text: dummy text
[ 1727.907659] elements: 1
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Compare the results obtained by the lsmod command with those obtained with the cat /proc/modules command
]
```bash
|> lsmod
Module Size Used by Tainted: G
mymodule 16384 0
···
|> cat /proc/modules
mymodule 16384 0 - Live 0xffff8000011bf000 (O)
···
```
The `/proc/modules` file give us more details about the state of the module. We see it is now live (charged in memory and running)
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Uninstall the module (rmmod).
]
```bash
|> rmmod mymodule.ko
[ 2989.535793] Linux module skeleton unloaded
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Adapt the Makefile of the module to allow the installation of the module with other kernel modules allowing the use of the modprobe command. The module should be installed in the root filesystem used in cifs by the target.
]
```bash
# On host:
|> make install
# On target:
|> modprobe mymodule
[ 3359.811183] Linux module 01 skeleton loaded
```
+19
View File
@@ -0,0 +1,19 @@
#import "/doc/metadata.typ": *
=== Adapt the kernel module to receive parameters <lab01:ex02>
#colorbox(title: "Exercise", color: hei-blue)[
Adapt the kernel module of the previous exercise to receive two or three parameters of your choice. These parameters will be displayed in the console when the module is loaded.
]
```bash
|> modprobe mymodule
[ 3583.616662] Linux module skeleton ex02 loaded
|> dmesg | tail -5
[ 3559.279143] number: 1
[ 3581.198562] Linux module skeleton unloaded
[ 3583.616662] Linux module skeleton ex03 loaded
[ 3583.621085] text: The answer to the Ultimate Question of Life, The Universe, and Everything
[ 3583.621085] number: 42
|> modprobe -r mymodule
[ 3588.404778] Linux module skeleton unloaded
```
+33
View File
@@ -0,0 +1,33 @@
#import "/doc/metadata.typ": *
=== What does it mean the 4 values in ```/proc/sys/kernel/printk``` ? <lab01:ex03>
We can show what there is in:
```bash
|> cat /proc/sys/kernel/printk
7 4 1 7
```
The number specified the level of output in a console.
This file specifies the log level for: \
current (7), default (4), minimum (1) and boot-time default (7).
This number matches with this table (#link("https://www.kernel.org/doc/html/latest/core-api/printk-basics.html", [printk documentation])):
#table(
columns: (2fr, 1fr, 3fr),
[*Name*], [*String*], [*Alias function*],
[KERN_EMERG], ["0"], [pr_emerg()],
[KERN_ALERT], ["1"], [pr_alert()],
[KERN_CRIT], ["2"], [pr_crit()],
[KERN_ERR], ["3"], [pr_err()],
[KERN_WARNING], ["4"], [pr_warning()],
[KERN_NOTICE], ["5"], [pr_notice()],
[KERN_INFO], ["6"], [pr_info()],
[KERN_DEBUG], ["7"], [pr_debug() and pr_devel() if DEBUG is defined],
[KERN_DEFAULT], [""], [],
[KERN_CONT], ["c"], [pr_cont()],
)
+25
View File
@@ -0,0 +1,25 @@
#import "/doc/metadata.typ": *
=== Create module with dynamic allocation and a chained list <lab01:ex04>
#colorbox(title: "Exercise", color: hei-blue)[
Create dynamically elements in the kernel. Adapt a kernel module to specify at the installation the number of element to create a initial text.
Each element will contain a unique number. The elements are create at the installation of the module adn chained in a list.
These elements will be destruct during the uninstallation of the module.
Some information messages are emits to allow debugging.
]
To allocate memory in the kernel, we can use the `kcalloc` function. It allows to allocate directly the memory for all element. It's also possible to use `kzalloc` in a loop to allocate memory for each element. We prefer allocate all the memory at once to avoid fragmentation and to be sure all the memory can be allocated.
```bash
struct element* element_ptr = kcalloc(elements, sizeof(struct element), GFP_KERNEL);
for (int i = 0; i < elements; i++) {
struct element* e = element_ptr + i;
if (e != 0) {
strncpy(e->text, text, TEXT_LENGTH_MAX - 1);
e->unique_number = i;
list_add_tail(&e->node, &list_unique_elements);
pr_info ("add element %d: %s\n", e->unique_number, e->text);
}
}
```
+33
View File
@@ -0,0 +1,33 @@
#import "/doc/metadata.typ": *
=== Display the processor chip ID, CPU temperature and the MAC adress of the Ethernet controller <lab01:ex05>
#colorbox(title: "Exercise", color: hei-blue)[
- Chip ID registers: _0x01c1'4200_ to _0x01c1'420c_
- 32 bits register of the temperature sensor: _0x01c2'5080_
- two 32 bits registers of the Ethernet controller MAC address: _0x01c3'0050_ and _0x01c3'0054_
To calculate the temperature value, there is this formul:
$
"temperature" = -1991 dot "register value" / 10 + 223000
$
The chip ID can be verified in ```/proc/iomem```.
The register value of the temperature can be verified in the file: ```/sys/class/thermal/thermal_zone0/temp```.
The MAC address can be verified with ``` ifconfig```.
]
The resources are savec in a struct:
```c
static struct resource* resources[3] = {[0] = 0,};
```
resources[0] is reserved for the chip ID, resources[1] for the temperature sensor and resources[2] for the Ethernet controller.
We first allocate the resources with `request_mem_region` function. Then we can map the physical address to a virtual address with `ioremap` function. Finally, we can read the value of the registers with `ioread32` function. The request fail because we have an overlap with the EEPROM, but we can ignore this error because we can still read the registers with `ioremap` function.
```c
// Request the resource at (CHIP_ID_BASE_ADDR)
resources[0] = request_mem_region(CHIP_ID_BASE_ADDR, 0x1000, "nanopi - chip ID");
// Map the physical address (CHIP_ID_BASE_ADDR) to a virtual address (registers[0])
registers[0] = ioremap(CHIP_ID_BASE_ADDR, 0x1000);
```
+8
View File
@@ -0,0 +1,8 @@
#import "/doc/metadata.typ": *
=== Kernel thread <lab01:ex06>
#colorbox(title: "Exercise", color: hei-blue)[
Develop a module which allows to instanciate a thread in the kernel. This thread will display a message every 5 seconds. Use the function ```ssleep(5)``` to sleep the thread from ``` linux/delay.h```.
]
Easy exercice, a thread in the kernel is a `struct task_struct*` that can be created with `kthread_run`
+15
View File
@@ -0,0 +1,15 @@
#import "/doc/metadata.typ": *
=== Sleeping <lab01:ex07>
#colorbox(title: "Exercise", color: hei-blue)[
Develop a module which instanciate 2 threads in the kernel. The first one will wait a wake up notification from the second thread and will sleep. The second will send the notification every 5 seconds. Then it will sleep. We will use the waitqueue for the sleeping function. To allow debugging, each thread will send a message when it wakes up.
]
This exercice make 2 threads in concurrency with wait queue. Here the queue ware declare
statically with the macro `DECLARE_WAIT_QUEUE_HEAD`. Then for this exercice we use an atomic
trigger with 2 queues. It important that the trigger is atomic or protected by mutex because
there is concurrency. The wait queues are used to wait until the trigger has changed to keep
synchronization between the threads.
It is very important to add `kthread_should_stop()` as a condition to wake up queue, because if there is
a problem during the implementation, we cannot kill the code.
+24
View File
@@ -0,0 +1,24 @@
#import "/doc/metadata.typ": *
=== Interrupts <lab01:ex08>
#colorbox(title: "Exercise", color: hei-blue)[
Develop a module which allows to detect every push on the button of the nanopi with interrupt. Every interrupts will send a message for debugging.
- Use the service ``` gpio_request(<io_nr>, <label>)```
- Get the interrupt vector with ``` gpio_to_irq(<io_nr>)```
- Extension card information:
- k1 - gpio: A, pin_nr=0, io_nr=0
- k2 - gpio: A, pin_nr=2, io_nr=2
- k3 - gpio: A, pin_nr=3, io_nr=3
]
We made a custom structur for the gpio device that contain all useful information like the name and the id.
```c
struct gpio_nanopi {
int id;
char* name;
};
static struct gpio_nanopi switchK1 = {0, "K1: GPIOA.0"};
static struct gpio_nanopi switchK2 = {2, "K2: GPIOA.2"};
static struct gpio_nanopi switchK3 = {3, "K3: GPIOA.3"};
```
+79
View File
@@ -0,0 +1,79 @@
#import "/doc/metadata.typ": *
#let ln(num) = {
let str_num = if int(num) < 10 { "0" + str(num) } else { str(num) }
let lbl = label("lab01:ex" + str_num)
link(lbl)[Ex 1.#num]
}
= Linux Kernel Programming
In this lab, we learn how to develop a tiny kernel module. We initially create a tiny skeleton that just print a message when the module is loaded and unloaded in #ln(1). Then in #ln(2), we see how to use parameters with insmod and with modprobe. To make things easier for us, weve added a line to the makefile that copy the modules configuration file (that contain the parameters for the modules) to the correct directory on the target. The `install` command is used as a combination of `mkdir`, `cp` and `chmod`.
```makefile
install:
$(MAKE) -C $(KDIR) M=$(PWD) INSTALL_MOD_PATH=$(MODPATH) modules_install
install -D -m 0644 $(SOURCE).conf $(MODPATH)/etc/modprobe.d/$(SOURCE).conf
```
The exercise 3 ask us what does it mean the 4 values in `/proc/sys/kernel/printk`?
We can show what there is in:
```bash
|> cat /proc/sys/kernel/printk
7 4 1 7
```
The number specified the level of output in a console.
This file specifies the log level for: \
current (7), default (4), minimum (1) and boot-time default (7).
This number matches with this table (#link("https://www.kernel.org/doc/html/latest/core-api/printk-basics.html", [printk documentation])):
#table(
columns: (2fr, 1fr, 3fr),
[*Name*], [*String*], [*Alias function*],
[KERN_EMERG], ["0"], [pr_emerg()],
[KERN_ALERT], ["1"], [pr_alert()],
[KERN_CRIT], ["2"], [pr_crit()],
[KERN_ERR], ["3"], [pr_err()],
[KERN_WARNING], ["4"], [pr_warning()],
[KERN_NOTICE], ["5"], [pr_notice()],
[KERN_INFO], ["6"], [pr_info()],
[KERN_DEBUG], ["7"], [pr_debug() and pr_devel() if DEBUG is defined],
[KERN_DEFAULT], [""], [],
[KERN_CONT], ["c"], [pr_cont()],
)
In #ln(4), we see how to dynamically create elements in the kernel. We use `kcallo` instead of `kzalloc` to allocate all the memory at once and be certain we have the necessary place for all elements of our module. It also a better approach in our opinion to avoid fragmentation.
We spent some time on the #ln(5) to understand that the `request_mem_region` failed because we have an overlap with the EEPROM.
The #ln(6) was a straightforward exercise where we had to develop a module that instantiated a thread.
In the #ln(7) was on concurrency. We had 2 threads with a wait queue. We learn how to suspend a thread, how to wake it up and how to do atomic operation.
In the last exercise of this lab, #ln(8), we see how to manage interruptions and connect them to a gpio.
== Cheat sheet commands
- `modinfo <module.ko>`: display information about a kernel module
- `insmod <module.ko>`: install a kernel module (without checking for dependencies)
- `rmmod <module.ko>`: uninstall a kernel module
- `lsmod`: list the currently loaded kernel modules
- `dmesg`: display the kernel log
- `cat /proc/modules`: display the currently loaded kernel modules with more details
- `modprobe <module>`: install a kernel module and its dependencies
- `modprobe -r <module>`: uninstall a kernel module and its dependencies
- `make`: build the kernel module
- `make install`: install the kernel module in the root filesystem
== Zed
For this lab, we start to work with another code editor than vscode. Not because we don't like Microsoft, ... but mostly for this reason. We use zed with the new devcontainer implementation on this wonderful code editor. To be able to work in nice condition, we add our own `.clangd` build with the help `bear`.
This clangd, allow us to have a perfect autocompletion and a enjoyable code navigation. We can easily jump to the definition of a function and see the documentation of a function.
Thanks to Zed teams for this awesome code editor and \@Fastium for his clangd
== Conclusion
All this lab was done by iteration on the initial skeleton. We develop everything in the #link("https://github.com/Klagarge/MSE-MA-CSEL/tree/main/src/01-skeleton")[src/01-skeleton] folder.
It was a very delightful introduction lab that show us some possibilities when we want to create a kernel module. Everything was new for us, so even it's basics concept, this was a bit challenging to grasp the subject.
+1
View File
@@ -0,0 +1 @@
#import "/doc/metadata.typ": *
+1
View File
@@ -0,0 +1 @@
#import "/doc/metadata.typ": *
+1
View File
@@ -0,0 +1 @@
#import "/doc/metadata.typ": *
+1
View File
@@ -0,0 +1 @@
#import "/doc/metadata.typ": *
+1
View File
@@ -0,0 +1 @@
#import "/doc/metadata.typ": *
+1
View File
@@ -0,0 +1 @@
#import "/doc/metadata.typ": *
+34
View File
@@ -0,0 +1,34 @@
#import "/doc/metadata.typ": *
#let ln(num) = {
// let str_num = if int(num) < 10 { "0" + str(num) } else { str(num) }
// let lbl = label("lab02:ex" + str_num)
// link(lbl)[Ex 2.#num]
[Ex 2.#num]
}
= Linux Kernel Programming
In the First exercise, we learn how to access a register thought the `/dev/mem` interface. The purpose was to read the chip ID, but we learn how to access in a specific region of the memory. How pages work and how to map them in the user space.
For exercise 2, we see how to create a character device driver. We learn how to create a device file, how to write a read and write functions and how to test it with `echo` and `cat`. Our module has a `MAJOR` dynamically allocated (but should be 511 with default nanopi installation) and only one minor. To verify the major number, we can use `cat /proc/devices` and look for our module name. To test the module, we need to create a character device file with the right major and minor number.
```bash
mknod /dev/test-device c 511 0 # Create character device
echo "lalalalalaalalalalallala" > /dev/test-device # Write to the device
cat /dev/test-device # Read from the device
```
Quite easy to extend to exercise 3 by adding the parameters as we did in the previous lab. This parameters define the number of minor available.
Exercise 4 is the continuity, we had to create a tiny app that basically do the `echo` and `cat` for us. We can use the `open`, `write`, `read` and `close` system calls to interact with our device file. We still need to create the device file:
```bash
mknod /dev/toto0 c 511 0
```
The next step in exercise 5 is to create a sysfs entry for our module. Lot of theory, but once the theory is grasped, it's relatively straightforward to use the sysfs functions in our module.
The sysfs class is useful when we are attribute oriented. It's easy to store attributes in files. The platform driver is useful when we are processes oriented. The misc device simplify the peripheral instantiation.
== Adaptation for Zed environment
For this lab, we have to work with application and not with module. We have the same problem with clang for the LSP with Zed. To solve it, we include the Linux header files and specify the path of sysroot. Like this, clang have all the dependencies that we need. And tadam, the wonderful environment we had on previous lab is back!
== Conclusion
All the content of this is on #link("https://github.com/Klagarge/MSE-MA-CSEL/tree/main/src/02-driver")[src/02-driver]. It was pleasant to initially see how to manage a character device manually and step by step see how to do it with an easier method. I personally like to start from the bottom.
+49
View File
@@ -0,0 +1,49 @@
#import "/doc/metadata.typ": *
= Linux System Programming
This laboratory implements a user-space application for the NanoPi NEO Plus2 that controls the blinking frequency of the status #gls("led", long: false) using three push buttons. The main goal was to replace a #gls("cpu", long: false)-intensive busy loop with an event-driven design.
== Design
The application is based on multithreading: one thread handles the #gls("led", long: false) timing, while another handles button events. #gls("gpio", long: false) are accessed through #gls("sysfs", long: false), which allows the #gls("led", long: false) and buttons to be managed as file descriptors. A key design choice was to centralize all events with a single #gls("epoll", long: false) instance, so both timer events and button events can be processed efficiently.
The timer thread uses only one timer and sets the initial time on every cycle. This allows us to allocate resources only once for the timer and avoid memory fragmentation. The button thread writes the next sleep duration to a shared variable, which the timer thread reads to set its next sleep interval. Since there is only one writer for this variable, we do not need a mutex to protect it.
All logs are written to #gls("syslog", long: false) at the INFO level:
```c
// First, we open the syslog with a specific name and facility
// LOG_PID to include the PID (process ID) in the logs
// LOG_USER to specify the log facility (what type of program)
openlog("CSEL Logs", LOG_PID, LOG_USER);
// Then log what you want:
syslog(LOG_INFO, "Start logging silly led-controller"); // INFO level
```
== Difficulties
The most difficult part was understanding the #gls("gpio", long: false) mapping between the physical pins and the #gls("sysfs", long: false) #gls("gpio", long: false) numbers. This mapping can be found in the #link("https://linux-sunxi.org/GPIO", [*sunxi driver*]) documentation, which describes the driver for the #gls("gpio", long: false) controller.
== Results
We demonstrate that the application works more efficiently than the provided silly #gls("led", long: false) controller:
#table(
columns: (1fr, 1fr),
align: center + horizon,
stroke: none,
[
#figure(
image("test-silly.png", height: 10em),
caption:[Running the silly #gls("led", long: false) controller on the NanoPi]
)<fig-silly>
],[
#figure(
image("test-epoll.png", height: 10em),
caption:[Running the #gls("epoll", long: false)-based #gls("led", long: false) controller on the NanoPi]
)<fig-epoll>
]
)
We see in @fig-silly, the silly #gls("led", long: false) controller use 100% of the #gls("cpu", long: false) in @fig-epoll we save CPU resources.
Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

+279
View File
@@ -0,0 +1,279 @@
#import "/doc/metadata.typ": *
= Multiprocessing
== Process, signals, and communication
The aim of this laboratory is to create a child process from a parent process using `fork()`. Both processes then execute the same code until they are terminated. This is similar to parallel programming with #gls("gpu", long: false) using #gls("cuda", long: false) or #gls("openmp", long: false). The processes are differentiated by their #gls("pid", long: false).
The child process must communicate with the parent process using a `socketpair`:
```c
/* Setup socket for inter-process communication */
int fd[2];
int err = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
if (err == -1) {
perror("socketpair fail");
exit(EXIT_FAILURE);
}
```
This creates a local UNIX socket pair for inter-process communication. It returns two file descriptors for bidirectional communication.
The program must handle several signals and print their names when received:
```c
static void catch_signal(int signal) {
switch (signal) {
case SIGHUP:
printf("SIGHUP received\n");
break;
case SIGINT:
printf("SIGINT received\n");
exit(EXIT_SUCCESS); // to avoid to be blocked and kill it with ctrl+c
break;
case SIGQUIT:
printf("SIGQUIT received\n");
break;
case SIGTERM:
printf("SIGTERM received\n");
break;
case SIGABRT:
printf("SIGABRT received\n");
break;
}
}
```
#pagebreak()
```c
static void install_catch_signal()
{
struct sigaction act = {
.sa_handler = catch_signal,
};
sigemptyset(&act.sa_mask);
sigaction(SIGHUP, &act, 0);
sigaction(SIGINT, &act, 0);
sigaction(SIGQUIT, &act, 0);
sigaction(SIGTERM, &act, 0);
sigaction(SIGABRT, &act, 0);
}
```
One important design consideration to anticipate was signal handling behaviour. If `Ctrl+C` (SIGINT) is caught, but the handler does not terminate the process, the application would continue to run and block the terminal. In that case, the only way to kill the process would be to open another terminal and use a tool like `top` or `htop`.
Finally, each process is pinned to its own CPU core. This is configured using `sched_setaffinity`:
```c
/* Setup CPU affinity for process */
CPU_SET(child_cpu, &set);
int ret = sched_setaffinity(parent_pid, sizeof(set), &set);
if (ret == -1) {
perror("sched_setaffinity");
exit(EXIT_FAILURE);
}
```
This can be verified by executing the program and observing CPU usage in `htop`.
```bash
$ ./multiprocessing
Child process: pid=273
Parent process: pid=274
Message 0: Hallo, hallo !
Message 1: ça geht !
Message 2: Comment vont les olives ?
Message 3: Sacré trucs tes trucs là.
Message 4: Ta où les vaches !!!!!
SIGHUP received
SIGQUIT received
SIGTERM received
SIGABRT received
SIGINT received
```
#figure(
image("control_cpu_process_ex_1.png"),
caption: [Execution of the multiprocessing program]
)<multiprocessus>
The @multiprocessus shows the #gls("pid", long: false) and the assigned CPU core for each process, which can be compared with the console output shown above.
The child process has PID 273 and runs on core 0, whereas the parent process has PID 274 and runs on core 1.
== #glspl("cgroup", long: false) memory
The goal of this part is to understand how to use #glspl("cgroup", long: false) to limit the resources of a process. We will initially focus on memory, but #glspl("cgroup", long: false) can also be used to limit #gls("cpu", long: false), #gls("io", long: false), and other resources.
To limit the memory usage of a process, we can use the `memory` subsystem of #glspl("cgroup", long: false). On this NanoPi, we use #glspl("cgroup", long: false) v1.
We must first mount a temporary file system for #glspl("cgroup", long: false):
```bash
|> mount -t tmpfs none /sys/fs/cgroup
```
We can then create a directory for the memory subsystem, mount the corresponding #glspl("cgroup", long: false) file system, and create a subdirectory for our specific group:
```bash
# Create a directory for the memory cgroup
|> mkdir /sys/fs/cgroup/memory
# Mount the cgroup filesystem with memory
|> mount -t cgroup -o memory cgroup /sys/fs/cgroup/memory
# Create a subdirectory for the memory cgroup
|> mkdir /sys/fs/cgroup/memory/0
```
We can then add the current process to this memory #gls("cgroup", long: false) and set a memory limit of 20 #gls("mib", long: false):
```bash
# Add the current process to the memory cgroup
|> echo $$ > /sys/fs/cgroup/memory/0/tasks
# Set the memory limit to 20 MiB
|> echo 20M > /sys/fs/cgroup/memory/0/memory.limit_in_bytes
```
We can then run our test program that allocates memory in a loop to see what happens when we exceed the memory limit.
```c
for (i = 0; i < NUM_BLOCKS; i++) {
// Allocate a block of memory
blocks[i] = malloc(BLOCK_SIZE);
// [...]
// check if failed and error, clean and exit
// Touch the memory to ensure it's actually allocated
memset(blocks[i], 0, BLOCK_SIZE);
}
```
We can use the `cgroups.sh` script in `04-multiprocessing` to set up #glspl("cgroup", long: false) and run the test program. However, to execute the script in the context of our current shell, we must source it using the `.` command:
```bash
|> just cgroups # Build the test program
|> . cgroups.sh # Run the script in the current shell
|> ./cgroups # Run the test program that allocates memory in a loop
```
=== What is the behaviour of the command `echo $$ > ...` on #glspl("cgroup", long: false)?
The `$$` shell variable represents the #gls("pid", long: false) of the current shell. When we execute the command `echo $$ > /sys/fs/cgroup/memory/0/tasks`, we write the PID of the current shell process into the `tasks` file of the specified cgroup. This action assigns the process to that control group, meaning that any program run from this shell will inherit the resource limits and policies defined for that cgroup.
=== What is the behaviour of the memory subsystem when the memory quota is exhausted? Can we modify it? If yes, how?
On this NanoPi, we use #glspl("cgroup", long: false) v1, so the resource configuration is done via the `memory.limit_in_bytes` file. When a process within a #gls("cgroup", long: false) exceeds the memory limit defined by this file, the Linux kernel will attempt to reclaim memory. If it cannot reclaim sufficient memory, it will invoke the #gls("oom", long: false) killer to terminate processes within that #gls("cgroup", long: false) to free up memory.
It is possible to modify this behaviour in several ways:
+ *Use "Soft Limits" (specific to #glspl("cgroup", long: false) v1):*
In addition to a hard limit (`memory.limit_in_bytes`), a soft limit can be set via `memory.soft_limit_in_bytes`.
*Behaviour:* The kernel does not kill the process when the soft limit is exceeded, unless the entire system runs low on memory. If global memory is low, the kernel begins reclaiming memory from cgroups that exceed their soft limits.
+ *Adjust the #gls("oom", long: false) Killer priority score:*
We can specify an #gls("oom", long: false) score adjustment for the process. By modifying the `/proc/[PID]/oom_score_adj` file to the value `-1000`, the process becomes virtually immune to the #gls("oom", long: false) killer.
=== How to watch the memory usage?
We can monitor the memory usage of a control group by reading directly from its configuration files:
```bash
# Current memory usage in bytes
|> cat /sys/fs/cgroup/memory/0/memory.usage_in_bytes
212992
# Maximum memory usage in bytes
|> cat /sys/fs/cgroup/memory/0/memory.max_usage_in_bytes
20971520
```
== #glspl("cgroup", long: false) CPU
To check this part, we need a tiny program that consumes #gls("cpu", long: false) with at least two processes.
The following program creates a child process that performs #gls("cpu", long: false)-intensive work, while the parent process also performs #gls("cpu", long: false)-intensive work. We can then use #glspl("cgroup", long: false) to limit the #gls("cpu", long: false) usage of one of the processes and observe the effect.
```c
int main() {
pid_t pid = fork();
if (pid == 0) {
cpu_intensive_work("Child process");
exit(0);
} else {
cpu_intensive_work("Parent process");
wait(NULL);
return 0;
}
}
```
Based on the previous exercise, we should already have mounted the #glspl("cgroup", long: false) file system.
```bash
|> mount -t tmpfs none /sys/fs/cgroup
```
We can then create and mount the #glspl("cgroup", long: false) file system for the `cpuset` subsystem:
```bash
# Create a directory for the cpuset cgroup
|> mkdir /sys/fs/cgroup/cpuset
# Mount the cgroup filesystem with cpuset
|> mount -t cgroup -o cpu,cpuset cpuset /sys/fs/cgroup/cpuset
```
With these prerequisites met, we can create two groups, one for each instance of our running program. Using the commands below, we assign one or more #gls("cpu", long: false) cores to each group via `cpuset.cpus`. I'm not sure about the `cpuset.mems` file, but it seems to be related to memory nodes. It's definitely a topic that should be explored more in depth, but for now, we set to `0` as specified in the lab instructions:
```bash
# Create and allocate CPU for program "low"
|> mkdir /sys/fs/cgroup/cpuset/low
|> echo 1 > /sys/fs/cgroup/cpuset/low/cpuset.cpus
|> echo 0 > /sys/fs/cgroup/cpuset/low/cpuset.mems
```
#pagebreak()
```bash
# Create and allocate CPU for program "high"
|> mkdir /sys/fs/cgroup/cpuset/high
|> echo 2,3 > /sys/fs/cgroup/cpuset/high/cpuset.cpus
|> echo 0 > /sys/fs/cgroup/cpuset/high/cpuset.mems
```
We can then open two shells and run the test program in each of them, while adding each program to its corresponding control group:
```bash
# In the first shell, add it to the "low" cgroup and run the test program
|> . ./max-cpu.sh low
# In the second shell, add it to the "high" cgroup and run the test program
|> . ./max-cpu.sh high
```
As shown in @max-cpu, as expected, both processes in the "low" program are limited to #gls("cpu", long: false) core 1, while the "high" program uses #gls("cpu", long: false) cores 2 and 3 (one for each process).
#figure(
image("max-cpu.png", width: 90%),
caption: [CPU usage of the two programs with dedicated resources]
)<max-cpu>
To share resources at 75% and 25%, we can use the `cpu.shares` file in the `cpu` cgroup. We assign a share value to the "high" group that is three times higher than that of the "low" group:
```bash
|> echo 75 > /sys/fs/cgroup/cpu/high/cpu.shares
|> echo 25 > /sys/fs/cgroup/cpu/low/cpu.shares
```
After running the test program in each shell, we can observe in @shared-cpu that the processes in the "high" #gls("cgroup", long: false) are allocated 75% of the CPU capacity, while those in the "low" #gls("cgroup", long: false) receive 25%:
```bash
# In the first shell, add it to the "low" cgroup and run the test program
|> . ./shared-cpu.sh low
# In the second shell, add it to the "high" cgroup and run the test program
|> . ./shared-cpu.sh high
```
#figure(
image("shared-cpu.png", width: 80%),
caption: [CPU usage of the two programs with shared resources]
)<shared-cpu>
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

+283
View File
@@ -0,0 +1,283 @@
#import "/doc/metadata.typ": *
= Linux System Optimisation
In this laboratory, the usage of `#gls("perf", long: false)` as a performance analysis tool is explored.
== Exercise 1
#task([
Measure the performance of `ex1`
],[
```
Performance counter stats for './ex1':
40609.10 msec task-clock # 1.000 CPUs utilized
22 context-switches # 0.542 /sec
0 cpu-migrations # 0.000 /sec
48867 page-faults # 1.203 K/sec
33136692484 cycles # 0.816 GHz
1671194529 instructions # 0.05 insn per cycle
269592231 branches # 6.639 M/sec
1013366 branch-misses # 0.38% of all branches
40.618926728 seconds time elapsed
39.901620000 seconds user
0.296158000 seconds sys
```
This program performs 22 context switches and takes 40.6 seconds to run.
])
#task([
What error is present in the `ex1` program?
],[
The error lies in how the array memory is accessed. In C, 2D arrays are stored in "row-major" order, meaning elements of the same row are contiguous in memory. However, the original code accesses the array using `array[j][i]` within the loops, where the row index `j` is in the inner loop.
This causes the program to jump across memory addresses non-sequentially, triggering a cache miss almost every time. This can be solved by simply swapping the indices to `array[i][j]` (or swapping the loop order) to process memory sequentially:
```c
int i, j;
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE; j++)
{
array[i][j]+= 10;
}
}
```
With these modifications, the performance is improved by a factor of nearly 80.
```
Performance counter stats for './optimized':
474.62 msec task-clock # 0.940 CPUs utilized
15 context-switches # 31.604 /sec
0 cpu-migrations # 0.000 /sec
48866 page-faults # 102.959 K/sec
387200454 cycles # 0.816 GHz
253128815 instructions # 0.65 insn per cycle
39724528 branches # 83.698 M/sec
577317 branch-misses # 1.45% of all branches
0.505146917 seconds time elapsed
0.233682000 seconds user
0.237584000 seconds sys
```
This can be observed by running the same performance analysis with `#gls("perf", long: false)`. The elapsed time drops from around 40 seconds to approximately 0.5 seconds. A similar improvement can be observed in the cache misses:
- optimized : 753,502
- basic : 406,627,550
])
#task([
Show `#gls("l1", long: false)` cache misses for `ex1`:
],[
#table(
columns: (1.5fr, 1fr),
stroke: none,
[
Not optimized
```
407036282 L1-dcache-load-misses
39.868545227 seconds time elapsed
39.115950000 seconds user
0.347522000 seconds sys
```
],[
Optimized
```
42027157 L1-dcache-load-misses
4.132272210 seconds time elapsed
3.778635000 seconds user
0.296472000 seconds sys
```
]
)
There is still an approximate 10-fold difference between the two configurations' `#gls("l1", long: false)` cache misses.
])
#task([Events analysed with `#gls("perf", long: false)`:],[
- *Instructions*: Indicates the total number of `#gls("cpu", long: false)` instructions executed while the program is running.
- *Cache-misses*: This occurs when the required data is not currently stored in the cache hierarchy, forcing the processor to fetch it from slower main memory (`#gls("ram", long: false)`).
- *Branch-misses*: Occurs during conditional branching when the `#gls("cpu", long: false)`'s branch predictor incorrectly guesses the next instruction path, resulting in pipeline flushes.
- *L1-dcache-load-misses*: Occurs when the requested data is not present in the Level 1 Data Cache (`#gls("l1", long: false)` dcache), requiring a lookup in the next cache level (`#gls("l2", long: false)` cache).
- *CPU-migrations*: Indicates the number of times the operating system scheduler moved the program threads from one `#gls("cpu", long: false)` core to another.
- *Context-switches*: Occurs when the process relinquishes the `#gls("cpu", long: false)` core to allow other processes to run. This context-switch requires saving and restoring processor registers, including the `#gls("pc", long: false)`.
])
#task([Timing performance of `#gls("perf", long: false)`], [
Below are several execution times for the optimized program:
#figure(table(
columns: (1fr, 1fr),
// stroke: none,
[*Without `#gls("perf", long: false)`*], [*With `#gls("perf", long: false)`*],
[
```
real 0m 4.44s
user 0m 3.83s
sys 0m 0.29s
```
],
[
```
real 0m 4.38s
user 0m 4.05s
sys 0m 0.27s
```
],[
```
real 0m 4.75s
user 0m 4.09s
sys 0m 0.34s
```
],[
```
real 0m 4.75s
user 0m 4.09s
sys 0m 0.34s
```
],
),
caption:[Impact of the `#gls("perf", long: false)` tool]
)<impact-perf>
As seen in @impact-perf, running the program with `#gls("perf", long: false)` does not introduce a significant performance overhead, which can be attributed to stable `#gls("cpu", long: false)` core scheduling and allocation.
])
== Exercise 2
The program fills an array with random numbers between 0 and 512. Then, it iterates 10,000 times over the entire array to sum all elements that are greater than or equal to 256.
#figure(
table(
columns: (1fr),
[Without Optimisation],
[
```
26170.47 msec task-clock # 1.000 CPUs utilized
17 context-switches # 0.650 /sec
0 cpu-migrations # 0.000 /sec
74 page-faults # 2.828 /sec
21354981945 cycles # 0.816 GHz
14768657990 instructions # 0.69 insn per cycle
988541451 branches # 37.773 M/sec
327869867 branch-misses # 33.17% of all branches
26.178296596 seconds time elapsed
26.117025000 seconds user
0.003961000 seconds sys
```
], [With "sort" optimisation],[
```
23430.74 msec task-clock
17 context-switches # 0.726 /sec
0 cpu-migrations # 0.000 /sec
109 page-faults # 4.652 /sec
19119368029 cycles # 0.816 GHz
14818405467 instructions # 0.78 insn per cycle
997843744 branches # 42.587 M/sec
805002 branch-misses # 0.08% of all branches
23.439504220 seconds time elapsed
23.382177000 seconds user
0.003961000 seconds sys
```
]
),
caption:[Ex02 timing optimisation]
)<sort-optimization>
In @sort-optimization, there is a gain of around 3 seconds due to a massive decrease in branch misses, dropping from 33.17% to 0.08%.
This is explained by the `#gls("cpu", long: false)`'s branch predictor. Inside the loop, the program checks if the value is `>= 256`. When the array is filled with random numbers, the processor cannot predict the outcome of this condition, resulting in frequent pipeline flushes. However, when the array is sorted, the condition is always false for the first half of the array, and always true for the second half. The `#gls("cpu", long: false)` easily predicts this pattern, avoiding branch misses and executing much faster.
The same test was performed with the `-O1` optimisation flag, and there is almost no difference between the two scripts. The optimized version is around 4.12s and the basic version is around 4.6s. The difference of 0.6 seconds can be explained by the sorting algorithm itself in the optimized version, as sorting is the only added operation.
== Exercise 3
By analysing the call graph with `#gls("perf", long: false) report`, we can trace the indirect calls to `std::operator==<char>` back to our application. The bottleneck originates in the `HostCounter::isNewHost` function, specifically during the `std::find` operation on a `std::vector`:
```c
bool HostCounter::isNewHost(std::string hostname)
{
return std::find(myHosts.begin(), myHosts.end(), hostname) == myHosts.end();
}
```
Searching through an unsorted vector requires a linear comparison of strings ($O(N)$ complexity), which is highly inefficient. As shown below, processing just a sample of the logs takes over 2 minutes:
```
|> time ./read-apache-logs access_log_NASA_Jul95_samples
Processing log file access_log_NASA_Jul95_samples
Found 14867 unique Hosts/IPs
real 2m 15.58s
user 2m 14.68s
sys 0m 0.12s
```
To fix this, the data structure must be changed from `std::vector` to `std::set`. A set uses a tree-based structure, reducing the search complexity to $O(log N)$ (or $O(1)$.
#figure(
image("command-after-optimization.png"),
caption:[ `#gls("perf", long: false)` report after migrating to `std::set`]
)<command-opti>
After applying these changes, the `#gls("perf", long: false)` report in @command-opti shows a much healthier execution profile. The execution time drops drastically, creating a massive performance gap compared to the initial `std::vector` implementation:
```
|> time ./read-apache-logs access_log_NASA_Jul95_samples
Processing log file access_log_NASA_Jul95_samples
Found 14867 unique Hosts/IPs
real 0m 1.55s
user 0m 1.36s
sys 0m 0.10s
```
Even when processing the entire log file containing roughly 2 million entries, the optimized program finishes in under 15 seconds:
```
|> time ./read-apache-logs access_log_NASA_Jul95
Processing log file access_log_NASA_Jul95
Found 81983 unique Hosts/#gls("ip", long: false)s
real 0m 14.76s
user 0m 13.90s
sys 0m 0.68s
```
#task([Measure interruption latency and jitter], [
To measure latency and jitter, a hardware-based approach using an oscilloscope and a square-wave generator was implemented.
First, the generator toggles a processor pin to trigger the interrupt routine. Then, another pin creates a pulse as a response, which is measured by the oscilloscope. The latency is the delay between the generator's rising edge and the response pulse. The jitter is the variation of this latency over multiple measurements.
To differentiate between Kernel Space and User Space:
- *Kernel Space*: The response pin is toggled directly inside the kernel's Interrupt Service Routine (`#gls("irq", long: false)` handler / driver).
- *User Space*: The response pin is toggled by a user application that wakes up (using `#gls("epoll", long: false)()`) after the kernel has handled the interrupt.
The difference between these two latency measurements represents the context-switch overhead from kernel mode to user mode.
])
+62
View File
@@ -0,0 +1,62 @@
#import "@preview/hei-synd-thesis:0.4.0": *
#import "/doc/resources/glossary.typ": *
#import "@preview/grape-suite:3.1.0": exercise
#import exercise: task, subtask
//-------------------------------------
// Document options
//
#let option = (
type : "final",
lang : "en",
)
//-------------------------------------
// Metadata of the document
//
#let doc= (
abbr : "CSEL",
logos: (
tp_topleft : image("/doc/resources/img/logo-mse.png", width: 9cm),
tp_topright : image("/doc/resources/img/hesso-logo.svg", width: 4.5cm),
header : image("/doc/resources/img/csel.png", width: 2.5cm),
),
authors: (
(
name : "Yann Sierro",
abbr : "SIY",
email : "yann.sierro@master.hes-so.ch",
),
(
name : "Rémi Heredero",
abbr : "HER",
email : "remi.heredero@hevs.ch",
),
),
school: (
name : "HES-SO Master",
major : "Computer Science",
orientation : "Embedded",
),
course: (
name : "CSEL",
prof : "Jacques Supcik",
semester : "Spring Semester 2026",
),
keywords : ("HES-SO", "Computer Science", "Embedded Systems", "CSEL"),
)
#let date = datetime.today()
//-------------------------------------
// Settings
//
#let tableof = (
toc: true,
tof: false,
tot: false,
tol: false,
toe: false,
maxdepth: 3,
)
#let gloss = true
+189
View File
@@ -0,0 +1,189 @@
// #import "@preview/hei-synd-report:0.1.1": *
#import "@preview/hei-synd-thesis:0.2.3": *
#import "/doc/metadata.typ": *
#import "/doc/resources/glossary.typ": *
#show:make-glossary
#register-glossary(entry-list)
#import "@preview/fractusist:0.1.1":*
//-------------------------------------
// Template config
//
#{
doc.title = "Mini-Project"
doc.subtitle = [
Mini-Project
]
doc.logos.tp_main = dragon-curve(
12,
step-size: 10,
stroke-style: stroke(
//paint: gradient.linear(..color.map.rocket, angle: 135deg),
paint: gradient.radial(..color.map.rocket),
thickness: 3pt, join: "round"),
height: 10cm,
)
doc.version = "v0.1.0"
}
#show: report.with(
option: option,
doc: doc,
date: date,
tableof: tableof,
)
#import "@preview/codly:1.3.0": *
#import "@preview/codly-languages:0.1.8": *
#show: codly-init.with()
#codly(languages: codly-languages)
#v(5em)
#infobox()[
The repository for these lab can be found at the following address:
#align(center)[https://github.com/Klagarge/MSE-MA-CSEL]
]
#pagebreak()
//-------------------------------------
// Content
//
#let general-architecture = [
#figure(
image("mini-project/deployement.png", width: 100%),
caption: "General architecture"
) <fig:general-architecture>
]
= Introduction
The purpose of this mini-project is to train different concept we saw during the semester.
We simulate a fan controlled by the temperature of the @cpu. To simulate this fan, we blink the status @led.
The @fig:general-architecture shows the general architecture of the project.
This @led and the measure of the temperature is managed by a kernel module. This module support an automatic and manual mode. In the automatic mode, the blinking frequency is automatically adjusted according to the temperature. We can switch this mode by a @sysfs entry. In the manual mode, we can set the blinking frequency by writing in another @sysfs entry. The @sysfs also provide an entry to read the current temperature and blinking frequency.
Another part in this mini-project is to create a daemon in user-space to control manually the fan. The buttons are read by the daemon to increase and decrease the blinking frequency in manual mode. The daemon also displays the current temperature and blinking frequency on an @oled screen. The daemon can also be controlled by an @ipc interface.
Finally, a tiny @cli is implemented to control the daemon through the @ipc interface.
#general-architecture
#pagebreak()
= Architecture
In our architecture, we manage to separate with callback our functionalities. Then, we use threads for multiprocessing which involve to implement some atomic operations, signals and mutex. We add socket pair and @sysfs for communication. Finally, we get some information through registers.
== Kernel
The kernel part is separated in three main parts: the blink, the temperature, and the @sysfs. All this part are initialized in the main but handle in a regulator that build the logic of the auto/man mode. In auto mode, the regulator sets the frequency according to the temperature. The regulator also handles the @sysfs for setting the mode and the frequency in case of the manual mode.
=== blink
The `blink.c` and `blink.h` files implement the part that control the status @led. It's a kernel module, so we have an init and an exit function. The init function create a kernel thread that blink to a specific frequency. The exit function stop this thread. The period is stored in a global `atomic_t` variable, so it can be safely set with the `adjust_period` function.
=== temperature
The read of temperature is done through the register. It implements the function to calculate the temperature from the register. It changes the formula when the temperature is over 70 °C, as specified in the datasheet.
=== #gls("sysfs", long: false)
It uses some callbacks for every action in the module:
- read temperature
- set and get mode
- set period
- get period
We separate the setter and the getter of the period to avoid some issue. Because if we set a wrong value or in automatic mode, the value would be wrong for getting it. In the way we did it, the read value will be the current.
#pagebreak()
== Daemon
The daemon has the core in `app`. It handles the `sysfs` functions needed by the different features. It provides them for the @oled screen, buttons, @led:pl and @ipc server.
=== #gls("gpio", long: false)
We develop the @gpio part as near as possible with a pseudo class for the @led and a pseudo class for the button. The @led class is quite simple and help to have a good understanding of this principle. As shown in @fig:led-class-header, we create a structure for the @led. A `LED_init` function is used to create a @led object by returning a pointer to this structure. Function to this class start with the same prefix `LED_` and take a pointer to the structure as parameter.
#figure(
[```c
typedef enum {
LED_STATUS,
LED_POWER,
} LED_type; // enum to choose which led we want initialize
typedef struct {
int gpio;
} LED; // Type for our led class
LED* LED_init(LED_type type); // Create new LED object
void LED_on(LED* led);
void LED_off(LED* led);
void LED_toggle(LED* led);
```],
caption: "Led class header"
) <fig:led-class-header>
We develop the button in the same way, with class spirit. But a button has no function to control it, but only a callback that need to be set as shown in @fig:button-class-header. So this pseudo class abstract the complexity of a button, and we provide a simple @api with a nice callback system. Behind the scene, we have a thread that looks the button file with an `@epoll` and call the callback when the button is pushed. The first button to be initialized create this static thread. All new buttons are added on the event list of this thread.
#figure(
[```c
typedef void (*BTN_callback)();
BTN* BTN_init(BTN_type type);
void BTN_set_callback(BTN* btn, BTN_callback callback);
```],
caption: "Button class header"
) <fig:button-class-header>
=== #gls("ipc", long: false)
The @ipc provides a server to handle messages from other processes with a socket pair. All is defined in a common file: `src/06-mini-project/common/common_ipc.h`. This file implements the action and the format of the message through the socket.
#pagebreak()
=== #gls("oled", long: false)
The @oled part has nothing special, we basically use the provided example. But we had to modify the devicetree to add the @i2c that control the screen. It was the first time we had to modify the buildroot part. We forgot a bit how it's absolutely not enough to modify in `/config/board/.../nanopi-neo-plus2.dts`. In the `get-buildroot.sh` script, there is a rsync command that was done only at the full beginning of the semester when we initialize everything. To effectively modify the devicetree, we had to copy our modification, then rebuild (it's short because most parts are already built):
```bash
rsync -a /workspace/config/board/ /buildroot/board/
rsync -a /workspace/config/configs/ /buildroot/configs/
cd /buildroot
make linux-rebuild
make uboot-rebuild
make
```
Then, if we boot with @tftp, we can simply reboot. Otherwise, we have to reflash the sd card with the new image.
=== application
This part is the core of the daemon and provides @api for the @oled screen, the buttons, and the @ipc to set and get values from the module. It uses @sysfs technology to communicate with the kernel.
It implements some specific action like increase and decrease the period of the @led. It provides too specifics functions for the buttons because it has to signal with the power @led when it is pushed. We called that an animation.
This animation is managed by a signal and a condition. The function increase and decrease for the buttons increment a counter and send a signal to the animation thread. It handles it and makes the animation until the counter reach 0. Then it waits with the `pthread_cond_wait`.
== #gls("cli", long: false)
The @cli is connected to the daemon through the socketpair define in the `common` as the @ipc. It uses the same struct and actions for changing mode or set, increase, decrease a period.
It is installed in the `/usr/bin` by the `justfile`. It allows using it from everywhere in the terminal. It can be used as a tool.
#pagebreak()
= Future work
#let link-github-project = "https://github.com/users/Klagarge/projects/3/views/1?filterQuery=is%3Aopen"
C.f.: #link(link-github-project)[GitHub project] #footnote(link-github-project)
= Conclusion
Really fun, but sadly not enough time for more over-engineering. #emoji.face.cry
//-------------------------------------
// Glossary
//
#heading(numbering:none, outlined: false)[] <sec:end>
#make_glossary(gloss:gloss, title:i18n("gloss-title"))
Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

+3
View File
@@ -0,0 +1,3 @@
<diagram program="umletino" version="15.1"><zoom_level>9</zoom_level><element><id>UMLDeployment</id><coordinates><x>63</x><y>324</y><w>342</w><h>234</h></coordinates><panel_attributes>Kernel module</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLDeployment</id><coordinates><x>441</x><y>324</y><w>342</w><h>234</h></coordinates><panel_attributes>Daemon</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLDeployment</id><coordinates><x>675</x><y>261</y><w>81</w><h>45</h></coordinates><panel_attributes>CLI</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>81</x><y>495</y><w>126</w><h>36</h></coordinates><panel_attributes>blink</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>243</x><y>495</y><w>126</w><h>36</h></coordinates><panel_attributes>temperature</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>243</x><y>369</y><w>126</w><h>36</h></coordinates><panel_attributes>sysfs</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>162</x><y>432</y><w>126</w><h>36</h></coordinates><panel_attributes>symbol=component
regulator</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>216</x><y>378</y><w>45</w><h>72</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>30;10;10;10;10;60</additional_attributes></element><element><id>Relation</id><coordinates><x>117</x><y>441</y><w>63</w><h>72</h></coordinates><panel_attributes>lt=-&gt;</panel_attributes><additional_attributes>50;10;10;10;10;60</additional_attributes></element><element><id>Relation</id><coordinates><x>279</x><y>441</y><w>63</w><h>72</h></coordinates><panel_attributes>lt=-&gt;</panel_attributes><additional_attributes>10;10;50;10;50;60</additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>459</x><y>495</y><w>126</w><h>36</h></coordinates><panel_attributes>gpio</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>621</x><y>369</y><w>126</w><h>36</h></coordinates><panel_attributes>ipc</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>621</x><y>495</y><w>126</w><h>36</h></coordinates><panel_attributes>oled</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLGeneric</id><coordinates><x>549</x><y>432</y><w>126</w><h>36</h></coordinates><panel_attributes>symbol=component
application</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>360</x><y>378</y><w>225</w><h>72</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>10;10;230;10;230;60</additional_attributes></element><element><id>Relation</id><coordinates><x>504</x><y>441</y><w>63</w><h>72</h></coordinates><panel_attributes>lt=-&gt;</panel_attributes><additional_attributes>50;10;10;10;10;60</additional_attributes></element><element><id>Relation</id><coordinates><x>666</x><y>441</y><w>63</w><h>72</h></coordinates><panel_attributes>lt=-&gt;</panel_attributes><additional_attributes>10;10;50;10;50;60</additional_attributes></element><element><id>Relation</id><coordinates><x>594</x><y>378</y><w>45</w><h>72</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>30;10;10;10;10;60</additional_attributes></element><element><id>Relation</id><coordinates><x>702</x><y>297</y><w>27</w><h>90</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>10;80;10;10</additional_attributes></element></diagram>
+262
View File
@@ -0,0 +1,262 @@
#import "@preview/hei-synd-report:0.1.1": *
#let entry-list = (
(
key: "hei",
short: "HEI",
long: "Haute École d'Ingénierie",
group: "University"
),
(
key: "synd",
short: "SYND",
long: "Systems Engineering",
group: "University"
),
(
key: "it",
short: "IT",
long: "Infotronics",
group: "University"
),
(
key: "rust",
short: "Rust",
plural: "Rust programs",
long: "Rust Programming Language",
description: "Rust is a modern systems programming language focused on safety, speed, and concurrency. It prevents common programming errors such as null pointer dereferencing and data races at compile time, making it a preferred choice for performance-critical applications.",
group: "Programming Language"
),
(
key: "csel",
short: "CSEL",
long: "Conception de Systèmes Embarqués sous Linux",
description: "Embedded Linux Systems Design course at HES-SO, covering kernel development, driver programming, and system optimization.",
group: "Course"
),
(
key: "cpu",
short: "CPU",
long: "Central Processing Unit",
description: "The primary component of a computer that performs most of the processing inside the computer, executing instructions of computer programs.",
group: "Hardware"
),
(
key: "l1",
short: "L1",
long: "Level 1 Cache",
description: "The primary cache of a CPU, typically built directly into the processor chip, representing the fastest but smallest cache level closest to the execution units.",
group: "Hardware"
),
(
key: "l2",
short: "L2",
long: "Level 2 Cache",
description: "A secondary cache that is larger but slightly slower than the L1 cache, serving to catch cache misses from the L1 cache before querying system memory.",
group: "Hardware"
),
(
key: "ram",
short: "RAM",
long: "Random-Access Memory",
description: "A form of volatile computer memory that can be read and changed in any order, used to store working data and machine code currently in use.",
group: "Hardware"
),
(
key: "pc",
short: "PC",
long: "Program Counter",
description: "A processor register that indicates where the computer is in its program sequence, holding the address of the next instruction to be executed.",
group: "Hardware"
),
(
key: "led",
short: "LED",
plural: "LEDS",
long: "Light Emitting Diode",
description: "A semiconductor light source that emits light when current flows through it.",
group: "Hardware"
),
(
key: "gpio",
short: "GPIO",
plural: "GPIOs",
long: "General-Purpose Input/Output",
description: "Uncommitted digital signal pins on an integrated circuit or electronic circuit board whose behavior can be programmed as input or output at runtime.",
group: "Hardware"
),
(
key: "pid",
short: "PID",
plural: "PIDs",
long: "Process Identifier",
description: "A unique numerical identifier assigned by the operating system kernel to each active process, used for managing, scheduling, and tracking processes.",
group: "Operating System"
),
(
key: "irq",
short: "IRQ",
plural: "IRQs",
long: "Interrupt Request",
description: "A signal sent to the processor that temporarily suspends the current program execution to allow an Interrupt Service Routine (ISR) to run in response to a hardware event.",
group: "Operating System"
),
(
key: "gpu",
short: "GPU",
long: "Graphics Processing Unit",
description: "A specialized electronic circuit designed to accelerate graphics rendering and parallel computing tasks.",
group: "Hardware"
),
(
key: "cuda",
short: "CUDA",
long: "Compute Unified Device Architecture",
description: "A parallel computing platform and application programming interface model created by NVIDIA.",
group: "Programming API"
),
(
key: "openmp",
short: "OpenMP",
long: "Open Multi-Processing",
description: "An application programming interface that supports multi-platform shared-memory multiprocessing programming.",
group: "Programming API"
),
(
key: "io",
short: "I/O",
long: "Input/Output",
description: "The communication between an information processing system (such as a computer) and the outside world.",
group: "Computer Science"
),
(
key: "ip",
short: "IP",
plural: "IPs",
long: "Internet Protocol",
description: "The principal communications protocol in the Internet protocol suite for relaying datagrams across network boundaries.",
group: "Computer Science"
),
(
key: "oom",
short: "OOM",
long: "Out of Memory",
description: "A state of computer operation where no additional memory can be allocated, often leading to the invocation of an OOM killer to terminate processes.",
group: "Operating System"
),
(
key: "sysfs",
short: "sysfs",
long: "System Filesystem",
description: "A virtual pseudo-filesystem provided by the Linux kernel that exports information about hardware, device drivers, and kernel subsystems to user space.",
group: "Operating System"
),
(
key: "syslog",
short: "syslog",
long: "System Logging",
description: "A standard protocol and utility for system message logging in UNIX and Linux systems, allowing applications to log messages to files, consoles, or remote syslog daemons.",
group: "Operating System"
),
(
key: "perf",
short: "perf",
long: "Performance Events for Linux",
description: "A powerful performance supervising and analyzing tool in Linux, capable of profiling hardware performance counters, tracepoints, software performance counters, and dynamic probes.",
group: "Operating System"
),
(
key: "epoll",
short: "epoll",
long: "Event Poll",
description: "A scalable Linux I/O event notification facility designed to monitor multiple file descriptors with high efficiency.",
group: "Operating System"
),
(
key: "cgroup",
short: "cgroup",
plural: "cgroups",
long: "Control Groups",
description: "A Linux kernel feature that limits, polices, and isolates resource usage (such as CPU, memory, and disk I/O) for groups of processes.",
group: "Operating System"
),
(
key: "mib",
short: "MiB",
plural: "MiBs",
long: "Mebibyte",
description: "A unit of digital information equal to 1,048,576 bytes (2^20 bytes).",
group: "Computer Science"
),
(
key: "ipc",
short: "IPC",
long: "Inter-Process Communication",
description: "A set of programming interfaces that allow processes to communicate with each other and synchronize their actions.",
group: "Operating System"
),
(
key: "tftp",
short: "TFTP",
long: "Trivial File Transfer Protocol",
description: "A simple protocol for transferring files, typically used for booting devices over a network.",
group: "Networking"
),
(
key: "cli",
short: "CLI",
long: "Command Line Interface",
description: "A text-based interface used to interact with software and operating systems by typing commands into a terminal.",
group: "Computer Science"
),
(
key: "api",
short: "API",
long: "Application Programming Interface",
description: "A set of defined rules that enable different software applications to communicate with each other.",
group: "Computer Science"
),
(
key: "i2c",
short: "I2C",
long: "Inter-Integrated Circuit",
description: "A synchronous, multi-controller/multi-target, single-ended, serial communication bus used for attaching lower-speed peripheral ICs to processors and microcontrollers.",
group: "Hardware"
),
(
key: "oled",
short: "OLED",
description: "A light-emitting diode (LED) in which the emissive electroluminescent layer is a film of organic compound that emits light in response to an electric current.",
group: "Hardware"
)
)
#let make_glossary(
gloss:true,
title: i18n("gloss-title"),
) = {[
#if gloss == true {[
#pagebreak()
#set heading(numbering: none)
= #title <sec:glossary>
#print-glossary(
entry-list,
// show all term even if they are not referenced, default to true
show-all: false,
// disable the back ref at the end of the descriptions
disable-back-references: false,
)
]} else{[
#set text(size: 0pt)
#title <sec:glossary>
#print-glossary(
entry-list,
// show all term even if they are not referenced, default to true
show-all: false,
// disable the back ref at the end of the descriptions
disable-back-references: false,
shorthands: ("plural", "capitalize", "capitalize-plural", "short", "long"),
)
]}
]}
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

+390
View File
@@ -0,0 +1,390 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 270.79999 138.8"
height="138.8"
width="270.79999"
xml:space="preserve"
version="1.1"
id="svg2"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><g
transform="matrix(1.25,0,0,-1.25,0,138.8)"
id="g10"><g
transform="scale(0.1,0.1)"
id="g12"><path
id="path14"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 957.816,609.5 c -5.812,0 -6.246,0 -12.39,-0.312 l -0.653,0.722 c 0.325,11.574 0.653,24.067 0.543,34.711 -2.523,0 -5.265,0.106 -10.312,0.106 -8.555,0 -17.992,-0.106 -25.547,-0.211 -0.117,-19.625 0.215,-26.547 0.758,-34.297 l -0.543,-0.719 c -6.035,0 -6.359,0 -12.391,-0.312 l -0.66,0.722 c 0.434,10.129 0.543,15.395 0.543,46.695 0,13.942 -0.324,18.907 -0.648,25.11 l 0.648,0.715 c 5.606,0.109 6.914,0.109 12.176,0.308 l 0.555,-0.718 c -0.11,-6.098 -0.329,-14.571 -0.329,-28.719 5.7,-0.11 8.77,-0.211 15.903,-0.211 10.082,0 14.691,0.101 19.847,0.316 -0.218,19.625 -0.218,21.895 -0.773,28.309 l 0.555,0.715 c 5.918,0.109 6.797,0.109 12.168,0.308 l 0.55,-0.718 c -0.332,-10.024 -0.437,-16.532 -0.437,-34.602 0,-20.051 0.437,-27.691 1.098,-37.199 l -0.661,-0.719" /><path
id="path16"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1020.65,641.004 c 0,4.336 0,10.019 -0.76,12.918 -2.3,8.055 -10.2,10.633 -18.31,10.633 -6.475,0 -12.834,-1.34 -18.982,-3.403 l -0.649,-0.621 c -0.109,-2.168 -0.109,-2.789 -0.332,-7.539 l 0.871,-0.512 c 4.617,1.856 9.547,3.915 16.676,3.915 5.476,0 8.006,-1.961 9.106,-3.825 0.99,-1.652 0.99,-3.605 0.99,-6.398 l -1.88,-0.211 c -19.735,-2.168 -32.013,-6.613 -32.013,-20.453 0,-10.227 7.68,-17.246 18.641,-17.246 8.332,0 13.272,3.715 15.362,5.261 l -0.11,-3.714 0.43,-0.621 c 5.05,0.207 5.93,0.312 11.07,0.406 l 0.56,0.527 c -0.56,6.719 -0.67,7.848 -0.67,20.652 l 0,10.231 z m -11.28,-2.481 0,-17.25 c -1.21,-1.031 -5.16,-4.543 -11.964,-4.543 -10.414,0 -10.414,8.879 -10.414,9.399 0,9.195 10.309,10.637 21.378,12.191 l 1,0.203" /><path
id="path18"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1089.31,662.898 c -0.22,-7.839 -0.33,-15.171 -0.33,-23.55 0,-12.7 0.33,-20.34 0.56,-24.785 0,-1.454 0.1,-2.895 0.21,-4.344 l -0.44,-0.625 c -5.26,-0.094 -6.14,-0.199 -11.18,-0.406 l -0.66,0.621 0.11,4.336 c -2.41,-1.653 -8.23,-5.883 -17.22,-5.883 -4.28,0 -8.99,0.926 -12.5,3.515 -7.02,5.364 -7.02,14.149 -7.13,22.2 l 0,6.414 c -0.22,14.769 -0.22,16.425 -0.55,21.996 l 0.55,0.726 c 5.15,0.102 6.14,0.102 11.29,0.516 l 0.67,-0.731 -0.45,-22.617 c 0,-2.789 -0.11,-4.859 0,-9.808 0.11,-4.344 0.34,-13.633 11.41,-13.633 6.47,0 11.08,3.402 13.71,5.367 0.11,5.578 0.11,10.332 0.11,16.316 0,14.368 -0.11,17.258 -0.77,23.977 l 0.66,0.715 c 5.05,0.105 6.24,0.105 11.29,0.414 l 0.66,-0.731" /><path
id="path20"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1134.82,617.66 c -0.32,-3.406 -0.32,-4.137 -0.43,-7.129 l -0.55,-0.621 c -2.3,-0.515 -4.17,-0.926 -8.23,-0.926 -2.63,0 -9.54,0 -12.93,5.36 -1.98,3.008 -1.98,5.484 -1.98,17.668 l 0.22,22.726 c -3.84,0 -3.95,-0.09 -7.9,-0.199 l -0.43,0.621 c 0.21,3.305 0.21,4.133 0.21,7.438 l 0.65,0.617 c 2.42,0 3.84,-0.102 7.47,0 -0.11,2.176 -0.11,4.441 -0.11,6.613 -0.11,1.969 -0.22,3.926 -0.33,5.895 l 0.55,0.715 c 4.93,1.14 6.14,1.445 11.19,2.886 l 0.76,-0.508 c -0.33,-6.82 -0.44,-8.16 -0.44,-15.703 4.61,0.102 5.92,0.102 12.17,0.313 l 0.56,-0.621 c -0.23,-2.684 -0.34,-3.821 -0.34,-7.336 l -0.54,-0.621 c -5.48,0.105 -6.15,0.211 -11.95,0.211 l -0.22,-19.223 c 0.11,-1.238 0.11,-7.121 0.11,-8.578 0,-7.531 0.98,-9.906 6.47,-9.906 2.3,0 4.06,0.507 5.26,0.929 l 0.76,-0.621" /><path
id="path22"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1193.61,622.617 c -1.43,-1.133 -3.84,-3 -7.9,-4.543 -3.06,-1.035 -6.36,-1.551 -9.53,-1.551 -3.41,0 -9.67,0.516 -14.15,5.579 -3.74,4.226 -4.06,9.296 -4.17,12.91 17.97,0.105 20.95,0.105 38.06,0 l 0.75,0.621 c 0.11,4.547 0.35,14.769 -5.91,21.801 -3.3,3.718 -9.32,7.121 -17.99,7.121 -14.37,0 -26.65,-9.395 -26.65,-28.61 0,-17.976 11.29,-27.683 29.28,-27.683 9.76,0 15.68,2.988 17.56,3.914 l 0.65,0.726 c 0.22,4.032 0.33,5.067 0.87,9.2 l -0.87,0.515 z m -8.22,20.356 c -10.1,-0.11 -14.26,-0.215 -27.53,-0.11 1.1,10.328 8.33,14.258 14.47,14.258 4.93,0 9.76,-2.383 11.96,-8.055 0.87,-2.378 0.99,-4.652 1.1,-6.093" /><path
id="path24"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1298.24,617.969 c -0.34,-3.516 -0.34,-4.235 -0.56,-7.75 l -0.77,-0.719 c -21.37,0 -24.77,-0.105 -45.61,-0.312 l -0.56,0.722 c 0.34,8.164 0.67,13.742 0.67,32.649 0,17.351 0,27.269 -0.78,39.156 l 0.67,0.715 c 21.6,0.109 25.88,0.109 46.06,0.308 l 0.66,-0.718 c -0.34,-3.106 -0.55,-4.34 -0.77,-8.055 l -0.65,-0.723 c -14.15,0.403 -18.88,0.403 -32.79,0.512 -0.34,-9.508 -0.34,-12.504 -0.34,-22 13.5,-0.109 17.66,0 31.04,0.199 l 0.54,-0.715 c -0.43,-3.621 -0.43,-4.656 -0.54,-7.965 l -0.67,-0.714 c -12.71,0.304 -15.47,0.304 -30.37,0.304 -0.22,-11.98 -0.11,-14.875 0,-24.691 16.56,0 19.95,0 34.1,0.519 l 0.67,-0.722" /><path
id="path26"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1355.93,621.797 c -0.45,-4.445 -0.56,-4.957 -0.89,-9.199 l -0.77,-0.731 c -3.17,-1.437 -7.44,-3.515 -15.12,-3.515 -16.57,0 -27.31,11.265 -27.31,27.39 0,16.414 10.52,28.813 27.52,28.813 7.12,0 12.17,-2.168 15.02,-3.305 l 0.43,-0.719 c -0.43,-3.715 -0.54,-5.062 -0.76,-8.16 l -0.88,-0.418 c -3.6,2.481 -7.77,4.027 -12.17,4.027 -9.1,0 -17.1,-6.605 -17.1,-19.828 0,-14.05 8.45,-19.113 16.99,-19.113 7.47,0 12.06,3.613 14.15,5.168 l 0.89,-0.41" /><path
id="path28"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1421.28,637.18 c -0.22,7.234 -1.66,14.465 -6.69,19.941 -4.81,5.168 -12.18,7.434 -19.63,7.434 -10.96,0 -17.32,-4.223 -20.39,-7.231 -7.35,-6.922 -7.57,-17.043 -7.57,-20.969 0,-3.406 0.1,-13.945 7.57,-21.074 3.5,-3.414 9.75,-6.929 19.63,-6.929 7.67,0 14.15,1.769 18.97,6.308 3.62,3.414 5.93,7.442 7.12,12.508 0.77,3.094 0.99,6.504 0.99,10.012 z m -11.95,-0.414 c 0.1,-2.168 0,-9.09 -2.53,-13.735 -3.17,-5.679 -8.45,-6.918 -12.51,-6.918 -2.18,0 -4.49,0.41 -6.45,1.336 -8.67,4.141 -8.78,14.563 -8.78,18.703 0,4.344 0.34,10.336 3.28,14.563 3.84,5.789 9.99,5.992 12.08,5.992 6.13,0 9.64,-2.684 11.73,-5.883 2.74,-4.554 3.18,-11.476 3.18,-14.058" /><path
id="path30"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1450.56,609.594 c -5.27,-0.094 -6.35,-0.199 -11.52,-0.406 l -0.54,0.722 c 0.23,7.328 0.54,16.637 0.54,36.473 0,14.254 0,29.539 -1.09,42.762 l 0.55,0.625 c 5.37,0.82 6.49,1.031 11.96,2.168 l 0.65,-0.719 c -0.77,-13.539 -0.77,-27.172 -0.77,-40.707 0,-22.629 0.32,-30.473 0.88,-40.293 l -0.66,-0.625" /><path
id="path32"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1515.71,622.617 c -1.43,-1.133 -3.84,-3 -7.9,-4.543 -3.06,-1.035 -6.36,-1.551 -9.53,-1.551 -3.41,0 -9.65,0.516 -14.16,5.579 -3.73,4.226 -4.05,9.296 -4.16,12.91 17.97,0.105 20.95,0.105 38.05,0 l 0.76,0.621 c 0.13,4.547 0.33,14.769 -5.91,21.801 -3.3,3.718 -9.32,7.121 -17.99,7.121 -14.37,0 -26.65,-9.395 -26.65,-28.61 0,-17.976 11.29,-27.683 29.28,-27.683 9.77,0 15.68,2.988 17.54,3.914 l 0.67,0.726 c 0.21,4.032 0.34,5.067 0.86,9.2 l -0.86,0.515 z m -8.24,20.356 c -10.08,-0.11 -14.24,-0.215 -27.51,-0.11 1.08,10.328 8.33,14.258 14.47,14.258 4.93,0 9.76,-2.383 11.96,-8.055 0.88,-2.378 0.99,-4.652 1.08,-6.093" /><path
id="path34"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1601.14,650.824 c 8,-3.316 18.65,-7.652 18.65,-20.875 0,-11.57 -9.12,-21.996 -28.2,-21.996 -11.63,0 -19.08,3.297 -21.71,4.539 l -0.44,0.723 c 0.44,3.625 0.55,5.582 0.87,9.508 l 1.11,0.41 c 2.75,-1.758 9.1,-6.094 19.3,-6.094 11.3,0 16.03,5.473 16.03,11.676 0,7.23 -6.39,10.015 -13.51,12.601 l -5.48,2.278 c -7.8,3.406 -18.2,7.851 -18.2,20.453 0,3.824 1.09,7.75 3.39,10.848 5.05,6.82 14.15,9.093 23.04,9.093 8.67,0 13.91,-1.558 19.73,-3.316 l 0.56,-0.82 c -0.45,-3.93 -0.56,-5.372 -0.88,-9.094 l -0.88,-0.414 c -4.71,2.277 -9.86,4.758 -18.08,4.758 -9.11,0 -14.82,-4.028 -14.82,-10.129 0,-4.641 3.29,-6.809 5.59,-8.157 1.42,-0.836 1.85,-1.035 8.45,-3.726 l 5.48,-2.266" /><path
id="path36"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1648.73,663.32 -0.77,0.614 c -4.92,-0.926 -6.13,-1.235 -11.5,-2.055 l -0.56,-0.629 c 1.33,-11.773 1.33,-19.004 1.42,-35.012 0,-6.101 0.11,-12.195 0.11,-18.285 0,-10.547 -0.2,-17.047 -0.43,-23.351 l 0.56,-0.618 c 3.82,0.102 7.67,0.204 11.5,0.313 l 0.67,0.621 c -0.56,9.703 -0.77,12.391 -0.87,24.781 1.53,-0.105 2.85,-0.199 4.92,-0.199 23.13,0 34.43,13.73 34.43,29.742 0,14.571 -9.75,25.313 -23.69,25.313 -8.54,0 -13.81,-3.918 -16,-5.571 l 0.21,4.336 z m 0,-45.871 c -0.11,5.992 -0.21,12.086 -0.21,18.184 0,5.265 0.1,10.539 0.21,15.91 2.53,1.648 6.69,4.344 12.62,4.344 8.78,0 14.8,-6.621 14.8,-17.364 0,-12.703 -8.34,-21.382 -22.8,-21.382 -1.88,0 -3.19,0.211 -4.62,0.308" /><path
id="path38"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1750.3,622.617 c -1.44,-1.133 -3.84,-3 -7.91,-4.543 -3.06,-1.035 -6.35,-1.551 -9.54,-1.551 -3.39,0 -9.65,0.516 -14.14,5.579 -3.74,4.226 -4.05,9.296 -4.18,12.91 18,0.105 20.95,0.105 38.06,0 l 0.78,0.621 c 0.09,4.547 0.32,14.769 -5.94,21.801 -3.28,3.718 -9.3,7.121 -17.97,7.121 -14.37,0 -26.66,-9.395 -26.66,-28.61 0,-17.976 11.3,-27.683 29.29,-27.683 9.76,0 15.68,2.988 17.54,3.914 l 0.67,0.726 c 0.22,4.032 0.33,5.067 0.86,9.2 l -0.86,0.515 z m -8.78,63.539 c -2.09,-0.113 -4.17,-0.113 -6.26,-0.113 -2.09,0 -4.05,0 -6.46,0.113 l -0.67,-0.527 c -2.4,-6.715 -5.59,-13.316 -6.69,-15.801 l 0.44,-0.719 c 3.85,0 5.05,0 8.01,-0.113 l 0.76,0.422 c 4.95,7.539 5.93,8.98 11.3,15.898 l -0.43,0.84 z m 0.54,-43.183 c -10.08,-0.11 -14.24,-0.215 -27.53,-0.11 1.1,10.328 8.35,14.258 14.49,14.258 4.93,0 9.76,-2.383 11.95,-8.055 0.88,-2.378 0.98,-4.652 1.09,-6.093" /><path
id="path40"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1811.27,621.797 c -0.45,-4.445 -0.54,-4.957 -0.88,-9.199 l -0.76,-0.731 c -3.19,-1.437 -7.46,-3.515 -15.15,-3.515 -16.56,0 -27.3,11.265 -27.3,27.39 0,16.414 10.53,28.813 27.53,28.813 7.14,0 12.17,-2.168 15.01,-3.305 l 0.45,-0.719 c -0.45,-3.715 -0.54,-5.062 -0.76,-8.16 l -0.88,-0.418 c -3.63,2.481 -7.79,4.027 -12.17,4.027 -9.1,0 -17.11,-6.605 -17.11,-19.828 0,-14.05 8.44,-19.113 17,-19.113 7.45,0 12.05,3.613 14.14,5.168 l 0.88,-0.41" /><path
id="path42"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1837.37,678.305 c -5.6,-0.215 -6.81,-0.309 -12.16,-0.836 l -0.67,0.621 c 0.11,1.344 0.11,2.793 0.11,4.129 0,1.863 -0.11,3.515 -0.22,5.594 l 0.78,0.609 c 5.69,0.41 6.68,0.516 12.16,1.031 l 0.66,-0.621 c -0.11,-4.234 -0.11,-5.266 0,-9.809 l -0.66,-0.718 z m -0.12,-68.711 c -5.7,-0.094 -6.57,-0.094 -11.94,-0.406 l -0.55,0.722 c 0.32,5.473 0.66,10.227 0.66,21.692 0,19.73 -0.34,23.457 -1.09,29.55 l 0.53,0.727 c 4.71,0.719 6.37,0.926 11.85,2.055 l 1.09,-0.614 c -0.32,-5.379 -0.66,-10.949 -0.66,-24.277 0,-19.215 0.23,-21.805 0.66,-28.824 l -0.55,-0.625" /><path
id="path44"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1899.44,641.004 c 0,4.336 0,10.019 -0.77,12.918 -2.29,8.055 -10.2,10.633 -18.32,10.633 -6.47,0 -12.82,-1.34 -18.96,-3.403 l -0.67,-0.621 c -0.1,-2.168 -0.1,-2.789 -0.31,-7.539 l 0.87,-0.512 c 4.61,1.856 9.53,3.915 16.67,3.915 5.49,0 8.01,-1.961 9.09,-3.825 0.99,-1.652 0.99,-3.605 0.99,-6.398 l -1.86,-0.211 c -19.73,-2.168 -32.01,-6.613 -32.01,-20.453 0,-10.227 7.68,-17.246 18.63,-17.246 8.33,0 13.27,3.715 15.36,5.261 l -0.12,-3.714 0.44,-0.621 c 5.05,0.207 5.94,0.312 11.08,0.406 l 0.54,0.527 c -0.54,6.719 -0.65,7.848 -0.65,20.652 l 0,10.231 z m -11.29,-2.481 0,-17.25 c -1.22,-1.031 -5.16,-4.543 -11.96,-4.543 -10.42,0 -10.42,8.879 -10.42,9.399 0,9.195 10.31,10.637 21.4,12.191 l 0.98,0.203" /><path
id="path46"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1931.47,609.594 c -5.26,-0.094 -6.37,-0.199 -11.51,-0.406 l -0.56,0.722 c 0.22,7.328 0.56,16.637 0.56,36.473 0,14.254 0,29.539 -1.12,42.762 l 0.56,0.625 c 5.39,0.82 6.47,1.031 11.95,2.168 l 0.65,-0.719 c -0.76,-13.539 -0.76,-27.172 -0.76,-40.707 0,-22.629 0.33,-30.473 0.89,-40.293 l -0.66,-0.625" /><path
id="path48"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1964.14,678.305 c -5.59,-0.215 -6.78,-0.309 -12.17,-0.836 l -0.66,0.621 c 0.11,1.344 0.11,2.793 0.11,4.129 0,1.863 -0.11,3.515 -0.2,5.594 l 0.75,0.609 c 5.71,0.41 6.69,0.516 12.17,1.031 l 0.67,-0.621 c -0.11,-4.234 -0.11,-5.266 0,-9.809 l -0.67,-0.718 z m -0.11,-68.711 c -5.69,-0.094 -6.58,-0.094 -11.95,-0.406 l -0.54,0.722 c 0.33,5.473 0.65,10.227 0.65,21.692 0,19.73 -0.32,23.457 -1.09,29.55 l 0.55,0.727 c 4.71,0.719 6.37,0.926 11.85,2.055 l 1.08,-0.614 c -0.31,-5.379 -0.65,-10.949 -0.65,-24.277 0,-19.215 0.21,-21.805 0.65,-28.824 l -0.55,-0.625" /><path
id="path50"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2007.46,640.898 c 4.41,-1.339 14.38,-4.543 14.38,-15.488 0,-4.137 -1.64,-8.789 -6.14,-12.195 -5.82,-4.641 -13.61,-4.953 -17.56,-4.953 -5.91,0 -10.85,1.031 -15.01,2.586 -0.56,0.199 -1.11,0.402 -1.65,0.613 l -0.55,0.926 c 0.43,4.035 0.43,4.547 0.66,8.676 l 1.11,0.312 c 1.96,-1.441 6.77,-4.953 15.23,-4.953 8.67,0 11.85,4.543 11.85,7.742 0,4.75 -4.71,6.309 -11.42,8.375 l -3.5,1.133 c -4.51,1.34 -14.36,4.332 -14.36,14.984 0,10.637 9.85,15.899 22.14,15.899 8.1,0 13.82,-2.168 15.79,-2.895 l 0.55,-0.719 c -0.44,-3.82 -0.55,-4.234 -0.86,-8.16 l -0.99,-0.41 c -2.76,1.652 -7.03,4.133 -14.15,4.133 -1.53,0 -3.07,-0.109 -4.73,-0.524 -3.3,-0.82 -6.02,-2.988 -6.02,-6.195 0,-4.445 4.49,-5.793 11.31,-7.75 l 3.92,-1.137" /><path
id="path52"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2081.83,622.617 c -1.43,-1.133 -3.84,-3 -7.89,-4.543 -3.07,-1.035 -6.37,-1.551 -9.55,-1.551 -3.4,0 -9.64,0.516 -14.17,5.579 -3.71,4.226 -4.05,9.296 -4.15,12.91 17.98,0.105 20.94,0.105 38.06,0 l 0.76,0.621 c 0.11,4.547 0.34,14.769 -5.92,21.801 -3.29,3.718 -9.33,7.121 -17.98,7.121 -14.36,0 -26.64,-9.395 -26.64,-28.61 0,-17.976 11.29,-27.683 29.27,-27.683 9.77,0 15.69,2.988 17.56,3.914 l 0.65,0.726 c 0.21,4.032 0.32,5.067 0.88,9.2 l -0.88,0.515 z m -8.78,63.539 c -2.07,-0.113 -4.16,-0.113 -6.25,-0.113 -2.08,0 -4.07,0 -6.46,0.113 l -0.67,-0.527 c -2.41,-6.715 -5.59,-13.316 -6.69,-15.801 l 0.44,-0.719 c 3.84,0 5.05,0 8,-0.113 l 0.78,0.422 c 4.94,7.539 5.91,8.98 11.3,15.898 l -0.45,0.84 z m 0.54,-43.183 c -10.08,-0.11 -14.24,-0.215 -27.52,-0.11 1.11,10.328 8.33,14.258 14.47,14.258 4.94,0 9.76,-2.383 11.97,-8.055 0.88,-2.378 0.99,-4.652 1.08,-6.093" /><path
id="path54"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2146.2,622.617 c -1.42,-1.133 -3.84,-3 -7.89,-4.543 -3.09,-1.035 -6.37,-1.551 -9.54,-1.551 -3.41,0 -9.65,0.516 -14.15,5.579 -3.73,4.226 -4.05,9.296 -4.16,12.91 17.97,0.105 20.95,0.105 38.05,0 l 0.76,0.621 c 0.11,4.547 0.34,14.769 -5.92,21.801 -3.29,3.718 -9.34,7.121 -17.99,7.121 -14.36,0 -26.64,-9.395 -26.64,-28.61 0,-17.976 11.3,-27.683 29.28,-27.683 9.76,0 15.68,2.988 17.56,3.914 l 0.64,0.726 c 0.22,4.032 0.33,5.067 0.89,9.2 l -0.89,0.515 z m -8.22,20.356 c -10.09,-0.11 -14.26,-0.215 -27.52,-0.11 1.09,10.328 8.32,14.258 14.45,14.258 4.96,0 9.78,-2.383 11.97,-8.055 0.88,-2.378 0.99,-4.652 1.1,-6.093" /><path
id="path56"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1047.53,565.758 c 0.54,-5.992 1.1,-12.195 0.99,-25 -2.97,0.203 -4.06,0.203 -6.36,0.203 -5.7,0 -16.12,-0.313 -24.14,-7.125 -4.6,-3.824 -9.65,-10.953 -9.65,-22.215 0,-15.699 10.09,-26.555 24.69,-26.555 8,0 12.49,3.313 15.12,5.172 l -0.22,-3.824 0.78,-0.617 c 5.04,0.207 6.35,0.305 11.18,0.305 l 0.55,0.726 c -0.45,7.125 -0.88,14.774 -0.88,30.781 0,10.329 0.11,35.954 0.88,50.313 l -0.77,0.625 c -4.94,-1.035 -6.03,-1.238 -11.63,-2.172 l -0.54,-0.617 z m 0.54,-66.942 c -1.53,-1.238 -5.58,-4.554 -12.27,-4.554 -5.71,0 -9.33,2.484 -11.31,4.652 -2.3,2.578 -4.06,6.82 -4.06,12.707 0,9.192 3.95,14.055 6.37,16.223 5.27,4.644 12.5,4.844 15.9,4.844 2.31,0 3.62,-0.2 5.48,-0.297 0.11,-16.95 0.11,-20.043 -0.11,-33.575" /><path
id="path58"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1124.85,499.227 c -1.43,-1.137 -3.84,-2.997 -7.9,-4.547 -3.08,-1.035 -6.36,-1.555 -9.55,-1.555 -3.39,0 -9.64,0.52 -14.13,5.578 -3.73,4.238 -4.07,9.309 -4.18,12.918 17.99,0.106 20.95,0.106 38.06,0 l 0.77,0.617 c 0.11,4.543 0.32,14.774 -5.93,21.797 -3.28,3.719 -9.31,7.125 -17.98,7.125 -14.37,0 -26.65,-9.398 -26.65,-28.613 0,-17.973 11.29,-27.68 29.29,-27.68 9.75,0 15.68,2.988 17.53,3.922 l 0.67,0.723 c 0.22,4.031 0.33,5.062 0.87,9.191 l -0.87,0.524 z m -8.23,20.351 c -10.09,-0.101 -14.26,-0.211 -27.53,-0.101 1.1,10.328 8.34,14.253 14.48,14.253 4.93,0 9.76,-2.378 11.95,-8.054 0.88,-2.379 0.99,-4.656 1.1,-6.098" /><path
id="path60"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1210.28,527.426 c 8.01,-3.305 18.65,-7.649 18.65,-20.871 0,-11.567 -9.11,-22 -28.2,-22 -11.61,0 -19.07,3.3 -21.71,4.554 l -0.43,0.719 c 0.43,3.613 0.54,5.57 0.87,9.496 l 1.1,0.422 c 2.74,-1.758 9.1,-6.101 19.3,-6.101 11.29,0 16.01,5.476 16.01,11.671 0,7.231 -6.36,10.02 -13.5,12.602 l -5.48,2.277 c -7.77,3.407 -18.21,7.852 -18.21,20.453 0,3.825 1.12,7.758 3.41,10.856 5.05,6.809 14.15,9.086 23.04,9.086 8.65,0 13.92,-1.547 19.74,-3.305 l 0.54,-0.824 c -0.43,-3.93 -0.54,-5.379 -0.87,-9.094 l -0.88,-0.414 c -4.72,2.274 -9.88,4.75 -18.1,4.75 -9.1,0 -14.8,-4.023 -14.8,-10.121 0,-4.648 3.28,-6.816 5.59,-8.164 1.42,-0.828 1.87,-1.027 8.44,-3.719 l 5.49,-2.273" /><path
id="path62"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1294.4,539.512 c -0.22,-7.844 -0.34,-15.184 -0.34,-23.551 0,-12.699 0.34,-20.352 0.56,-24.793 0,-1.449 0.11,-2.898 0.21,-4.34 l -0.43,-0.625 c -5.26,-0.101 -6.15,-0.199 -11.19,-0.406 l -0.65,0.617 0.11,4.336 c -2.42,-1.641 -8.24,-5.883 -17.22,-5.883 -4.27,0 -8.99,0.93 -12.51,3.512 -7.02,5.375 -7.02,14.152 -7.12,22.207 l 0,6.406 c -0.22,14.77 -0.22,16.426 -0.56,22 l 0.56,0.727 c 5.14,0.109 6.13,0.109 11.28,0.515 l 0.67,-0.722 -0.44,-22.617 c 0,-2.801 -0.12,-4.856 0,-9.809 0.1,-4.348 0.33,-13.645 11.4,-13.645 6.47,0 11.08,3.407 13.72,5.375 0.11,5.571 0.11,10.329 0.11,16.321 0,14.363 -0.11,17.254 -0.78,23.965 l 0.67,0.726 c 5.05,0.094 6.25,0.094 11.29,0.406 l 0.66,-0.722" /><path
id="path64"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1326.98,554.91 c -5.61,-0.211 -6.82,-0.312 -12.19,-0.84 l -0.66,0.629 c 0.12,1.348 0.12,2.793 0.12,4.129 0,1.863 -0.12,3.516 -0.22,5.586 l 0.76,0.617 c 5.71,0.41 6.7,0.516 12.19,1.024 l 0.65,-0.614 c -0.11,-4.23 -0.11,-5.265 0,-9.808 l -0.65,-0.723 z m -0.13,-68.707 c -5.7,-0.101 -6.58,-0.101 -11.95,-0.406 l -0.54,0.726 c 0.32,5.473 0.65,10.223 0.65,21.688 0,19.727 -0.33,23.457 -1.1,29.543 l 0.56,0.726 c 4.72,0.723 6.36,0.934 11.84,2.071 l 1.1,-0.629 c -0.34,-5.363 -0.65,-10.949 -0.65,-24.27 0,-19.222 0.22,-21.804 0.65,-28.824 l -0.56,-0.625" /><path
id="path66"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1370.3,517.504 c 4.38,-1.332 14.36,-4.535 14.36,-15.484 0,-4.141 -1.65,-8.79 -6.14,-12.192 -5.82,-4.652 -13.61,-4.961 -17.56,-4.961 -5.92,0 -10.85,1.035 -15.02,2.582 -0.54,0.207 -1.1,0.406 -1.64,0.621 l -0.55,0.926 c 0.44,4.031 0.44,4.547 0.66,8.676 l 1.1,0.316 c 1.97,-1.445 6.79,-4.961 15.25,-4.961 8.65,0 11.83,4.551 11.83,7.746 0,4.747 -4.71,6.313 -11.4,8.372 l -3.51,1.128 c -4.49,1.348 -14.37,4.344 -14.37,14.985 0,10.64 9.88,15.902 22.15,15.902 8.12,0 13.82,-2.168 15.8,-2.89 l 0.54,-0.719 c -0.43,-3.821 -0.54,-4.242 -0.87,-8.156 l -0.99,-0.422 c -2.74,1.66 -7.01,4.136 -14.15,4.136 -1.53,0 -3.07,-0.105 -4.72,-0.519 -3.28,-0.828 -6.03,-2.996 -6.03,-6.195 0,-4.442 4.5,-5.786 11.31,-7.743 l 3.95,-1.148" /><path
id="path68"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1423.15,517.504 c 4.38,-1.332 14.35,-4.535 14.35,-15.484 0,-4.141 -1.62,-8.79 -6.14,-12.192 -5.79,-4.652 -13.6,-4.961 -17.53,-4.961 -5.93,0 -10.87,1.035 -15.02,2.582 -0.55,0.207 -1.11,0.406 -1.65,0.621 l -0.54,0.926 c 0.43,4.031 0.43,4.547 0.65,8.676 l 1.09,0.316 c 1.99,-1.445 6.8,-4.961 15.24,-4.961 8.66,0 11.84,4.551 11.84,7.746 0,4.747 -4.7,6.313 -11.39,8.372 l -3.5,1.128 c -4.52,1.348 -14.38,4.344 -14.38,14.985 0,10.64 9.86,15.902 22.15,15.902 8.12,0 13.81,-2.168 15.8,-2.89 l 0.54,-0.719 c -0.44,-3.821 -0.54,-4.242 -0.87,-8.156 l -0.99,-0.422 c -2.74,1.66 -7.03,4.136 -14.14,4.136 -1.55,0 -3.08,-0.105 -4.72,-0.519 -3.3,-0.828 -6.04,-2.996 -6.04,-6.195 0,-4.442 4.51,-5.786 11.29,-7.743 l 3.96,-1.148" /><path
id="path70"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1497.5,499.227 c -1.43,-1.137 -3.84,-2.997 -7.9,-4.547 -3.06,-1.035 -6.36,-1.555 -9.53,-1.555 -3.41,0 -9.65,0.52 -14.15,5.578 -3.72,4.238 -4.06,9.309 -4.17,12.918 17.98,0.106 20.95,0.106 38.05,0 l 0.77,0.617 c 0.12,4.543 0.34,14.774 -5.92,21.797 -3.3,3.719 -9.32,7.125 -17.99,7.125 -14.35,0 -26.65,-9.398 -26.65,-28.613 0,-17.973 11.29,-27.68 29.28,-27.68 9.77,0 15.69,2.988 17.55,3.922 l 0.66,0.723 c 0.21,4.031 0.34,5.062 0.87,9.191 l -0.87,0.524 z m -8.22,20.351 c -10.1,-0.101 -14.26,-0.211 -27.53,-0.101 1.1,10.328 8.33,14.253 14.48,14.253 4.92,0 9.75,-2.378 11.95,-8.054 0.88,-2.379 0.99,-4.656 1.1,-6.098" /><path
id="path72"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1605.63,513.789 c -0.22,7.231 -1.64,14.457 -6.68,19.941 -4.82,5.168 -12.18,7.43 -19.64,7.43 -10.96,0 -17.33,-4.226 -20.39,-7.23 -7.36,-6.918 -7.57,-17.035 -7.57,-20.961 0,-3.41 0.12,-13.953 7.57,-21.082 3.51,-3.407 9.77,-6.914 19.62,-6.914 7.67,0 14.15,1.75 18.98,6.3 3.62,3.407 5.91,7.43 7.14,12.497 0.75,3.093 0.97,6.503 0.97,10.019 z m -11.94,-0.41 c 0.1,-2.168 0,-9.098 -2.54,-13.742 -3.17,-5.684 -8.44,-6.922 -12.49,-6.922 -2.2,0 -4.49,0.41 -6.47,1.348 -8.67,4.132 -8.78,14.558 -8.78,18.699 0,4.336 0.34,10.332 3.3,14.554 3.84,5.793 9.97,5.993 12.06,5.993 6.14,0 9.65,-2.676 11.74,-5.883 2.73,-4.543 3.18,-11.465 3.18,-14.047" /><path
id="path74"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1664.31,498.398 c -0.43,-4.445 -0.56,-4.957 -0.86,-9.199 l -0.78,-0.719 c -3.19,-1.445 -7.46,-3.507 -15.14,-3.507 -16.55,0 -27.32,11.257 -27.32,27.375 0,16.422 10.53,28.812 27.53,28.812 7.14,0 12.19,-2.168 15.03,-3.301 l 0.44,-0.726 c -0.44,-3.715 -0.54,-5.063 -0.76,-8.16 l -0.88,-0.41 c -3.61,2.48 -7.79,4.027 -12.17,4.027 -9.11,0 -17.11,-6.606 -17.11,-19.828 0,-14.059 8.44,-19.117 17,-19.117 7.45,0 12.06,3.621 14.16,5.171 l 0.86,-0.418" /><path
id="path76"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1719.49,498.398 c -0.47,-4.445 -0.55,-4.957 -0.9,-9.199 l -0.76,-0.719 c -3.17,-1.445 -7.46,-3.507 -15.12,-3.507 -16.57,0 -27.33,11.257 -27.33,27.375 0,16.422 10.55,28.812 27.54,28.812 7.13,0 12.17,-2.168 15.02,-3.301 l 0.43,-0.726 c -0.43,-3.715 -0.54,-5.063 -0.77,-8.16 l -0.87,-0.41 c -3.61,2.48 -7.78,4.027 -12.17,4.027 -9.1,0 -17.11,-6.606 -17.11,-19.828 0,-14.059 8.44,-19.117 16.99,-19.117 7.46,0 12.07,3.621 14.15,5.171 l 0.9,-0.418" /><path
id="path78"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1745.58,554.91 c -5.59,-0.211 -6.8,-0.312 -12.17,-0.84 l -0.67,0.629 c 0.11,1.348 0.11,2.793 0.11,4.129 0,1.863 -0.11,3.516 -0.2,5.586 l 0.76,0.617 c 5.69,0.41 6.69,0.516 12.17,1.024 l 0.66,-0.614 c -0.12,-4.23 -0.12,-5.265 0,-9.808 l -0.66,-0.723 z m -0.11,-68.707 c -5.69,-0.101 -6.58,-0.101 -11.95,-0.406 l -0.56,0.726 c 0.34,5.473 0.66,10.223 0.66,21.688 0,19.727 -0.32,23.457 -1.09,29.543 l 0.56,0.726 c 4.7,0.723 6.34,0.934 11.82,2.071 l 1.1,-0.629 c -0.33,-5.363 -0.67,-10.949 -0.67,-24.27 0,-19.222 0.24,-21.804 0.67,-28.824 l -0.54,-0.625" /><path
id="path80"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1801.95,565.758 c 0.56,-5.992 1.1,-12.195 0.99,-25 -2.97,0.203 -4.05,0.203 -6.37,0.203 -5.71,0 -16.13,-0.313 -24.13,-7.125 -4.6,-3.824 -9.65,-10.953 -9.65,-22.215 0,-15.699 10.08,-26.555 24.68,-26.555 8.01,0 12.5,3.313 15.15,5.172 l -0.24,-3.824 0.77,-0.617 c 5.05,0.207 6.35,0.305 11.2,0.305 l 0.54,0.726 c -0.45,7.125 -0.88,14.774 -0.88,30.781 0,10.329 0.11,35.954 0.88,50.313 l -0.77,0.625 c -4.92,-1.035 -6.02,-1.238 -11.61,-2.172 l -0.56,-0.617 z m 0.56,-66.942 c -1.55,-1.238 -5.61,-4.554 -12.3,-4.554 -5.7,0 -9.32,2.484 -11.29,4.652 -2.3,2.578 -4.07,6.82 -4.07,12.707 0,9.192 3.97,14.055 6.37,16.223 5.26,4.644 12.49,4.844 15.9,4.844 2.3,0 3.62,-0.2 5.5,-0.297 0.09,-16.95 0.09,-20.043 -0.11,-33.575" /><path
id="path82"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1879.27,499.227 c -1.43,-1.137 -3.84,-2.997 -7.89,-4.547 -3.09,-1.035 -6.37,-1.555 -9.54,-1.555 -3.41,0 -9.66,0.52 -14.15,5.578 -3.73,4.238 -4.07,9.309 -4.18,12.918 17.98,0.106 20.95,0.106 38.05,0 l 0.77,0.617 c 0.11,4.543 0.35,14.774 -5.91,21.797 -3.29,3.719 -9.32,7.125 -17.99,7.125 -14.37,0 -26.66,-9.398 -26.66,-28.613 0,-17.973 11.3,-27.68 29.29,-27.68 9.75,0 15.69,2.988 17.54,3.922 l 0.67,0.723 c 0.21,4.031 0.32,5.062 0.87,9.191 l -0.87,0.524 z m -8.23,20.351 c -10.08,-0.101 -14.25,-0.211 -27.53,-0.101 1.11,10.328 8.34,14.253 14.49,14.253 4.92,0 9.75,-2.378 11.95,-8.054 0.86,-2.379 0.99,-4.656 1.09,-6.098" /><path
id="path84"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1947.6,486.203 c -5.29,-0.101 -5.94,-0.101 -10.99,-0.406 l -0.75,0.726 c 0,1.133 0.11,2.266 0.11,3.407 0.1,5.058 0.1,10.121 0.1,15.187 0,15.903 -0.1,16.938 -0.66,19.106 -2.08,7.847 -8.33,7.847 -9.86,7.847 -6.59,0 -11.63,-3.605 -14.59,-5.781 -0.11,-17.969 0.11,-27.375 0.87,-39.461 l -0.65,-0.625 c -5.37,-0.101 -6.26,-0.101 -11.52,-0.406 l -0.54,0.726 c 0.11,5.782 0.32,11.356 0.32,18.997 0,16.535 -0.77,25.316 -1.31,32.234 l 0.65,0.726 c 5.48,0.934 6.46,1.137 11.62,2.071 l 0.78,-0.723 -0.11,-5.371 c 2.85,1.856 9.66,6.402 19.31,6.402 2.74,0 6.14,-0.421 9.1,-1.961 2.83,-1.554 5.16,-3.929 6.35,-6.718 1.44,-3.094 1.53,-6.196 1.65,-12.602 l 0,-12.094 c 0.31,-12.086 0.44,-16.734 0.78,-20.656 l -0.66,-0.625" /><path
id="path86"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1992.99,494.262 c -0.32,-3.403 -0.32,-4.129 -0.43,-7.121 l -0.56,-0.618 c -2.29,-0.519 -4.15,-0.937 -8.21,-0.937 -2.65,0 -9.55,0 -12.96,5.371 -1.96,2.996 -1.96,5.473 -1.96,17.664 l 0.21,22.731 c -3.84,0 -3.94,-0.102 -7.89,-0.211 l -0.44,0.621 c 0.21,3.316 0.21,4.136 0.21,7.441 l 0.66,0.625 c 2.41,0 3.86,-0.109 7.46,0 -0.11,2.168 -0.11,4.438 -0.11,6.606 -0.1,1.972 -0.21,3.921 -0.34,5.89 l 0.56,0.727 c 4.94,1.129 6.15,1.441 11.18,2.887 l 0.77,-0.52 c -0.32,-6.813 -0.43,-8.16 -0.43,-15.699 4.6,0.109 5.91,0.109 12.17,0.308 l 0.56,-0.613 c -0.22,-2.691 -0.34,-3.828 -0.34,-7.344 l -0.54,-0.617 c -5.49,0.11 -6.15,0.215 -11.95,0.215 l -0.24,-19.219 c 0.13,-1.238 0.13,-7.133 0.13,-8.578 0,-7.535 0.98,-9.918 6.46,-9.918 2.31,0 4.07,0.52 5.27,0.93 l 0.76,-0.621" /><path
id="path88"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2049.03,517.609 c 0,4.344 0,10.028 -0.77,12.918 -2.29,8.067 -10.2,10.633 -18.32,10.633 -6.46,0 -12.81,-1.332 -18.96,-3.406 l -0.67,-0.621 c -0.1,-2.164 -0.1,-2.785 -0.32,-7.539 l 0.88,-0.508 c 4.62,1.855 9.54,3.918 16.66,3.918 5.48,0 8.01,-1.961 9.1,-3.824 1,-1.653 1,-3.61 1,-6.407 l -1.87,-0.203 c -19.73,-2.172 -32.03,-6.609 -32.03,-20.457 0,-10.226 7.69,-17.246 18.66,-17.246 8.33,0 13.25,3.715 15.34,5.266 l -0.1,-3.719 0.43,-0.617 c 5.07,0.207 5.92,0.305 11.08,0.406 l 0.56,0.52 c -0.56,6.718 -0.67,7.851 -0.67,20.664 l 0,10.222 z m -11.3,-2.472 0,-17.258 c -1.21,-1.031 -5.15,-4.543 -11.94,-4.543 -10.43,0 -10.43,8.883 -10.43,9.402 0,9.188 10.31,10.641 21.4,12.192 l 0.97,0.207" /><path
id="path90"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2081.06,486.203 c -5.27,-0.101 -6.37,-0.199 -11.53,-0.406 l -0.54,0.726 c 0.22,7.325 0.54,16.629 0.54,36.457 0,14.266 0,29.551 -1.08,42.778 l 0.54,0.617 c 5.38,0.824 6.47,1.027 11.96,2.172 l 0.66,-0.727 c -0.77,-13.527 -0.77,-27.172 -0.77,-40.703 0,-22.621 0.32,-30.476 0.88,-40.289 l -0.66,-0.625" /><path
id="path92"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2146.2,499.227 c -1.42,-1.137 -3.84,-2.997 -7.89,-4.547 -3.09,-1.035 -6.37,-1.555 -9.54,-1.555 -3.41,0 -9.65,0.52 -14.15,5.578 -3.73,4.238 -4.05,9.309 -4.16,12.918 17.97,0.106 20.95,0.106 38.05,0 l 0.76,0.617 c 0.11,4.543 0.34,14.774 -5.92,21.797 -3.29,3.719 -9.34,7.125 -17.99,7.125 -14.36,0 -26.64,-9.398 -26.64,-28.613 0,-17.973 11.3,-27.68 29.28,-27.68 9.76,0 15.68,2.988 17.56,3.922 l 0.64,0.723 c 0.22,4.031 0.33,5.062 0.89,9.191 l -0.89,0.524 z m -8.22,20.351 c -10.09,-0.101 -14.26,-0.211 -27.52,-0.101 1.09,10.328 8.32,14.253 14.45,14.253 4.96,0 9.78,-2.378 11.97,-8.054 0.88,-2.379 0.99,-4.656 1.1,-6.098" /><path
id="path94"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 649.375,337.137 c -10.859,0.304 -13.051,0.304 -26.105,0.422 -0.211,-4.454 -0.211,-20.262 0.66,-31.516 l -0.539,-0.727 c -6.043,0 -6.914,-0.093 -12.731,-0.296 l -0.547,0.71 c 0.438,7.864 0.653,13.844 0.653,44.329 0,14.66 -0.321,21.164 -0.653,27.464 l 0.547,0.727 c 7.57,-0.094 36.629,0.113 44.203,0.313 l 0.543,-0.723 c -0.433,-3.719 -0.433,-4.235 -0.66,-8.254 l -0.66,-0.637 c -13.594,0.317 -17.324,0.414 -30.695,0.414 -0.121,-4.23 -0.332,-14.656 -0.332,-20.761 l 0,-2.368 c 12.5,0.094 16.226,0.2 27.191,0.512 l 0.551,-0.617 c -0.446,-4.754 -0.446,-5.266 -0.766,-8.27 l -0.66,-0.722" /><path
id="path96"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 706.977,336.82 c 0,4.344 0,10.024 -0.778,12.918 -2.293,8.063 -10.191,10.641 -18.312,10.641 -6.469,0 -12.828,-1.344 -18.965,-3.418 l -0.664,-0.609 c -0.113,-2.172 -0.113,-2.793 -0.328,-7.543 l 0.883,-0.512 c 4.605,1.851 9.539,3.922 16.667,3.922 5.489,0 8.004,-1.957 9.106,-3.821 0.98,-1.652 0.98,-3.609 0.98,-6.406 l -1.855,-0.203 c -19.742,-2.172 -32.027,-6.609 -32.027,-20.453 0,-10.234 7.671,-17.25 18.636,-17.25 8.34,0 13.274,3.707 15.356,5.269 l -0.11,-3.722 0.442,-0.613 c 5.047,0.203 5.922,0.296 11.078,0.402 l 0.551,0.527 c -0.551,6.711 -0.66,7.844 -0.66,20.653 l 0,10.218 z m -11.301,-2.476 0,-17.246 c -1.203,-1.032 -5.149,-4.551 -11.953,-4.551 -10.422,0 -10.422,8.887 -10.422,9.406 0,9.188 10.312,10.645 21.39,12.192 l 0.985,0.199" /><path
id="path98"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 768.398,317.617 c -0.449,-4.433 -0.562,-4.957 -0.882,-9.191 l -0.77,-0.727 c -3.183,-1.457 -7.453,-3.515 -15.137,-3.515 -16.558,0 -27.308,11.254 -27.308,27.371 0,16.433 10.527,28.824 27.531,28.824 7.129,0 12.168,-2.164 15.023,-3.305 l 0.442,-0.722 c -0.442,-3.719 -0.551,-5.071 -0.774,-8.161 l -0.875,-0.41 c -3.617,2.481 -7.781,4.02 -12.175,4.02 -9.11,0 -17.11,-6.602 -17.11,-19.824 0,-14.043 8.45,-19.118 17,-19.118 7.461,0 12.063,3.618 14.153,5.168 l 0.882,-0.41" /><path
id="path100"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 830.898,305.422 c -5.261,-0.106 -5.914,-0.106 -10.96,-0.402 l -0.774,0.71 0.113,3.411 c 0.114,5.371 0.114,10.851 0.114,16.222 l -0.114,11.047 c 0,2.379 0,4.754 -0.547,7.031 -1.207,4.75 -4.273,7.84 -9.867,7.84 -6.25,0 -11.082,-3.293 -14.703,-5.773 -0.105,-17.977 0.117,-27.375 0.774,-39.465 l -0.547,-0.621 c -5.039,-0.106 -6.364,-0.106 -11.742,-0.402 l -0.543,0.71 c 0.211,7.336 0.543,16.637 0.543,36.465 0,8.684 -0.11,17.364 -0.223,26.039 -0.215,9.09 -0.543,12.086 -0.863,16.735 l 0.543,0.621 c 5.261,0.824 7.007,1.137 11.953,2.168 l 0.664,-0.727 c -0.664,-11.054 -0.664,-22.203 -0.664,-33.367 3.508,2.172 10.418,6.414 19.629,6.414 2.523,0 5.046,-0.312 7.351,-1.246 4.934,-1.871 7.903,-5.566 8.988,-9.809 0.551,-2.078 0.551,-3.308 0.77,-10.234 l 0,-12.086 0.105,-4.855 c 0.219,-8.664 0.219,-10.125 0.668,-15.805 l -0.668,-0.621" /><path
id="path102"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 899.781,305.422 c -5.269,-0.106 -5.929,-0.106 -10.976,-0.402 l -0.758,0.71 0.105,3.411 c 0.11,5.371 0.11,10.851 0.11,16.222 l -0.11,11.047 c 0,2.379 0,4.754 -0.55,7.031 -1.207,4.75 -4.278,7.84 -9.868,7.84 -6.254,0 -11.078,-3.293 -14.703,-5.773 -0.105,-17.977 0.117,-27.375 0.77,-39.465 l -0.543,-0.621 c -5.043,-0.106 -6.363,-0.106 -11.735,-0.402 l -0.55,0.71 c 0.222,7.336 0.55,16.637 0.55,36.465 0,8.684 -0.105,17.364 -0.218,26.039 -0.215,9.09 -0.559,12.086 -0.879,16.735 l 0.547,0.621 c 5.261,0.824 7.019,1.137 11.953,2.168 l 0.66,-0.727 c -0.66,-11.054 -0.66,-22.203 -0.66,-33.367 3.504,2.172 10.418,6.414 19.633,6.414 2.519,0 5.043,-0.312 7.343,-1.246 4.942,-1.871 7.895,-5.566 8.993,-9.809 0.554,-2.078 0.554,-3.308 0.769,-10.234 l 0,-12.086 0.117,-4.855 C 900,313.184 900,311.723 900.43,306.043 l -0.649,-0.621" /><path
id="path104"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 971.492,333.008 c -0.215,7.226 -1.637,14.457 -6.683,19.941 -4.825,5.16 -12.172,7.43 -19.633,7.43 -10.961,0 -17.324,-4.227 -20.391,-7.231 -7.351,-6.914 -7.566,-17.043 -7.566,-20.972 0,-3.406 0.105,-13.949 7.566,-21.074 3.5,-3.403 9.758,-6.918 19.633,-6.918 7.672,0 14.137,1.765 18.965,6.304 3.625,3.403 5.93,7.446 7.129,12.492 0.765,3.114 0.98,6.52 0.98,10.028 z m -11.945,-0.41 c 0.105,-2.168 0,-9.098 -2.527,-13.739 -3.172,-5.675 -8.434,-6.933 -12.493,-6.933 -2.199,0 -4.507,0.418 -6.468,1.344 -8.672,4.136 -8.782,14.57 -8.782,18.707 0,4.336 0.332,10.332 3.286,14.55 3.843,5.805 9.98,6.012 12.07,6.012 6.137,0 9.644,-2.695 11.738,-5.894 2.738,-4.551 3.176,-11.465 3.176,-14.047" /><path
id="path106"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1030.18,317.617 c -0.44,-4.433 -0.56,-4.957 -0.89,-9.191 l -0.75,-0.727 c -3.19,-1.457 -7.47,-3.515 -15.15,-3.515 -16.554,0 -27.312,11.254 -27.312,27.371 0,16.433 10.531,28.824 27.532,28.824 7.14,0 12.18,-2.164 15.03,-3.305 l 0.44,-0.722 c -0.44,-3.719 -0.54,-5.071 -0.77,-8.161 l -0.87,-0.41 c -3.63,2.481 -7.79,4.02 -12.18,4.02 -9.11,0 -17.112,-6.602 -17.112,-19.824 0,-14.043 8.452,-19.118 17.002,-19.118 7.45,0 12.07,3.618 14.14,5.168 l 0.89,-0.41" /><path
id="path108"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1092.69,305.422 c -5.27,-0.106 -5.93,-0.106 -10.97,-0.402 l -0.77,0.71 0.11,3.411 c 0.12,5.371 0.12,10.851 0.12,16.222 l -0.12,11.047 c 0,2.379 0,4.754 -0.55,7.031 -1.21,4.75 -4.27,7.84 -9.87,7.84 -6.25,0 -11.08,-3.293 -14.69,-5.773 -0.11,-17.977 0.1,-27.375 0.76,-39.465 l -0.54,-0.621 c -5.05,-0.106 -6.37,-0.106 -11.74,-0.402 l -0.55,0.71 c 0.22,7.336 0.55,16.637 0.55,36.465 0,8.684 -0.1,17.364 -0.22,26.039 -0.22,9.09 -0.55,12.086 -0.88,16.735 l 0.55,0.621 c 5.26,0.824 7.03,1.137 11.96,2.168 l 0.65,-0.727 c -0.65,-11.054 -0.65,-22.203 -0.65,-33.367 3.51,2.172 10.41,6.414 19.63,6.414 2.52,0 5.04,-0.312 7.35,-1.246 4.93,-1.871 7.89,-5.566 8.99,-9.809 0.54,-2.078 0.54,-3.308 0.77,-10.234 l 0,-12.086 0.11,-4.855 c 0.22,-8.664 0.22,-10.125 0.65,-15.805 l -0.65,-0.621" /><path
id="path110"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1136.11,336.727 c 4.39,-1.348 14.37,-4.551 14.37,-15.497 0,-4.132 -1.65,-8.781 -6.13,-12.195 -5.83,-4.652 -13.61,-4.949 -17.56,-4.949 -5.92,0 -10.86,1.031 -15.02,2.574 -0.54,0.203 -1.1,0.418 -1.64,0.617 l -0.56,0.934 c 0.45,4.035 0.45,4.551 0.66,8.668 l 1.1,0.316 c 1.97,-1.445 6.8,-4.949 15.24,-4.949 8.67,0 11.84,4.539 11.84,7.746 0,4.754 -4.7,6.301 -11.4,8.36 l -3.5,1.148 c -4.51,1.344 -14.37,4.332 -14.37,14.973 0,10.632 9.86,15.906 22.15,15.906 8.11,0 13.81,-2.164 15.79,-2.891 l 0.55,-0.726 c -0.44,-3.813 -0.55,-4.223 -0.88,-8.16 l -0.98,-0.411 c -2.74,1.653 -7.02,4.141 -14.15,4.141 -1.54,0 -3.07,-0.113 -4.72,-0.531 -3.29,-0.813 -6.03,-2.992 -6.03,-6.188 0,-4.449 4.49,-5.789 11.3,-7.754 l 3.94,-1.132" /><path
id="path112"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1207.08,317.617 c -0.45,-4.433 -0.56,-4.957 -0.88,-9.191 l -0.78,-0.727 c -3.17,-1.457 -7.45,-3.515 -15.12,-3.515 -16.57,0 -27.32,11.254 -27.32,27.371 0,16.433 10.53,28.824 27.53,28.824 7.13,0 12.17,-2.164 15.02,-3.305 l 0.45,-0.722 c -0.45,-3.719 -0.56,-5.071 -0.77,-8.161 l -0.89,-0.41 c -3.61,2.481 -7.77,4.02 -12.17,4.02 -9.1,0 -17.11,-6.602 -17.11,-19.824 0,-14.043 8.46,-19.118 17.01,-19.118 7.46,0 12.06,3.618 14.15,5.168 l 0.88,-0.41" /><path
id="path114"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1269.58,305.422 c -5.26,-0.106 -5.91,-0.106 -10.96,-0.402 l -0.77,0.71 0.1,3.411 c 0.13,5.371 0.13,10.851 0.13,16.222 l -0.13,11.047 c 0,2.379 0,4.754 -0.54,7.031 -1.2,4.75 -4.27,7.84 -9.86,7.84 -6.26,0 -11.09,-3.293 -14.71,-5.773 -0.11,-17.977 0.11,-27.375 0.77,-39.465 l -0.55,-0.621 c -5.05,-0.106 -6.35,-0.106 -11.74,-0.402 l -0.54,0.71 c 0.22,7.336 0.54,16.637 0.54,36.465 0,8.684 -0.1,17.364 -0.22,26.039 -0.21,9.09 -0.53,12.086 -0.86,16.735 l 0.54,0.621 c 5.26,0.824 7.01,1.137 11.95,2.168 l 0.67,-0.727 c -0.67,-11.054 -0.67,-22.203 -0.67,-33.367 3.52,2.172 10.42,6.414 19.63,6.414 2.53,0 5.05,-0.312 7.36,-1.246 4.92,-1.871 7.9,-5.566 8.98,-9.809 0.56,-2.078 0.56,-3.308 0.77,-10.234 l 0,-12.086 0.11,-4.855 c 0.23,-8.664 0.23,-10.125 0.67,-15.805 l -0.67,-0.621" /><path
id="path116"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1338.34,358.73 c -0.21,-7.851 -0.33,-15.191 -0.33,-23.55 0,-12.711 0.33,-20.356 0.56,-24.797 0,-1.445 0.11,-2.883 0.22,-4.34 l -0.45,-0.621 c -5.26,-0.106 -6.13,-0.199 -11.18,-0.402 l -0.65,0.613 0.11,4.34 c -2.42,-1.653 -8.24,-5.887 -17.22,-5.887 -4.29,0 -8.99,0.934 -12.51,3.504 -7.01,5.375 -7.01,14.156 -7.13,22.207 l 0,6.414 c -0.22,14.777 -0.22,16.422 -0.55,22.004 l 0.55,0.715 c 5.17,0.105 6.14,0.105 11.3,0.511 l 0.66,-0.711 -0.45,-22.625 c 0,-2.781 -0.1,-4.855 0,-9.812 0.11,-4.34 0.35,-13.633 11.42,-13.633 6.47,0 11.06,3.406 13.7,5.367 0.12,5.571 0.12,10.325 0.12,16.317 0,14.367 -0.12,17.258 -0.77,23.965 l 0.65,0.726 c 5.05,0.113 6.25,0.113 11.3,0.406 l 0.65,-0.711" /><path
id="path118"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1370.59,305.422 c -5.26,-0.106 -6.36,-0.199 -11.5,-0.402 l -0.56,0.71 c 0.22,7.336 0.56,16.637 0.56,36.465 0,14.258 0,29.547 -1.1,42.774 l 0.54,0.621 c 5.37,0.824 6.47,1.023 11.95,2.168 l 0.65,-0.727 c -0.76,-13.531 -0.76,-27.168 -0.76,-40.703 0,-22.617 0.33,-30.469 0.88,-40.285 l -0.66,-0.621" /><path
id="path120"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1435.74,318.445 c -1.44,-1.148 -3.86,-3.007 -7.91,-4.554 -3.06,-1.032 -6.35,-1.547 -9.54,-1.547 -3.39,0 -9.64,0.515 -14.13,5.59 -3.74,4.222 -4.06,9.285 -4.17,12.91 17.98,0.094 20.93,0.094 38.04,0 l 0.76,0.617 c 0.13,4.539 0.34,14.773 -5.91,21.805 -3.29,3.695 -9.33,7.113 -17.98,7.113 -14.37,0 -26.64,-9.391 -26.64,-28.602 0,-17.984 11.28,-27.691 29.26,-27.691 9.77,0 15.68,2.992 17.55,3.922 l 0.67,0.711 c 0.2,4.043 0.32,5.074 0.87,9.215 l -0.87,0.511 z m -8.22,20.344 c -10.09,-0.105 -14.26,-0.199 -27.53,-0.105 1.08,10.339 8.33,14.265 14.46,14.265 4.94,0 9.75,-2.379 11.96,-8.062 0.88,-2.375 0.99,-4.653 1.11,-6.098" /><path
id="path122"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1562.29,305.316 c -7.46,0 -8.56,0 -15.79,-0.296 l -0.76,0.71 c -1.77,10.336 -2.43,13.333 -3.96,20.872 l -9,44.531 -9.1,-42.156 c -0.54,-2.793 -1.1,-5.676 -1.75,-8.473 -0.88,-4.438 -2.51,-11.984 -2.97,-14.461 l -0.65,-0.727 c -7.9,0 -8.33,-0.093 -15.9,-0.296 l -0.76,0.71 c -1.98,9.309 -11.08,48.45 -17,71.793 l 0.54,0.727 c 6.15,0 7.14,0.113 12.5,0.313 l 0.66,-0.723 c 0.67,-3.621 1.32,-6.922 2.31,-12.078 0.88,-4.657 1.75,-9.211 2.63,-13.75 l 7.99,-39.465 9.23,45.762 c 1.53,7.55 1.76,8.781 3.73,19.214 l 0.66,0.727 c 8.33,0.113 9.76,0.113 17.42,0.313 l 0.67,-0.723 c 0.11,-0.824 0.21,-1.66 0.32,-2.578 0.45,-2.692 2.98,-15.914 3.62,-19.426 l 8.67,-43.59 8.55,40.801 c 4.06,19.941 4.17,20.359 4.73,24.476 l 0.64,0.727 c 5.05,0 6.15,0.113 10.76,0.313 l 0.55,-0.723 c -2.53,-8.055 -3.17,-10.844 -9.22,-35.945 -2.73,-11.266 -5.69,-22.422 -8.1,-33.684 -0.11,-0.711 -0.35,-1.449 -0.44,-2.168 l -0.78,-0.727" /><path
id="path124"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1635.79,318.445 c -1.42,-1.148 -3.84,-3.007 -7.9,-4.554 -3.07,-1.032 -6.35,-1.547 -9.53,-1.547 -3.39,0 -9.65,0.515 -14.15,5.59 -3.72,4.222 -4.06,9.285 -4.17,12.91 17.98,0.094 20.95,0.094 38.06,0 l 0.76,0.617 c 0.11,4.539 0.34,14.773 -5.92,21.805 -3.28,3.695 -9.32,7.113 -17.97,7.113 -14.37,0 -26.66,-9.391 -26.66,-28.602 0,-17.984 11.3,-27.691 29.28,-27.691 9.76,0 15.68,2.992 17.55,3.922 l 0.65,0.711 c 0.22,4.043 0.34,5.074 0.88,9.215 l -0.88,0.511 z m -8.22,20.344 c -10.08,-0.105 -14.26,-0.199 -27.53,-0.105 1.1,10.339 8.33,14.265 14.48,14.265 4.93,0 9.75,-2.379 11.95,-8.062 0.88,-2.375 0.99,-4.653 1.1,-6.098" /><path
id="path126"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1678.68,336.727 c 4.38,-1.348 14.37,-4.551 14.37,-15.497 0,-4.132 -1.64,-8.781 -6.14,-12.195 -5.82,-4.652 -13.62,-4.949 -17.55,-4.949 -5.91,0 -10.85,1.031 -15.02,2.574 -0.56,0.203 -1.12,0.418 -1.65,0.617 l -0.55,0.934 c 0.43,4.035 0.43,4.551 0.65,8.668 l 1.1,0.316 c 1.98,-1.445 6.79,-4.949 15.25,-4.949 8.67,0 11.83,4.539 11.83,7.746 0,4.754 -4.71,6.301 -11.4,8.36 l -3.5,1.148 c -4.5,1.344 -14.36,4.332 -14.36,14.973 0,10.632 9.86,15.906 22.14,15.906 8.11,0 13.83,-2.164 15.79,-2.891 l 0.56,-0.726 c -0.43,-3.813 -0.56,-4.223 -0.88,-8.16 l -0.98,-0.411 c -2.75,1.653 -7.03,4.141 -14.15,4.141 -1.55,0 -3.07,-0.113 -4.73,-0.531 -3.28,-0.813 -6.01,-2.992 -6.01,-6.188 0,-4.449 4.48,-5.789 11.28,-7.754 l 3.95,-1.132" /><path
id="path128"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1733.52,313.477 c -0.35,-3.411 -0.35,-4.122 -0.43,-7.125 l -0.56,-0.622 c -2.32,-0.507 -4.17,-0.925 -8.22,-0.925 -2.64,0 -9.54,0 -12.96,5.371 -1.97,3.008 -1.97,5.48 -1.97,17.664 l 0.23,22.73 c -3.86,0 -3.95,-0.101 -7.91,-0.215 l -0.43,0.633 c 0.22,3.297 0.22,4.117 0.22,7.434 l 0.66,0.613 c 2.41,0 3.84,-0.105 7.46,0 -0.13,2.168 -0.13,4.449 -0.13,6.613 -0.1,1.969 -0.21,3.938 -0.32,5.895 l 0.56,0.715 c 4.94,1.148 6.15,1.441 11.19,2.898 l 0.76,-0.519 c -0.32,-6.821 -0.45,-8.168 -0.45,-15.707 4.62,0.105 5.93,0.105 12.19,0.312 l 0.54,-0.613 c -0.22,-2.688 -0.33,-3.816 -0.33,-7.348 l -0.53,-0.609 c -5.5,0.098 -6.16,0.207 -11.98,0.207 l -0.2,-19.219 c 0.1,-1.23 0.1,-7.129 0.1,-8.57 0,-7.539 0.99,-9.906 6.47,-9.906 2.31,0 4.05,0.507 5.26,0.925 l 0.78,-0.632" /><path
id="path130"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1770.8,336.727 c 4.4,-1.348 14.37,-4.551 14.37,-15.497 0,-4.132 -1.64,-8.781 -6.15,-12.195 -5.81,-4.652 -13.59,-4.949 -17.55,-4.949 -5.92,0 -10.84,1.031 -15.01,2.574 -0.56,0.203 -1.12,0.418 -1.66,0.617 l -0.54,0.934 c 0.44,4.035 0.44,4.551 0.65,8.668 l 1.1,0.316 c 1.97,-1.445 6.81,-4.949 15.25,-4.949 8.67,0 11.85,4.539 11.85,7.746 0,4.754 -4.73,6.301 -11.42,8.36 l -3.5,1.148 c -4.5,1.344 -14.38,4.332 -14.38,14.973 0,10.632 9.88,15.906 22.16,15.906 8.12,0 13.82,-2.164 15.81,-2.891 l 0.53,-0.726 c -0.44,-3.813 -0.53,-4.223 -0.87,-8.16 l -1,-0.411 c -2.73,1.653 -7.01,4.141 -14.13,4.141 -1.55,0 -3.09,-0.113 -4.73,-0.531 -3.28,-0.813 -6.03,-2.992 -6.03,-6.188 0,-4.449 4.5,-5.789 11.3,-7.754 l 3.95,-1.132" /><path
id="path132"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1841.76,317.617 c -0.45,-4.433 -0.56,-4.957 -0.89,-9.191 l -0.75,-0.727 c -3.18,-1.457 -7.47,-3.515 -15.15,-3.515 -16.55,0 -27.31,11.254 -27.31,27.371 0,16.433 10.54,28.824 27.55,28.824 7.11,0 12.16,-2.164 15.01,-3.305 l 0.43,-0.722 c -0.43,-3.719 -0.53,-5.071 -0.76,-8.161 l -0.88,-0.41 c -3.62,2.481 -7.78,4.02 -12.16,4.02 -9.11,0 -17.11,-6.602 -17.11,-19.824 0,-14.043 8.43,-19.118 17,-19.118 7.44,0 12.06,3.618 14.13,5.168 l 0.89,-0.41" /><path
id="path134"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1904.26,305.422 c -5.25,-0.106 -5.92,-0.106 -10.97,-0.402 l -0.77,0.71 0.13,3.411 c 0.1,5.371 0.1,10.851 0.1,16.222 l -0.1,11.047 c 0,2.379 0,4.754 -0.56,7.031 -1.19,4.75 -4.28,7.84 -9.86,7.84 -6.26,0 -11.09,-3.293 -14.7,-5.773 -0.11,-17.977 0.1,-27.375 0.76,-39.465 l -0.54,-0.621 c -5.04,-0.106 -6.36,-0.106 -11.73,-0.402 l -0.56,0.71 c 0.23,7.336 0.56,16.637 0.56,36.465 0,8.684 -0.13,17.364 -0.22,26.039 -0.22,9.09 -0.56,12.086 -0.89,16.735 l 0.55,0.621 c 5.26,0.824 7.03,1.137 11.96,2.168 l 0.66,-0.727 c -0.66,-11.054 -0.66,-22.203 -0.66,-33.367 3.52,2.172 10.42,6.414 19.62,6.414 2.54,0 5.05,-0.312 7.37,-1.246 4.93,-1.871 7.88,-5.566 8.98,-9.809 0.56,-2.078 0.56,-3.308 0.76,-10.234 l 0,-12.086 0.11,-4.855 c 0.23,-8.664 0.23,-10.125 0.66,-15.805 l -0.66,-0.621" /><path
id="path136"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1987.29,305.422 c -7.36,-0.106 -8.22,-0.106 -14.91,-0.402 l -0.77,0.71 c -1.32,6.305 -3.41,14.68 -5.27,22.004 l -6.36,24.805 -6.47,-25.426 c -3.29,-12.496 -4.38,-16.527 -5.38,-21.07 l -0.65,-0.621 c -7.68,-0.106 -8.23,-0.106 -15.14,-0.402 l -0.65,0.71 c -4.82,18.497 -13.05,45.551 -15.35,52.379 l 0.43,0.723 c 5.26,0.316 6.69,0.316 11.95,0.824 l 0.66,-0.621 c 0.66,-3.41 1.43,-6.605 6.16,-25.711 l 5.26,-21.289 7.12,27.789 c 3.3,13.735 3.5,15.082 4.16,18.391 l 0.76,0.715 c 6.49,0 8.35,0 15.59,0.312 l 0.65,-0.715 c 1.54,-7.129 4.17,-17.043 6.14,-24.91 l 5.82,-21.894 6.14,24.078 c 0.87,3.613 1.76,7.23 2.63,10.844 1.86,7.019 2.07,7.839 2.75,11.777 l 0.77,0.613 c 1.75,0 3.6,-0.105 5.37,-0.105 1.64,0 3.28,0.105 4.92,0.105 l 0.67,-0.613 c -2.09,-5.883 -11.73,-34.711 -16.24,-52.379 l -0.76,-0.621" /><path
id="path138"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2060.99,318.445 c -1.43,-1.148 -3.84,-3.007 -7.89,-4.554 -3.07,-1.032 -6.37,-1.547 -9.55,-1.547 -3.4,0 -9.64,0.515 -14.17,5.59 -3.71,4.222 -4.05,9.285 -4.15,12.91 17.98,0.094 20.94,0.094 38.06,0 l 0.76,0.617 c 0.11,4.539 0.34,14.773 -5.92,21.805 -3.29,3.695 -9.33,7.113 -17.98,7.113 -14.36,0 -26.64,-9.391 -26.64,-28.602 0,-17.984 11.29,-27.691 29.27,-27.691 9.77,0 15.69,2.992 17.56,3.922 l 0.65,0.711 c 0.21,4.043 0.32,5.074 0.88,9.215 l -0.88,0.511 z m -8.23,20.344 c -10.08,-0.105 -14.25,-0.199 -27.53,-0.105 1.11,10.339 8.33,14.265 14.49,14.265 4.92,0 9.75,-2.379 11.95,-8.062 0.88,-2.375 0.99,-4.653 1.09,-6.098" /><path
id="path140"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2092.9,374.121 c -5.6,-0.199 -6.8,-0.305 -12.17,-0.832 l -0.65,0.633 c 0.09,1.34 0.09,2.781 0.09,4.125 0,1.863 -0.09,3.519 -0.22,5.582 l 0.78,0.617 c 5.7,0.414 6.68,0.508 12.17,1.027 l 0.66,-0.613 c -0.1,-4.242 -0.1,-5.277 0,-9.812 l -0.66,-0.727 z m -0.1,-68.699 c -5.71,-0.106 -6.59,-0.106 -11.96,-0.402 l -0.55,0.71 c 0.33,5.485 0.66,10.235 0.66,21.696 0,19.734 -0.33,23.453 -1.11,29.535 l 0.56,0.738 c 4.73,0.723 6.35,0.93 11.85,2.067 l 1.08,-0.618 c -0.32,-5.375 -0.65,-10.957 -0.65,-24.277 0,-19.215 0.22,-21.805 0.65,-28.828 l -0.53,-0.621" /><path
id="path142"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2149.7,305.316 c -3.06,0 -18.08,-0.093 -21.47,-0.093 -12.85,0 -14.27,0 -20.96,-0.203 l -0.44,0.929 c 8.33,13.004 21.6,35.114 27.18,45.039 -14.45,-0.109 -17.09,-0.109 -24.12,-0.418 l -0.53,0.621 c 0.43,3.403 0.53,4.231 0.76,7.118 l 0.66,0.621 c 18.42,0 20.51,0 39.59,0.312 l 0.56,-0.82 c -9.78,-15.082 -23.69,-39.68 -26.66,-44.945 9.44,0.117 18.86,0.316 26.32,0.632 l 0.55,-0.632 c -0.45,-3.196 -0.55,-4.539 -0.77,-7.641 l -0.67,-0.52" /><path
id="path144"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1828.36,930.41 c 19.04,-5.824 62.36,-19.726 62.36,-67.265 0,-17.942 -7.14,-38.114 -26.66,-52.922 -25.23,-20.18 -59.03,-21.524 -76.17,-21.524 -25.7,0 -47.13,4.485 -65.21,11.211 -2.39,0.891 -4.77,1.789 -7.15,2.688 l -2.38,4.043 c 1.91,17.492 1.91,19.742 2.86,37.668 l 4.76,1.343 c 8.57,-6.273 29.51,-21.519 66.17,-21.519 37.61,0 51.42,19.726 51.42,33.629 0,20.625 -20.46,27.347 -49.51,36.328 l -15.24,4.933 c -19.52,5.829 -62.36,18.829 -62.36,65.008 0,46.199 42.84,69.079 96.16,69.079 35.25,0 59.98,-9.43 68.56,-12.56 l 2.39,-3.15 c -1.9,-16.58 -2.39,-18.373 -3.83,-35.42 l -4.28,-1.792 c -11.9,7.179 -30.46,17.941 -61.41,17.941 -6.66,0 -13.33,-0.449 -20.47,-2.246 -14.28,-3.586 -26.18,-13.004 -26.18,-26.899 0,-19.293 19.51,-25.125 49.05,-33.64 l 17.12,-4.934" /><path
id="path146"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2166.38,914.277 c -0.96,31.379 -7.14,62.778 -29.05,86.543 -20.94,22.42 -52.84,32.29 -85.21,32.29 -47.62,0 -75.22,-18.4 -88.57,-31.4 -31.87,-30.042 -32.84,-73.991 -32.84,-91.026 0,-14.801 0.49,-60.539 32.84,-91.481 15.24,-14.808 42.38,-30.058 85.22,-30.058 33.34,0 61.43,7.632 82.37,27.371 15.72,14.785 25.7,32.281 30.93,54.254 3.35,13.445 4.31,28.253 4.31,43.507 z m -51.9,-1.797 c 0.48,-9.414 0,-39.472 -10.96,-59.648 -13.79,-24.664 -36.64,-30.047 -54.25,-30.047 -9.54,0 -19.54,1.801 -28.11,5.832 -37.61,17.934 -38.08,63.238 -38.08,81.168 0,18.832 1.44,44.836 14.29,63.231 16.66,25.113 43.32,26.011 52.37,26.011 26.66,0 41.89,-11.66 50.93,-25.562 11.91,-19.742 13.81,-49.781 13.81,-60.985" /><path
id="path148"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1656.94,910.578 c 0,-15.644 -12.68,-28.34 -28.34,-28.34 -15.65,0 -28.33,12.696 -28.33,28.34 0,15.645 12.68,28.348 28.33,28.348 15.66,0 28.34,-12.703 28.34,-28.348" /><path
id="path150"
style="fill:#0979b8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1004.69,1107.68 c -0.47,-34.54 -0.95,-55.61 -0.95,-87 0,-75.34 1.43,-150.231 5.24,-225.571 l -2.38,-2.683 c -40.467,0.449 -49.983,0 -85.702,-1.348 l -2.375,2.695 c 2.375,63.219 2.375,78.024 1.434,138.555 -19.043,0.449 -38.086,0.899 -57.137,0.899 -18.558,0 -36.179,-0.45 -57.117,-1.348 0.469,-65.016 0.938,-81.168 3.801,-136.77 l -2.379,-2.683 c -41.887,0.449 -50.465,0 -85.215,-1.348 l -2.383,2.695 c 0.953,37.653 1.911,59.625 1.911,99.997 0,111.2 -2.864,166.37 -5.243,212.57 l 2.86,2.68 c 41.414,0 48.55,0 85.215,1.34 l 2.371,-2.68 -0.938,-118.395 c 16.66,0 33.789,-0.449 50.449,-0.449 21.438,0 42.371,0.449 63.321,0.898 -0.465,52.926 -0.465,65.916 -3.809,116.606 l 2.387,2.68 c 39.992,0 46.168,0 84.259,1.34 l 2.38,-2.68" /><path
id="path152"
style="fill:#0979b8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1280.73,858.781 c -18.1,-8.965 -39.53,-19.281 -74.27,-19.281 -28.56,0 -48.09,8.527 -59.52,24.672 -7.14,9.418 -8.56,18.387 -10.46,27.359 l 153.77,2.688 2.85,3.133 c -0.46,21.968 -0.95,44.406 -7.6,66.82 -16.68,52.918 -53.34,63.688 -69.52,67.278 -11.9,3.12 -22.85,4.02 -33.8,4.02 -74.75,0 -124.26,-46.185 -124.26,-123.767 0,-21.07 3.82,-43.043 11.43,-58.746 27.62,-60.531 92.36,-65.918 126.64,-65.918 39.51,0 56.66,6.734 81.88,16.149 l 2.86,3.582 3.33,50.664 -3.33,1.347 z m -144.25,80.282 c 1.42,13.902 4.75,32.73 22.85,43.488 5.71,3.59 12.39,4.937 19.04,4.937 15.72,0 25.22,-7.621 30.47,-15.695 6.66,-9.867 7.14,-20.621 7.14,-30.934 l -79.5,-1.796" /><path
id="path154"
style="fill:#0979b8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1481.62,939.063 c 26.19,-9.43 62.85,-22.43 62.85,-71.75 0,-3.141 0,-6.274 -0.5,-9.879 -8.55,-64.11 -79.96,-70.395 -116.14,-70.395 -34.74,0 -54.75,7.176 -78.08,15.25 l -2.37,4.031 c 1.91,22.418 2.37,27.352 3.33,50.672 l 4.28,1.789 c 7.13,-5.383 10.96,-8.519 19.05,-12.551 17.61,-8.515 37.13,-12.558 50.46,-12.558 26.65,0 37.61,12.109 37.61,23.32 0,16.145 -20.97,22.879 -33.8,26.903 l -18.1,6.289 c -22.37,8.066 -61.88,22.418 -61.88,70.402 0,17.937 6.66,31.387 12.85,39.464 24.75,33.63 71.42,35.42 94.73,35.42 30.96,0 50.48,-5.37 72.83,-11.21 l 2.39,-2.69 -4.75,-48.882 -4.3,-1.348 c -11.88,7.183 -30.46,18.836 -59.49,18.836 -29.53,0 -33.34,-14.793 -33.34,-20.172 0,-12.559 12.85,-17.484 29.05,-22.867 l 23.32,-8.074" /><path
id="path156"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1755.3,153.285 c -11.04,-1.547 -21.32,-2.988 -21.32,-12.164 0,-0.512 0,-9.375 10.39,-9.375 6.78,0 10.72,3.5 11.92,4.535 l 0,17.215 -0.99,-0.211 z m 12.25,-7.523 c 0,-12.774 0.11,-13.914 0.66,-20.614 l -0.55,-0.515 c -5.15,-0.102 -6.01,-0.199 -11.05,-0.41 l -0.43,0.621 0.11,3.703 c -2.07,-1.535 -6.99,-5.25 -15.31,-5.25 -10.93,0 -18.6,7.008 -18.6,17.207 0,13.812 12.25,18.246 31.95,20.402 l 1.85,0.211 c 0,2.778 0,4.742 -0.98,6.387 -1.09,1.859 -3.62,3.816 -9.08,3.816 -7.11,0 -12.03,-2.058 -16.62,-3.918 l -0.88,0.52 c 0.22,4.738 0.22,5.359 0.33,7.516 l 0.67,0.621 c 6.11,2.058 12.46,3.406 18.9,3.406 8.09,0 15.97,-2.578 18.27,-10.625 0.76,-2.875 0.76,-8.547 0.76,-12.879 l 0,-10.199" /><path
id="path158"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1834.4,124.633 c -5.23,-0.102 -5.88,-0.102 -10.93,-0.41 l -0.77,0.722 c 0,1.137 0.12,2.266 0.12,3.403 0.12,5.05 0.12,10.097 0.12,15.152 0,15.867 -0.12,16.898 -0.67,19.059 -2.08,7.832 -8.31,7.832 -9.82,7.832 -6.57,0 -11.62,-3.606 -14.56,-5.77 -0.13,-17.933 0.1,-27.308 0.87,-39.367 l -0.65,-0.621 c -5.36,-0.102 -6.23,-0.102 -11.49,-0.41 l -0.56,0.722 c 0.13,5.77 0.35,11.336 0.35,18.965 0,16.488 -0.78,25.242 -1.3,32.149 l 0.64,0.718 c 5.45,0.934 6.45,1.141 11.58,2.071 l 0.78,-0.731 -0.12,-5.355 c 2.84,1.855 9.63,6.39 19.26,6.39 2.72,0 6.13,-0.414 9.07,-1.957 2.85,-1.547 5.14,-3.914 6.35,-6.703 1.42,-3.09 1.51,-6.176 1.64,-12.574 l 0,-12.051 c 0.31,-12.058 0.43,-16.699 0.74,-20.613 l -0.65,-0.621" /><path
id="path160"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1888.37,170.703 c -1.86,0.098 -3.16,0.305 -5.46,0.305 -3.39,0 -10.61,-0.207 -15.86,-4.844 -2.39,-2.16 -6.33,-7.004 -6.33,-16.18 0,-5.875 1.75,-10.093 4.05,-12.671 1.96,-2.168 5.56,-4.637 11.25,-4.637 6.67,0 10.71,3.301 12.24,4.531 0.22,13.5 0.22,16.594 0.11,33.496 z m -0.11,33.906 c 5.6,0.926 6.68,1.133 11.6,2.157 l 0.76,-0.61 c -0.76,-14.332 -0.86,-39.883 -0.86,-50.195 0,-15.969 0.43,-23.594 0.86,-30.707 l -0.54,-0.723 c -4.82,0 -6.12,-0.097 -11.15,-0.308 l -0.78,0.621 0.22,3.808 c -2.62,-1.851 -7.1,-5.148 -15.08,-5.148 -14.55,0 -24.6,10.82 -24.6,26.48 0,11.235 5.03,18.352 9.62,22.157 7.99,6.804 18.37,7.117 24.05,7.117 2.3,0 3.39,0 6.35,-0.211 0.11,12.777 -0.45,18.965 -0.99,24.941 l 0.54,0.621" /><path
id="path162"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1966.56,155.031 c 3.5,0 6.99,-0.101 10.5,-0.101 3.71,0 7.65,0.101 11.48,0.101 l -10.49,34.836 -11.49,-34.836 z m 21.64,40.094 c 3.63,-11.332 7.78,-24.117 11.06,-33.906 3.38,-9.891 8.86,-25.762 12.14,-35.66 l -0.43,-0.821 c -5.71,-0.105 -8.12,-0.207 -12.7,-0.414 l -0.78,0.727 c -2.72,9.683 -3.59,12.461 -6.44,21.746 -4.36,0 -8.64,0.101 -13,0.101 -4.84,0 -9.85,-0.101 -14.21,-0.101 -3.2,-9.695 -3.85,-12.16 -6.48,-21.332 l -0.74,-0.727 c -4.71,0 -5.82,0 -11.27,-0.304 l -0.44,0.714 c 0.31,1.133 0.74,2.165 1.21,3.2 4.15,11.125 8.18,22.257 12.14,33.39 6.53,18.235 8.95,24.934 12.11,34.828 l 0.9,0.727 c 7.65,0.098 8.63,0.098 15.63,0.41 l 0.75,-0.723 0.55,-1.855" /><path
id="path164"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2049.05,167.402 c -1.11,0.414 -2.54,0.934 -4.39,0.934 -2.08,0 -3.6,-0.727 -4.59,-1.344 -4.49,-2.988 -4.49,-7.519 -4.49,-18.242 0,-11.648 0.34,-17.723 0.78,-23.496 l -0.56,-0.723 c -5.15,0 -6.32,-0.097 -11.58,-0.308 l -0.56,0.621 c 0.12,7.832 0.25,14.941 0.25,24.519 0,16.496 -0.35,20.719 -0.99,26.696 l 0.64,0.718 c 4.15,0.731 6.79,1.239 11.37,2.071 l 0.65,-0.621 -0.52,-8.766 c 1.3,3.301 4.02,9.894 13.34,9.894 1.39,0 2.17,-0.097 3.04,-0.308 l 0.45,-0.621 c -1.11,-4.946 -1.32,-5.977 -2.1,-10.504 l -0.74,-0.52" /><path
id="path166"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2093.83,132.676 c -0.34,-3.406 -0.34,-4.129 -0.47,-7.117 l -0.53,-0.614 c -2.28,-0.511 -4.15,-0.933 -8.2,-0.933 -2.63,0 -9.5,0 -12.91,5.367 -1.95,2.988 -1.95,5.461 -1.95,17.617 l 0.21,22.676 c -3.84,0 -3.93,-0.102 -7.86,-0.211 l -0.47,0.621 c 0.22,3.297 0.22,4.125 0.22,7.426 l 0.68,0.609 c 2.38,0 3.81,-0.101 7.43,0 -0.12,2.168 -0.12,4.434 -0.12,6.598 -0.09,1.957 -0.22,3.918 -0.31,5.875 l 0.53,0.719 c 4.92,1.136 6.13,1.449 11.14,2.89 l 0.78,-0.515 c -0.31,-6.801 -0.44,-8.145 -0.44,-15.668 4.58,0.101 5.92,0.101 12.14,0.312 l 0.56,-0.617 c -0.22,-2.684 -0.34,-3.813 -0.34,-7.32 l -0.56,-0.618 c -5.45,0.11 -6.09,0.207 -11.89,0.207 l -0.25,-19.167 c 0.13,-1.239 0.13,-7.114 0.13,-8.555 0,-7.524 0.98,-9.891 6.43,-9.891 2.33,0 4.07,0.512 5.28,0.93 l 0.77,-0.621" /><path
id="path168"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2132.6,155.863 c 4.36,-1.343 14.3,-4.535 14.3,-15.461 0,-4.121 -1.64,-8.754 -6.13,-12.16 -5.79,-4.64 -13.56,-4.945 -17.5,-4.945 -5.88,0 -10.8,1.027 -14.95,2.574 -0.56,0.211 -1.11,0.41 -1.64,0.621 l -0.56,0.93 c 0.43,4.016 0.43,4.523 0.65,8.652 l 1.08,0.313 c 1.98,-1.442 6.79,-4.949 15.21,-4.949 8.64,0 11.82,4.539 11.82,7.726 0,4.746 -4.7,6.285 -11.39,8.356 l -3.5,1.125 c -4.45,1.339 -14.31,4.328 -14.31,14.945 0,10.617 9.86,15.875 22.08,15.875 8.09,0 13.78,-2.168 15.77,-2.891 l 0.52,-0.715 c -0.44,-3.82 -0.52,-4.23 -0.87,-8.144 l -0.98,-0.41 c -2.73,1.648 -7,4.117 -14.09,4.117 -1.56,0 -3.07,-0.102 -4.71,-0.512 -3.28,-0.828 -6.01,-2.988 -6.01,-6.183 0,-4.434 4.46,-5.778 11.24,-7.735 l 3.97,-1.129" /><path
id="path170"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 139.504,196.875 c -0.227,-9.375 -0.332,-11.852 -0.332,-19.988 0,-4.438 0,-7.735 0.105,-15.457 l 0.118,-9.278 c 0,-6.187 0,-15.05 -6.348,-21.543 -5.25,-5.355 -13.66,-7.621 -22.52,-7.621 -14.1012,0 -21.1051,5.36 -23.9489,8.348 -5.8984,6.387 -5.8984,12.574 -5.8984,24.625 l 0,10.512 c 0,14.941 0,16.699 -0.332,30.093 l 0.7656,0.727 c 6.0117,0.098 6.7773,0.098 12.2461,0.309 l 0.5469,-0.727 c -0.4375,-10.715 -0.4375,-29.371 -0.4375,-39.367 0,-10.301 0.2109,-16.586 4.0468,-20.817 1.8594,-2.168 6.1214,-5.043 13.6604,-5.043 2.738,0 11.375,0.2 15.535,7.825 2.406,4.328 2.406,10.203 2.406,18.246 0,11.953 -0.113,27.105 -0.875,38.847 l 0.535,0.727 c 5.036,0.098 5.696,0.098 10.071,0.309 l 0.656,-0.727" /><path
id="path172"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 208.832,124.633 c -5.246,-0.102 -5.902,-0.102 -10.926,-0.41 l -0.765,0.722 c 0,1.137 0.105,2.266 0.105,3.403 0.109,5.05 0.109,10.097 0.109,15.152 0,15.867 -0.109,16.898 -0.66,19.059 -2.078,7.832 -8.304,7.832 -9.84,7.832 -6.562,0 -11.585,-3.606 -14.546,-5.77 -0.106,-17.933 0.117,-27.308 0.875,-39.367 l -0.649,-0.621 c -5.355,-0.102 -6.242,-0.102 -11.488,-0.41 l -0.539,0.722 c 0.105,5.77 0.32,11.336 0.32,18.965 0,16.488 -0.765,25.242 -1.308,32.149 l 0.66,0.718 c 5.465,0.934 6.453,1.141 11.59,2.071 l 0.765,-0.731 -0.109,-5.355 c 2.844,1.855 9.613,6.39 19.246,6.39 2.73,0 6.117,-0.414 9.07,-1.957 2.844,-1.547 5.141,-3.914 6.344,-6.703 1.426,-3.09 1.531,-6.176 1.641,-12.574 l 0,-12.051 c 0.328,-12.058 0.437,-16.699 0.765,-20.613 l -0.66,-0.621" /><path
id="path174"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 241.355,193.168 c -5.585,-0.199 -6.781,-0.313 -12.136,-0.82 l -0.66,0.621 c 0.109,1.336 0.109,2.777 0.109,4.117 0,1.859 -0.109,3.504 -0.215,5.562 l 0.766,0.622 c 5.679,0.41 6.664,0.507 12.136,1.031 l 0.653,-0.621 c -0.11,-4.227 -0.11,-5.258 0,-9.793 l -0.653,-0.719 z m -0.109,-68.535 c -5.687,-0.102 -6.562,-0.102 -11.922,-0.41 l -0.551,0.722 c 0.332,5.465 0.661,10.2 0.661,21.641 0,19.687 -0.329,23.394 -1.094,29.473 l 0.547,0.718 c 4.703,0.731 6.347,0.934 11.812,2.071 l 1.086,-0.621 c -0.32,-5.356 -0.652,-10.922 -0.652,-24.223 0,-19.164 0.222,-21.746 0.652,-28.75 l -0.539,-0.621" /><path
id="path176"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 285.648,124.633 c -6.121,-0.102 -7.644,-0.102 -13.992,-0.41 l -0.648,0.722 c -5.367,17.516 -11.051,34.938 -17.496,52.145 l 0.429,0.828 c 5.36,0.309 6.567,0.41 11.922,0.93 l 0.875,-0.52 c 4.043,-15.254 8.528,-30.504 13.012,-45.652 1.094,3.711 6.559,21.64 7.762,25.652 3.605,11.856 4.597,16.078 5.472,19.59 l 0.766,0.508 c 5.133,-0.199 6.008,-0.098 10.273,0 l 0.547,-0.715 c -6.675,-17.313 -12.574,-34.832 -18.261,-52.457 l -0.661,-0.621" /><path
id="path178"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 351.992,164.004 c -2.187,5.668 -6.996,8.035 -11.918,8.035 -6.125,0 -13.34,-3.914 -14.429,-14.219 13.226,-0.101 17.382,0 27.441,0.098 -0.106,1.449 -0.219,3.711 -1.094,6.086 z m 10.176,-26.902 c -0.551,-4.114 -0.66,-5.157 -0.879,-9.172 l -0.652,-0.719 c -1.864,-0.93 -7.77,-3.914 -17.496,-3.914 -17.942,0 -29.196,9.691 -29.196,27.621 0,19.164 12.246,28.547 26.567,28.547 8.636,0 14.656,-3.406 17.929,-7.113 6.243,-7.008 6.016,-17.211 5.911,-21.747 l -0.766,-0.621 c -17.059,0.114 -20.016,0.114 -37.941,0 0.109,-3.601 0.429,-8.652 4.156,-12.882 4.48,-5.043 10.711,-5.567 14.105,-5.567 3.164,0 6.446,0.524 9.512,1.551 4.043,1.551 6.449,3.398 7.871,4.539 l 0.879,-0.523" /><path
id="path180"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 406.605,167.402 c -1.085,0.414 -2.511,0.934 -4.371,0.934 -2.082,0 -3.605,-0.727 -4.593,-1.344 -4.489,-2.988 -4.489,-7.519 -4.489,-18.242 0,-11.648 0.332,-17.723 0.77,-23.496 l -0.543,-0.723 c -5.141,0 -6.344,-0.097 -11.594,-0.308 l -0.547,0.621 c 0.11,7.832 0.215,14.941 0.215,24.519 0,16.496 -0.32,20.719 -0.98,26.696 l 0.66,0.718 c 4.156,0.731 6.773,1.239 11.371,2.071 l 0.648,-0.621 -0.539,-8.766 c 1.309,3.301 4.035,9.894 13.34,9.894 1.418,0 2.188,-0.097 3.063,-0.308 l 0.433,-0.621 c -1.09,-4.946 -1.308,-5.977 -2.078,-10.504 l -0.766,-0.52" /><path
id="path182"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 445.668,155.863 C 450.043,154.52 460,151.328 460,140.402 c 0,-4.121 -1.641,-8.754 -6.133,-12.16 -5.793,-4.64 -13.554,-4.945 -17.496,-4.945 -5.898,0 -10.82,1.027 -14.976,2.574 -0.543,0.211 -1.09,0.41 -1.633,0.621 l -0.551,0.93 c 0.434,4.016 0.434,4.523 0.656,8.652 l 1.094,0.313 c 1.965,-1.442 6.781,-4.949 15.195,-4.949 8.641,0 11.813,4.539 11.813,7.726 0,4.746 -4.707,6.285 -11.371,8.356 l -3.496,1.125 c -4.485,1.339 -14.332,4.328 -14.332,14.945 0,10.617 9.847,15.875 22.093,15.875 8.09,0 13.77,-2.168 15.746,-2.891 l 0.539,-0.715 c -0.429,-3.82 -0.539,-4.23 -0.875,-8.144 l -0.98,-0.41 c -2.734,1.648 -6.996,4.117 -14.105,4.117 -1.532,0 -3.063,-0.102 -4.7,-0.512 -3.281,-0.828 -6.015,-2.988 -6.015,-6.183 0,-4.434 4.484,-5.778 11.265,-7.735 l 3.93,-1.129" /><path
id="path184"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 487.559,193.168 c -5.582,-0.199 -6.782,-0.313 -12.137,-0.82 l -0.66,0.621 c 0.109,1.336 0.109,2.777 0.109,4.117 0,1.859 -0.109,3.504 -0.219,5.562 l 0.77,0.622 c 5.683,0.41 6.664,0.507 12.137,1.031 l 0.648,-0.621 c -0.105,-4.227 -0.105,-5.258 0,-9.793 l -0.648,-0.719 z m -0.11,-68.535 c -5.687,-0.102 -6.566,-0.102 -11.922,-0.41 l -0.547,0.722 c 0.333,5.465 0.657,10.2 0.657,21.641 0,19.687 -0.324,23.394 -1.09,29.473 l 0.543,0.718 c 4.707,0.731 6.348,0.934 11.808,2.071 l 1.094,-0.621 c -0.324,-5.356 -0.656,-10.922 -0.656,-24.223 0,-19.164 0.223,-21.746 0.656,-28.75 l -0.543,-0.621" /><path
id="path186"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 532.832,132.676 c -0.328,-3.406 -0.328,-4.129 -0.434,-7.117 l -0.55,-0.614 c -2.293,-0.511 -4.157,-0.933 -8.2,-0.933 -2.625,0 -9.511,0 -12.906,5.367 -1.965,2.988 -1.965,5.461 -1.965,17.617 l 0.215,22.676 c -3.82,0 -3.929,-0.102 -7.871,-0.211 l -0.433,0.621 c 0.214,3.297 0.214,4.125 0.214,7.426 l 0.661,0.609 c 2.402,0 3.824,-0.101 7.429,0 -0.105,2.168 -0.105,4.434 -0.105,6.598 -0.11,1.957 -0.219,3.918 -0.328,5.875 l 0.543,0.719 c 4.925,1.136 6.125,1.449 11.156,2.89 l 0.765,-0.515 c -0.332,-6.801 -0.441,-8.145 -0.441,-15.668 4.598,0.101 5.906,0.101 12.137,0.312 l 0.551,-0.617 c -0.211,-2.684 -0.332,-3.813 -0.332,-7.32 l -0.54,-0.618 c -5.468,0.11 -6.125,0.207 -11.925,0.207 l -0.215,-19.167 c 0.109,-1.239 0.109,-7.114 0.109,-8.555 0,-7.524 0.981,-9.891 6.453,-9.891 2.289,0 4.043,0.512 5.25,0.93 l 0.762,-0.621" /><path
id="path188"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 589.988,177.508 c -6.226,-14.531 -16.726,-41.742 -19.461,-48.961 -3.386,-9.375 -6.672,-18.758 -8.961,-28.336 l -0.992,-0.8204 c -5.469,-0.1093 -6.449,-0.1093 -11.59,-0.3125 l -0.429,0.7227 0.429,0.7192 c 1.977,3.808 3.61,7.832 5.473,11.851 1.527,3.399 3.387,6.695 4.59,10.305 0.113,0.207 0.223,0.515 0.328,0.828 0,1.234 -16.293,42.769 -20.996,53.273 l 0.445,0.934 c 5.461,0.406 6.551,0.406 12.137,1.027 l 0.648,-0.621 c 2.957,-9.277 4.375,-13.601 6.786,-20.297 l 6.886,-19.687 6.235,18.14 c 2.297,7.114 5.027,15.555 6.781,21.438 l 0.766,0.617 c 2.73,0 5.679,0 10.605,0.098 l 0.32,-0.918" /><path
id="path190"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 675.414,165.758 c -2.074,3.195 -5.57,5.871 -11.691,5.871 -2.086,0 -8.211,-0.207 -12.035,-5.977 -2.95,-4.222 -3.282,-10.199 -3.282,-14.531 0,-4.125 0.11,-14.527 8.746,-18.652 1.981,-0.934 4.27,-1.34 6.457,-1.34 4.043,0 9.289,1.238 12.465,6.906 2.516,4.637 2.621,11.539 2.516,13.703 0,2.578 -0.442,9.481 -3.176,14.02 z m 14.106,-23.606 c -1.2,-5.05 -3.5,-9.066 -7.11,-12.464 -4.805,-4.54 -11.258,-6.286 -18.914,-6.286 -9.84,0 -16.074,3.5 -19.57,6.903 -7.434,7.109 -7.539,17.625 -7.539,21.023 0,3.914 0.215,14.016 7.539,20.922 3.066,2.988 9.402,7.215 20.336,7.215 7.437,0 14.761,-2.27 19.578,-7.426 5.031,-5.457 6.449,-12.672 6.664,-19.887 0,-3.507 -0.215,-6.906 -0.984,-10" /><path
id="path192"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 721.063,124.531 c -5.028,0 -6.012,0 -11.809,-0.308 l -0.555,0.722 c 0.555,10.821 0.555,21.953 0.555,32.875 0,5.465 0,7.317 -0.109,11.852 -2.735,-0.102 -5.461,-0.102 -7.657,-0.102 l -0.648,0.614 c 0.215,2.886 0.32,3.918 0.43,7.421 l 0.66,0.622 c 3.273,-0.11 5.468,-0.211 6.996,-0.211 l -0.11,6.808 c 0,5.145 0,6.387 0.329,8.242 2.515,11.954 16.07,11.954 19.136,11.954 1.641,0 2.735,-0.098 4.157,-0.211 l 0.542,-0.719 c -0.429,-2.891 -0.542,-4.227 -0.769,-7.418 l -0.766,-0.516 c -0.98,0.211 -1.75,0.41 -2.949,0.41 -2.297,0 -4.805,-0.41 -6.555,-3.089 -1.75,-2.579 -1.75,-5.465 -1.644,-12.364 l 0,-3.097 c 0.223,0 9.73,0.211 10.824,0.211 l 0.551,-0.622 c -0.227,-3.296 -0.332,-4.125 -0.442,-7.312 l -0.648,-0.621 c -4.707,0.101 -5.687,0.101 -10.062,0.101 0,-13.699 0.105,-27.515 0.871,-41.226 0,-1.027 0.109,-2.156 0.214,-3.293 l -0.542,-0.723" /><path
id="path194"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 795.906,155.031 c 3.504,0 7,-0.101 10.5,-0.101 3.715,0 7.649,0.101 11.481,0.101 l -10.5,34.836 -11.481,-34.836 z m 21.649,40.094 c 3.613,-11.332 7.761,-24.117 11.043,-33.906 3.394,-9.891 8.859,-25.762 12.14,-35.66 l -0.441,-0.821 c -5.684,-0.105 -8.09,-0.207 -12.68,-0.414 l -0.765,0.727 c -2.735,9.683 -3.61,12.461 -6.454,21.746 -4.367,0 -8.636,0.101 -13.011,0.101 -4.813,0 -9.844,-0.101 -14.211,-0.101 -3.176,-9.695 -3.828,-12.16 -6.457,-21.332 l -0.766,-0.727 c -4.699,0 -5.793,0 -11.262,-0.304 l -0.433,0.714 c 0.32,1.133 0.765,2.165 1.203,3.2 4.152,11.125 8.199,22.257 12.133,33.39 6.566,18.235 8.965,24.934 12.136,34.828 l 0.875,0.727 c 7.657,0.098 8.641,0.098 15.641,0.41 l 0.766,-0.723 0.543,-1.855" /><path
id="path196"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 869.723,132.156 c 14.425,0 22.742,8.657 22.742,21.34 0,10.711 -6.016,17.305 -14.762,17.305 -5.906,0 -10.062,-2.676 -12.582,-4.328 -0.105,-5.356 -0.215,-10.61 -0.215,-15.868 0,-6.074 0.11,-12.16 0.215,-18.136 1.426,-0.102 2.746,-0.313 4.602,-0.313 z m -4.817,41.742 c 2.196,1.649 7.438,5.567 15.961,5.567 13.891,0 23.621,-10.723 23.621,-25.25 0,-15.973 -11.265,-29.684 -34.332,-29.684 -2.074,0 -3.394,0.102 -4.922,0.207 0.114,-12.367 0.332,-15.047 0.879,-24.726 l -0.652,-0.6214 c -3.836,-0.1093 -7.656,-0.2109 -11.484,-0.3125 l -0.547,0.6211 c 0.215,6.2808 0.437,12.7698 0.437,23.2888 0,6.082 -0.117,12.157 -0.117,18.242 -0.105,15.969 -0.105,23.188 -1.414,34.934 l 0.539,0.613 c 5.355,0.828 6.566,1.141 11.488,2.071 l 0.758,-0.621 -0.215,-4.329" /><path
id="path198"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 938.633,132.156 c 14.433,0 22.746,8.657 22.746,21.34 0,10.711 -6.02,17.305 -14.762,17.305 -5.91,0 -10.062,-2.676 -12.578,-4.328 -0.113,-5.356 -0.223,-10.61 -0.223,-15.868 0,-6.074 0.11,-12.16 0.223,-18.136 1.422,-0.102 2.738,-0.313 4.594,-0.313 z m -4.817,41.742 c 2.196,1.649 7.446,5.567 15.965,5.567 13.891,0 23.617,-10.723 23.617,-25.25 0,-15.973 -11.257,-29.684 -34.332,-29.684 -2.074,0 -3.386,0.102 -4.921,0.207 0.117,-12.367 0.332,-15.047 0.882,-24.726 l -0.656,-0.6214 c -3.836,-0.1093 -7.656,-0.2109 -11.48,-0.3125 l -0.551,0.6211 c 0.219,6.2808 0.441,12.7698 0.441,23.2888 0,6.082 -0.113,12.157 -0.113,18.242 -0.109,15.969 -0.109,23.188 -1.418,34.934 l 0.543,0.613 c 5.355,0.828 6.562,1.141 11.484,2.071 l 0.762,-0.621 -0.223,-4.329" /><path
id="path200"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1002.7,124.633 c -5.255,-0.102 -6.348,-0.199 -11.489,-0.41 l -0.535,0.722 c 0.215,7.313 0.535,16.598 0.535,36.383 0,14.219 0,29.473 -1.09,42.66 l 0.555,0.621 c 5.355,0.821 6.441,1.028 11.914,2.157 l 0.65,-0.719 c -0.76,-13.5 -0.76,-27.102 -0.76,-40.598 0,-22.57 0.32,-30.402 0.87,-40.195 l -0.65,-0.621" /><path
id="path202"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1035.38,193.168 c -5.59,-0.199 -6.79,-0.313 -12.14,-0.82 l -0.66,0.621 c 0.11,1.336 0.11,2.777 0.11,4.117 0,1.859 -0.11,3.504 -0.22,5.562 l 0.77,0.622 c 5.68,0.41 6.66,0.507 12.14,1.031 l 0.65,-0.621 c -0.11,-4.227 -0.11,-5.258 0,-9.793 l -0.65,-0.719 z m -0.12,-68.535 c -5.68,-0.102 -6.55,-0.102 -11.91,-0.41 l -0.55,0.722 c 0.33,5.465 0.66,10.2 0.66,21.641 0,19.687 -0.33,23.394 -1.1,29.473 l 0.55,0.718 c 4.7,0.731 6.34,0.934 11.81,2.071 l 1.09,-0.621 c -0.32,-5.356 -0.66,-10.922 -0.66,-24.223 0,-19.164 0.23,-21.746 0.66,-28.75 l -0.55,-0.621" /><path
id="path204"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1090.83,164.004 c -2.18,5.668 -6.99,8.035 -11.91,8.035 -6.12,0 -13.33,-3.914 -14.43,-14.219 13.23,-0.101 17.38,0 27.44,0.098 -0.1,1.449 -0.21,3.711 -1.1,6.086 z m 10.18,-26.902 c -0.55,-4.114 -0.65,-5.157 -0.87,-9.172 l -0.67,-0.719 c -1.85,-0.93 -7.75,-3.914 -17.49,-3.914 -17.93,0 -29.19,9.691 -29.19,27.621 0,19.164 12.25,28.547 26.58,28.547 8.63,0 14.64,-3.406 17.92,-7.113 6.24,-7.008 6.03,-17.211 5.92,-21.747 l -0.78,-0.621 c -17.06,0.114 -20,0.114 -37.94,0 0.11,-3.601 0.44,-8.652 4.16,-12.882 4.48,-5.043 10.72,-5.567 14.1,-5.567 3.18,0 6.46,0.524 9.51,1.551 4.06,1.551 6.46,3.398 7.88,4.539 l 0.87,-0.523" /><path
id="path206"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1156.76,170.703 c -1.86,0.098 -3.16,0.305 -5.47,0.305 -3.38,0 -10.6,-0.207 -15.85,-4.844 -2.4,-2.16 -6.33,-7.004 -6.33,-16.18 0,-5.875 1.75,-10.093 4.04,-12.671 1.97,-2.168 5.58,-4.637 11.25,-4.637 6.68,0 10.72,3.301 12.25,4.531 0.22,13.5 0.22,16.594 0.11,33.496 z m -0.11,33.906 c 5.59,0.926 6.68,1.133 11.6,2.157 l 0.76,-0.61 c -0.76,-14.332 -0.87,-39.883 -0.87,-50.195 0,-15.969 0.43,-23.594 0.87,-30.707 l -0.54,-0.723 c -4.82,0 -6.12,-0.097 -11.15,-0.308 l -0.78,0.621 0.22,3.808 c -2.61,-1.851 -7.11,-5.148 -15.08,-5.148 -14.55,0 -24.6,10.82 -24.6,26.48 0,11.235 5.03,18.352 9.61,22.157 7.99,6.804 18.38,7.117 24.06,7.117 2.3,0 3.4,0 6.35,-0.211 0.11,12.777 -0.45,18.965 -0.99,24.941 l 0.54,0.621" /><path
id="path208"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1254.52,165.758 c 7.96,-3.297 18.58,-7.629 18.58,-20.817 0,-11.543 -9.08,-21.953 -28.12,-21.953 -11.58,0 -19.01,3.293 -21.65,4.532 l -0.43,0.722 c 0.43,3.606 0.56,5.567 0.87,9.481 l 1.11,0.41 c 2.73,-1.746 9.08,-6.074 19.23,-6.074 11.28,0 15.98,5.453 15.98,11.64 0,7.219 -6.34,9.996 -13.47,12.574 l -5.45,2.266 c -7.77,3.399 -18.14,7.836 -18.14,20.406 0,3.817 1.08,7.727 3.37,10.825 5.05,6.796 14.12,9.062 22.98,9.062 8.64,0 13.87,-1.539 19.66,-3.297 l 0.56,-0.82 c -0.43,-3.914 -0.56,-5.356 -0.87,-9.07 l -0.9,-0.411 c -4.68,2.266 -9.81,4.735 -18.02,4.735 -9.07,0 -14.77,-4.02 -14.77,-10.09 0,-4.641 3.28,-6.809 5.58,-8.149 1.42,-0.82 1.85,-1.027 8.42,-3.71 l 5.48,-2.262" /><path
id="path210"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1331.34,136.797 c -0.43,-4.43 -0.54,-4.949 -0.88,-9.176 l -0.76,-0.719 c -3.17,-1.437 -7.43,-3.5 -15.1,-3.5 -16.5,0 -27.21,11.235 -27.21,27.305 0,16.387 10.5,28.758 27.43,28.758 7.11,0 12.14,-2.168 14.99,-3.301 l 0.43,-0.726 c -0.43,-3.708 -0.54,-5.047 -0.76,-8.133 l -0.88,-0.422 c -3.6,2.48 -7.76,4.027 -12.14,4.027 -9.07,0 -17.05,-6.594 -17.05,-19.789 0,-14.019 8.41,-19.062 16.94,-19.062 7.45,0 12.03,3.605 14.11,5.148 l 0.88,-0.41" /><path
id="path212"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1357.48,193.168 c -5.58,-0.199 -6.79,-0.313 -12.14,-0.82 l -0.65,0.621 c 0.09,1.336 0.09,2.777 0.09,4.117 0,1.859 -0.09,3.504 -0.21,5.562 l 0.77,0.622 c 5.7,0.41 6.66,0.507 12.14,1.031 l 0.65,-0.621 c -0.1,-4.227 -0.1,-5.258 0,-9.793 l -0.65,-0.719 z m -0.13,-68.535 c -5.67,-0.102 -6.56,-0.102 -11.92,-0.41 l -0.53,0.722 c 0.31,5.465 0.66,10.2 0.66,21.641 0,19.687 -0.35,23.394 -1.09,29.473 l 0.53,0.718 c 4.7,0.731 6.35,0.934 11.83,2.071 l 1.08,-0.621 c -0.34,-5.356 -0.65,-10.922 -0.65,-24.223 0,-19.164 0.22,-21.746 0.65,-28.75 l -0.56,-0.621" /><path
id="path214"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1412.96,164.004 c -2.19,5.668 -6.99,8.035 -11.92,8.035 -6.13,0 -13.34,-3.914 -14.42,-14.219 13.21,-0.101 17.36,0 27.43,0.098 -0.09,1.449 -0.22,3.711 -1.09,6.086 z m 10.16,-26.902 c -0.52,-4.114 -0.65,-5.157 -0.86,-9.172 l -0.65,-0.719 c -1.86,-0.93 -7.78,-3.914 -17.5,-3.914 -17.93,0 -29.2,9.691 -29.2,27.621 0,19.164 12.26,28.547 26.57,28.547 8.64,0 14.64,-3.406 17.92,-7.113 6.26,-7.008 6.04,-17.211 5.92,-21.747 l -0.77,-0.621 c -17.06,0.114 -20.01,0.114 -37.93,0 0.12,-3.601 0.43,-8.652 4.14,-12.882 4.49,-5.043 10.72,-5.567 14.12,-5.567 3.16,0 6.44,0.524 9.51,1.551 4.06,1.551 6.44,3.398 7.87,4.539 l 0.86,-0.523" /><path
id="path216"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1490.58,124.633 c -5.25,-0.102 -5.9,-0.102 -10.93,-0.41 l -0.77,0.722 c 0,1.137 0.1,2.266 0.1,3.403 0.11,5.05 0.11,10.097 0.11,15.152 0,15.867 -0.11,16.898 -0.65,19.059 -2.07,7.832 -8.31,7.832 -9.85,7.832 -6.54,0 -11.58,-3.606 -14.53,-5.77 -0.11,-17.933 0.11,-27.308 0.88,-39.367 l -0.67,-0.621 c -5.35,-0.102 -6.22,-0.102 -11.47,-0.41 l -0.56,0.722 c 0.13,5.77 0.34,11.336 0.34,18.965 0,16.488 -0.77,25.242 -1.31,32.149 l 0.65,0.718 c 5.46,0.934 6.45,1.141 11.6,2.071 l 0.75,-0.731 -0.1,-5.355 c 2.84,1.855 9.62,6.39 19.24,6.39 2.74,0 6.13,-0.414 9.07,-1.957 2.85,-1.547 5.14,-3.914 6.35,-6.703 1.42,-3.09 1.53,-6.176 1.64,-12.574 l 0,-12.051 c 0.33,-12.058 0.43,-16.699 0.76,-20.613 l -0.65,-0.621" /><path
id="path218"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1552.09,136.797 c -0.43,-4.43 -0.53,-4.949 -0.87,-9.176 l -0.77,-0.719 c -3.16,-1.437 -7.43,-3.5 -15.08,-3.5 -16.5,0 -27.22,11.235 -27.22,27.305 0,16.387 10.5,28.758 27.44,28.758 7.09,0 12.13,-2.168 14.99,-3.301 l 0.43,-0.726 c -0.43,-3.708 -0.56,-5.047 -0.78,-8.133 l -0.86,-0.422 c -3.63,2.48 -7.78,4.027 -12.14,4.027 -9.08,0 -17.06,-6.594 -17.06,-19.789 0,-14.019 8.42,-19.062 16.93,-19.062 7.47,0 12.05,3.605 14.12,5.148 l 0.87,-0.41" /><path
id="path220"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1601.36,164.004 c -2.17,5.668 -7,8.035 -11.9,8.035 -6.12,0 -13.34,-3.914 -14.45,-14.219 13.25,-0.101 17.4,0 27.46,0.098 -0.13,1.449 -0.21,3.711 -1.11,6.086 z m 10.18,-26.902 c -0.55,-4.114 -0.64,-5.157 -0.87,-9.172 l -0.67,-0.719 c -1.87,-0.93 -7.74,-3.914 -17.5,-3.914 -17.93,0 -29.17,9.691 -29.17,27.621 0,19.164 12.24,28.547 26.57,28.547 8.64,0 14.65,-3.406 17.93,-7.113 6.22,-7.008 6.01,-17.211 5.91,-21.747 l -0.77,-0.621 c -17.06,0.114 -20,0.114 -37.96,0 0.12,-3.601 0.46,-8.652 4.18,-12.882 4.45,-5.043 10.71,-5.567 14.08,-5.567 3.19,0 6.48,0.524 9.51,1.551 4.06,1.551 6.48,3.398 7.89,4.539 l 0.87,-0.523" /><path
id="path222"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1653.61,155.863 c 4.37,-1.343 14.32,-4.535 14.32,-15.461 0,-4.121 -1.64,-8.754 -6.13,-12.16 -5.79,-4.64 -13.55,-4.945 -17.49,-4.945 -5.9,0 -10.82,1.027 -14.97,2.574 -0.56,0.211 -1.11,0.41 -1.64,0.621 l -0.56,0.93 c 0.45,4.016 0.45,4.523 0.66,8.652 l 1.09,0.313 c 1.98,-1.442 6.77,-4.949 15.2,-4.949 8.63,0 11.81,4.539 11.81,7.726 0,4.746 -4.71,6.285 -11.38,8.356 l -3.49,1.125 c -4.48,1.339 -14.33,4.328 -14.33,14.945 0,10.617 9.85,15.875 22.1,15.875 8.08,0 13.78,-2.168 15.74,-2.891 l 0.55,-0.715 c -0.44,-3.82 -0.55,-4.23 -0.87,-8.144 l -1,-0.41 c -2.73,1.648 -6.99,4.117 -14.1,4.117 -1.53,0 -3.07,-0.102 -4.71,-0.512 -3.28,-0.828 -6,-2.988 -6,-6.183 0,-4.434 4.47,-5.778 11.25,-7.735 l 3.95,-1.129" /><path
id="path224"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1150.8,1.55078 c -7.43,0 -8.53,0 -15.75,-0.3125 l -0.75,0.72266 c -1.76,10.30076 -2.42,13.28906 -3.95,20.80856 l -8.97,44.4219 -9.07,-42.043 c -0.54,-2.789 -1.08,-5.6796 -1.75,-8.4492 -0.87,-4.4375 -2.51,-11.96092 -2.94,-14.43748 l -0.67,-0.71094 c -7.86,0 -8.31,-0.10937 -15.85,-0.3125 l -0.76,0.72266 c -1.98,9.26956 -11.05,48.32816 -16.95,71.61716 l 0.54,0.7305 c 6.13,0 7.11,0.1016 12.46,0.3125 l 0.67,-0.7305 c 0.65,-3.6093 1.3,-6.9023 2.29,-12.0625 0.88,-4.6289 1.75,-9.1679 2.63,-13.707 l 7.98,-39.35938 9.18,45.64848 c 1.53,7.5312 1.74,8.7617 3.71,19.1679 l 0.67,0.7305 c 8.31,0.1016 9.72,0.1016 17.38,0.3125 l 0.65,-0.7305 c 0.12,-0.8203 0.22,-1.6523 0.33,-2.5703 0.45,-2.6914 2.96,-15.8789 3.61,-19.3789 l 8.64,-43.48046 8.53,40.68746 c 4.05,19.9024 4.16,20.3125 4.7,24.4297 l 0.65,0.7305 c 5.04,0 6.14,0.1016 10.72,0.3125 l 0.56,-0.7305 c -2.53,-8.039 -3.18,-10.8203 -9.19,-35.8593 -2.74,-11.2305 -5.69,-22.3711 -8.09,-33.60161 -0.11,-0.71875 -0.33,-1.44141 -0.44,-2.16797 l -0.77,-0.71094" /><path
id="path226"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1215.16,41.0195 c -2.17,5.6719 -7,8.0391 -11.89,8.0391 -6.13,0 -13.35,-3.918 -14.46,-14.2305 13.25,-0.0976 17.4,0 27.46,0.1133 -0.12,1.4492 -0.21,3.6992 -1.11,6.0781 z m 10.19,-26.8984 C 1224.79,10 1224.7,8.96094 1224.48,4.94922 l -0.68,-0.71875 c -1.86,-0.92969 -7.74,-3.921876 -17.5,-3.921876 -17.93,0 -29.17,9.691406 -29.17,27.621106 0,19.1719 12.24,28.5508 26.57,28.5508 8.64,0 14.65,-3.4102 17.93,-7.1211 6.23,-7 6.01,-17.1992 5.92,-21.7383 L 1226.77,27 c -17.06,0.1094 -20,0.1094 -37.96,0 0.13,-3.6016 0.46,-8.6484 4.18,-12.8789 4.46,-5.05079 10.71,-5.57032 14.09,-5.57032 3.19,0 6.47,0.51953 9.51,1.55082 4.05,1.5468 6.47,3.3867 7.89,4.539 l 0.87,-0.5195" /><path
id="path228"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1267.4,32.8711 c 4.36,-1.332 14.33,-4.5313 14.33,-15.4492 0,-4.1211 -1.64,-8.76174 -6.12,-12.1719 -5.8,-4.640625 -13.57,-4.941406 -17.5,-4.941406 -5.91,0 -10.84,1.031246 -14.99,2.582036 -0.56,0.19921 -1.08,0.41015 -1.64,0.60937 l -0.56,0.92969 c 0.47,4.03125 0.47,4.53125 0.69,8.64841 l 1.08,0.3203 c 1.98,-1.4375 6.78,-4.93746 15.2,-4.93746 8.64,0 11.8,4.52736 11.8,7.71876 0,4.75 -4.7,6.2812 -11.36,8.3516 l -3.5,1.1289 c -4.49,1.3398 -14.34,4.3281 -14.34,14.9414 0,10.6172 9.85,15.8789 22.11,15.8789 8.08,0 13.78,-2.1719 15.73,-2.8907 l 0.56,-0.7187 c -0.44,-3.8125 -0.56,-4.2227 -0.87,-8.1406 l -0.99,-0.4102 c -2.73,1.6485 -7,4.1211 -14.12,4.1211 -1.52,0 -3.07,-0.1133 -4.71,-0.5195 -3.28,-0.8203 -6,-2.9805 -6,-6.1836 0,-4.4375 4.48,-5.7695 11.27,-7.7266 l 3.93,-1.1406" /><path
id="path230"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1322.22,9.69141 c -0.34,-3.40235 -0.34,-4.1211 -0.45,-7.11328 l -0.54,-0.61719 c -2.29,-0.51953 -4.15,-0.94141 -8.2,-0.94141 -2.62,0 -9.51,0 -12.9,5.37891 -1.97,2.98047 -1.97,5.45316 -1.97,17.61326 l 0.22,22.6797 c -3.82,0 -3.93,-0.1016 -7.87,-0.2109 l -0.45,0.6211 c 0.22,3.289 0.22,4.1172 0.22,7.4179 l 0.67,0.6094 c 2.4,0 3.82,-0.0976 7.43,0 -0.11,2.1719 -0.11,4.4414 -0.11,6.6016 -0.11,1.9609 -0.21,3.9101 -0.33,5.8711 l 0.55,0.7187 c 4.92,1.1406 6.13,1.4492 11.16,2.8906 l 0.76,-0.5117 c -0.33,-6.8008 -0.43,-8.1406 -0.43,-15.6679 4.58,0.0976 5.89,0.0976 12.13,0.3085 l 0.55,-0.621 c -0.22,-2.6797 -0.33,-3.8086 -0.33,-7.3086 l -0.56,-0.6211 C 1316.31,46.8906 1315.66,47 1309.87,47 l -0.22,-19.1719 c 0.11,-1.2383 0.11,-7.1172 0.11,-8.5468 0,-7.5313 0.97,-9.90239 6.44,-9.90239 2.31,0 4.05,0.51172 5.25,0.92969 l 0.77,-0.61719" /><path
id="path232"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1371.69,41.0195 c -2.2,5.6719 -7,8.0391 -11.92,8.0391 -6.13,0 -13.35,-3.918 -14.46,-14.2305 13.25,-0.0976 17.4,0 27.46,0.1133 -0.12,1.4492 -0.21,3.6992 -1.08,6.0781 z m 10.16,-26.8984 C 1381.29,10 1381.2,8.96094 1380.98,4.94922 l -0.68,-0.71875 c -1.86,-0.92969 -7.74,-3.921876 -17.5,-3.921876 -17.93,0 -29.17,9.691406 -29.17,27.621106 0,19.1719 12.23,28.5508 26.57,28.5508 8.64,0 14.65,-3.4102 17.93,-7.1211 6.23,-7 6.01,-17.1992 5.91,-21.7383 L 1383.27,27 c -17.06,0.1094 -20,0.1094 -37.96,0 0.12,-3.6016 0.46,-8.6484 4.18,-12.8789 4.46,-5.05079 10.71,-5.57032 14.08,-5.57032 3.2,0 6.48,0.51953 9.51,1.55082 4.06,1.5468 6.48,3.3867 7.9,4.539 l 0.87,-0.5195" /><path
id="path234"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1426.31,44.4219 c -1.11,0.4062 -2.54,0.9297 -4.4,0.9297 -2.07,0 -3.59,-0.7227 -4.58,-1.3399 -4.49,-2.9922 -4.49,-7.5312 -4.49,-18.25 0,-11.6406 0.34,-17.71092 0.77,-23.49998 l -0.55,-0.71094 c -5.14,0 -6.32,-0.10937 -11.58,-0.3125 l -0.56,0.61328 c 0.12,7.83985 0.25,14.94924 0.25,24.52734 0,16.4922 -0.34,20.7227 -0.99,26.6914 l 0.65,0.7188 c 4.15,0.7304 6.78,1.2422 11.36,2.0703 l 0.65,-0.6211 -0.53,-8.7578 c 1.3,3.289 4.03,9.8906 13.35,9.8906 1.4,0 2.17,-0.1016 3.04,-0.3125 l 0.46,-0.6172 c -1.11,-4.9414 -1.33,-5.9726 -2.1,-10.5 l -0.75,-0.5195" /><path
id="path236"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1490.75,1.64844 c -5.23,-0.09766 -5.88,-0.09766 -10.93,-0.41016 l -0.78,0.72266 c 0,1.1289 0.13,2.26953 0.13,3.39844 0.09,5.05082 0.09,10.10152 0.09,15.16012 0,15.8711 -0.09,16.8907 -0.65,19.0508 -2.07,7.8399 -8.3,7.8399 -9.85,7.8399 -6.53,0 -11.58,-3.6094 -14.52,-5.7696 -0.12,-17.9414 0.1,-27.3203 0.87,-39.37888 l -0.65,-0.61328 c -5.36,-0.09766 -6.23,-0.09766 -11.49,-0.41016 l -0.56,0.72266 c 0.13,5.76953 0.34,11.33986 0.34,18.96876 0,16.4805 -0.77,25.2422 -1.29,32.1406 l 0.64,0.7188 c 5.45,0.9297 6.44,1.1406 11.59,2.0703 l 0.77,-0.7305 -0.12,-5.3594 c 2.84,1.8594 9.62,6.4024 19.25,6.4024 2.73,0 6.14,-0.4219 9.08,-1.961 2.85,-1.5507 5.14,-3.9218 6.34,-6.6992 1.43,-3.0898 1.52,-6.1836 1.65,-12.5703 l 0,-12.0625 c 0.31,-12.0586 0.43,-16.69921 0.74,-20.61718 l -0.65,-0.61328" /><path
id="path238"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1576.81,42.7695 c 7.95,-3.3007 18.57,-7.6211 18.57,-20.8203 C 1595.38,10.4102 1586.31,0 1567.27,0 c -11.59,0 -19.02,3.30078 -21.65,4.53125 L 1545.19,5.25 c 0.43,3.62109 0.55,5.5703 0.86,9.4805 l 1.12,0.4179 c 2.72,-1.75 9.07,-6.07809 19.23,-6.07809 11.27,0 15.97,5.46099 15.97,11.64059 0,7.2188 -6.34,10 -13.46,12.5704 l -5.45,2.2773 c -7.78,3.3906 -18.15,7.832 -18.15,20.4023 0,3.8204 1.09,7.7305 3.37,10.8204 5.05,6.7968 14.12,9.0703 22.98,9.0703 8.64,0 13.88,-1.543 19.67,-3.3008 l 0.55,-0.8203 c -0.43,-3.9219 -0.55,-5.3594 -0.86,-9.0821 l -0.9,-0.4101 c -4.68,2.2812 -9.82,4.75 -18.02,4.75 -9.08,0 -14.78,-4.0195 -14.78,-10.0977 0,-4.6406 3.29,-6.8008 5.58,-8.1523 1.43,-0.8164 1.86,-1.0274 8.42,-3.6992 l 5.49,-2.2696" /><path
id="path240"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1675.09,1.64844 c -7.32,-0.09766 -8.21,-0.09766 -14.87,-0.41016 l -0.78,0.72266 c -1.3,6.27734 -3.37,14.64066 -5.22,21.94926 l -6.35,24.7382 -6.44,-25.3593 c -3.29,-12.4688 -4.4,-16.48051 -5.37,-21.02738 l -0.67,-0.61328 c -7.65,-0.09766 -8.17,-0.09766 -15.09,-0.41016 l -0.64,0.72266 c -4.81,18.44926 -13.01,45.44926 -15.29,52.24996 l 0.42,0.7188 c 5.24,0.3086 6.67,0.3086 11.93,0.8203 l 0.64,-0.6211 c 0.66,-3.3984 1.43,-6.5976 6.14,-25.6484 l 5.23,-21.24222 7.12,27.73052 c 3.28,13.7109 3.51,15.0429 4.15,18.3398 l 0.74,0.7227 c 6.48,0 8.33,0 15.55,0.3085 l 0.65,-0.7187 c 1.55,-7.1094 4.14,-17 6.13,-24.832 l 5.79,-21.85941 6.13,24.01951 c 0.87,3.6094 1.74,7.211 2.64,10.8203 1.85,7 2.07,7.8321 2.72,11.75 l 0.77,0.6094 c 1.74,0 3.6,-0.0976 5.36,-0.0976 1.65,0 3.26,0.0976 4.9,0.0976 l 0.67,-0.6094 c -2.07,-5.8711 -11.7,-34.6289 -16.19,-52.25778 l -0.77,-0.61328" /><path
id="path242"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1716.4,70.1797 c -5.58,-0.1992 -6.79,-0.3086 -12.14,-0.8203 l -0.66,0.6211 c 0.11,1.3398 0.11,2.7812 0.11,4.1211 0,1.8593 -0.11,3.5078 -0.21,5.5703 l 0.76,0.6094 c 5.69,0.4101 6.67,0.5078 12.14,1.0273 l 0.66,-0.6172 c -0.11,-4.2226 -0.11,-5.25 0,-9.793 l -0.66,-0.7187 z m -0.12,-68.53126 c -5.67,-0.09766 -6.56,-0.09766 -11.91,-0.41016 l -0.55,0.72266 c 0.33,5.46094 0.66,10.19926 0.66,21.64066 0,19.6875 -0.33,23.3984 -1.09,29.4687 l 0.54,0.7188 c 4.7,0.7304 6.34,0.9297 11.81,2.0703 l 1.11,-0.6211 c -0.35,-5.3594 -0.68,-10.918 -0.68,-24.2188 0,-19.1679 0.23,-21.73825 0.68,-28.75778 l -0.57,-0.61328" /><path
id="path244"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1761.66,9.69141 c -0.3,-3.40235 -0.3,-4.1211 -0.43,-7.11328 l -0.56,-0.61719 c -2.29,-0.51953 -4.15,-0.94141 -8.2,-0.94141 -2.61,0 -9.51,0 -12.88,5.37891 -1.98,2.98047 -1.98,5.45316 -1.98,17.61326 l 0.21,22.6797 c -3.81,0 -3.93,-0.1016 -7.87,-0.2109 l -0.43,0.6211 c 0.22,3.289 0.22,4.1172 0.22,7.4179 l 0.65,0.6094 c 2.41,0 3.84,-0.0976 7.43,0 -0.1,2.1719 -0.1,4.4414 -0.1,6.6016 -0.11,1.9609 -0.21,3.9101 -0.34,5.8711 l 0.56,0.7187 c 4.93,1.1406 6.13,1.4492 11.15,2.8906 l 0.77,-0.5117 c -0.34,-6.8008 -0.43,-8.1406 -0.43,-15.6679 4.58,0.0976 5.88,0.0976 12.14,0.3085 l 0.53,-0.621 c -0.22,-2.6797 -0.31,-3.8086 -0.31,-7.3086 l -0.56,-0.6211 C 1755.75,46.8906 1755.1,47 1749.31,47 l -0.22,-19.1719 c 0.13,-1.2383 0.13,-7.1172 0.13,-8.5468 0,-7.5313 0.96,-9.90239 6.43,-9.90239 2.3,0 4.07,0.51172 5.24,0.92969 l 0.77,-0.61719" /><path
id="path246"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1812.41,1.55078 c -3.03,0 -18.02,-0.10937 -21.42,-0.10937 -12.79,0 -14.21,0 -20.87,-0.20313 l -0.43,0.9336 c 8.29,12.97652 21.51,35.03902 27.09,44.92972 C 1782.34,47 1779.75,47 1772.74,46.6914 l -0.55,0.6094 c 0.44,3.3984 0.55,4.2305 0.78,7.1094 l 0.64,0.6211 c 18.37,0 20.44,0 39.49,0.3085 l 0.52,-0.8203 C 1803.9,39.4688 1790,14.9492 1787.05,9.69141 c 9.41,0.09765 18.83,0.30859 26.26,0.61719 l 0.53,-0.61719 c -0.43,-3.20313 -0.53,-4.54297 -0.74,-7.6211 l -0.69,-0.51953" /><path
id="path248"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1863.98,41.0195 c -2.17,5.6719 -6.99,8.0391 -11.9,8.0391 -6.13,0 -13.34,-3.918 -14.44,-14.2305 13.23,-0.0976 17.38,0 27.45,0.1133 -0.11,1.4492 -0.22,3.6992 -1.11,6.0781 z m 10.18,-26.8984 C 1873.61,10 1873.51,8.96094 1873.29,4.94922 l -0.66,-0.71875 c -1.86,-0.92969 -7.76,-3.921876 -17.5,-3.921876 -17.92,0 -29.18,9.691406 -29.18,27.621106 0,19.1719 12.24,28.5508 26.56,28.5508 8.64,0 14.65,-3.4102 17.93,-7.1211 6.24,-7 6.02,-17.1992 5.92,-21.7383 L 1875.59,27 c -17.06,0.1094 -20.01,0.1094 -37.95,0 0.12,-3.6016 0.45,-8.6484 4.16,-12.8789 4.48,-5.05079 10.71,-5.57032 14.11,-5.57032 3.17,0 6.45,0.51953 9.5,1.55082 4.06,1.5468 6.46,3.3867 7.88,4.539 l 0.87,-0.5195" /><path
id="path250"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1918.62,44.4219 c -1.11,0.4062 -2.51,0.9297 -4.39,0.9297 -2.07,0 -3.6,-0.7227 -4.58,-1.3399 -4.49,-2.9922 -4.49,-7.5312 -4.49,-18.25 0,-11.6406 0.34,-17.71092 0.77,-23.49998 l -0.56,-0.71094 c -5.14,0 -6.32,-0.10937 -11.58,-0.3125 l -0.56,0.61328 c 0.13,7.83985 0.26,14.94924 0.26,24.52734 0,16.4922 -0.35,20.7227 -1,26.6914 l 0.65,0.7188 c 4.15,0.7304 6.78,1.2422 11.36,2.0703 l 0.66,-0.6211 -0.53,-8.7578 c 1.3,3.289 4.02,9.8906 13.35,9.8906 1.39,0 2.17,-0.1016 3.03,-0.3125 l 0.46,-0.6172 c -1.11,-4.9414 -1.32,-5.9726 -2.1,-10.5 l -0.75,-0.5195" /><path
id="path252"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1946.37,1.64844 c -5.24,-0.09766 -6.32,-0.20703 -11.46,-0.41016 l -0.55,0.72266 c 0.21,7.32031 0.55,16.58986 0.55,36.37886 0,14.2188 0,29.4688 -1.11,42.6602 l 0.56,0.6211 c 5.36,0.8203 6.44,1.0273 11.92,2.1602 l 0.64,-0.711 c -0.77,-13.5117 -0.77,-27.1094 -0.77,-40.6094 0,-22.5703 0.34,-30.4023 0.9,-40.19918 l -0.68,-0.61328" /><path
id="path254"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1996.48,30.3008 c -11.03,-1.5508 -21.31,-2.9922 -21.31,-12.1719 0,-0.5 0,-9.36718 10.39,-9.36718 6.77,0 10.71,3.49998 11.92,4.53908 l 0,17.2109 -1,-0.2109 z m 12.25,-7.5313 c 0,-12.7695 0.11,-13.89841 0.67,-20.59762 l -0.56,-0.52344 c -5.14,-0.09766 -6.01,-0.20703 -11.04,-0.41016 l -0.43,0.61328 0.11,3.71875 c -2.08,-1.55078 -7,-5.261716 -15.31,-5.261716 -10.94,0 -18.6,7.011716 -18.6,17.210906 0,13.8086 12.25,18.25 31.94,20.4024 l 1.86,0.207 c 0,2.7813 0,4.7422 -0.99,6.3906 -1.09,1.8594 -3.61,3.8086 -9.08,3.8086 -7.1,0 -12.03,-2.0468 -16.61,-3.9062 l -0.88,0.5195 c 0.22,4.7383 0.22,5.3477 0.33,7.5078 l 0.66,0.6211 c 6.11,2.0586 12.46,3.4102 18.91,3.4102 8.09,0 15.97,-2.5821 18.27,-10.6211 0.75,-2.8789 0.75,-8.5586 0.75,-12.8789 l 0,-10.211" /><path
id="path256"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2077.51,1.64844 c -5.25,-0.09766 -5.9,-0.09766 -10.94,-0.41016 l -0.77,0.72266 c 0,1.1289 0.11,2.26953 0.11,3.39844 0.13,5.05082 0.13,10.10152 0.13,15.16012 0,15.8711 -0.13,16.8907 -0.67,19.0508 -2.08,7.8399 -8.32,7.8399 -9.83,7.8399 -6.57,0 -11.59,-3.6094 -14.55,-5.7696 -0.11,-17.9414 0.1,-27.3203 0.88,-39.37888 l -0.67,-0.61328 c -5.36,-0.09766 -6.22,-0.09766 -11.47,-0.41016 l -0.56,0.72266 c 0.11,5.76953 0.34,11.33986 0.34,18.96876 0,16.4805 -0.77,25.2422 -1.32,32.1406 l 0.66,0.7188 c 5.46,0.9297 6.45,1.1406 11.59,2.0703 l 0.76,-0.7305 -0.11,-5.3594 c 2.86,1.8594 9.63,6.4024 19.25,6.4024 2.74,0 6.12,-0.4219 9.07,-1.961 2.85,-1.5507 5.14,-3.9218 6.35,-6.6992 1.42,-3.0898 1.53,-6.1836 1.64,-12.5703 l 0,-12.0625 c 0.32,-12.0586 0.43,-16.69921 0.75,-20.61718 l -0.64,-0.61328" /><path
id="path258"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2134.67,47.7109 c -1.86,0.1094 -3.16,0.3204 -5.48,0.3204 -3.38,0 -10.6,-0.211 -15.86,-4.8516 -2.38,-2.1602 -6.31,-7 -6.31,-16.1797 0,-5.8789 1.73,-10.1016 4.02,-12.6797 1.99,-2.1601 5.57,-4.62889 11.27,-4.62889 6.66,0 10.72,3.29689 12.23,4.52739 0.23,13.5 0.23,16.6015 0.13,33.4921 z m -0.13,33.9102 c 5.61,0.9297 6.69,1.1289 11.61,2.1602 l 0.75,-0.6094 c -0.75,-14.3321 -0.86,-39.8828 -0.86,-50.1914 0,-15.9688 0.42,-23.60159 0.86,-30.71878 l -0.52,-0.71094 c -4.84,0 -6.14,-0.10937 -11.16,-0.3125 l -0.77,0.61328 0.22,3.8086 c -2.63,-1.83985 -7.12,-5.140629 -15.08,-5.140629 -14.55,0 -24.62,10.820269 -24.62,26.480469 0,11.2305 5.05,18.3516 9.63,22.1484 7.99,6.8125 18.36,7.1211 24.06,7.1211 2.3,0 3.38,0 6.35,-0.2109 0.1,12.7812 -0.47,18.9727 -1,24.9414 l 0.53,0.6211" /></g></g></svg>

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

+14
View File
@@ -0,0 +1,14 @@
---
BasedOnStyle: Google
IndentWidth: 4
---
Language: Cpp
ColumnLimit: 80
BreakBeforeBraces: Custom
AlignConsecutiveAssignments: true
DerivePointerAlignment: false
PointerAlignment: Left
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterFunction: true
+20
View File
@@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.28)
project(backtrace)
include(../../nanopi.cmake)
add_executable(backtrace main.c)
@@ -0,0 +1,5 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
+32
View File
@@ -0,0 +1,32 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
},
{
"name": "(gdb) debug Core Dumped",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb",
"coreDumpPath": "${workspaceFolder}/core"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.28)
project(core-dumps)
include(../../nanopi.cmake)
add_executable(core-dumps core_dumps.c)
@@ -0,0 +1,5 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
+20
View File
@@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.28)
project(daemon)
include(../../nanopi.cmake)
add_executable(daemon daemon.c)
+5
View File
@@ -0,0 +1,5 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
@@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
@@ -24,13 +24,13 @@
"ignoreFailures": true
}
],
// "miDebuggerServerAddress": "192.168.0.14:1234",
// "miDebuggerServerAddress": "192.168.53.14:1234",
// "miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb",
"pipeTransport": {
// "pipeCwd": "/usr/bin",
"pipeProgram": "/usr/bin/ssh",
"pipeArgs": [
"root@192.168.0.14"
"root@192.168.53.14"
],
"debuggerPath": "/usr/bin/gdb"
// "debuggerPath": "stdbuf -i0 -o0 -e0 /usr/bin/gdb"
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -0,0 +1 @@
fibonacci
+20
View File
@@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app 2'"
]
}
]
}
@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.28)
project(fibonacci)
include(../../nanopi.cmake)
add_executable(fibonacci fibonacci.c)
@@ -0,0 +1,5 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
+9
View File
@@ -0,0 +1,9 @@
build-all:
#!/bin/bash
for i in $(dirname */CMAkeLists.txt); do
cd $i && just build && cd ..
done
clean-all:
rm -Rf */build
@@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.28)
project(memory-leaks)
include(../../nanopi.cmake)
add_executable(memory-leaks mem_leaks.c)
@@ -0,0 +1,5 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
+20
View File
@@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.28)
project(process)
include(../../nanopi.cmake)
add_executable(process process.c)

Some files were not shown because too many files have changed in this diff Show More