summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/_static/css/custom.css18
-rw-r--r--doc/conf.py41
-rw-r--r--doc/contributing.rst11
-rw-r--r--doc/daily_work.inc78
-rw-r--r--doc/dev_add_new_pkgs.rst735
-rw-r--r--doc/dev_advanced_rule_files.rst494
-rw-r--r--doc/dev_code_signing.rst11
-rw-r--r--doc/dev_code_signing_flowchart.svg1977
-rw-r--r--doc/dev_create_new_pkg_templates.rst2
-rw-r--r--doc/dev_layers_in_ptxdist.rst2
-rw-r--r--doc/dev_licenses.rst245
-rw-r--r--doc/dev_manual.rst3
-rw-r--r--doc/dev_patching.rst295
-rw-r--r--doc/environment.rst26
-rw-r--r--doc/getting_help.rst15
-rw-r--r--doc/including_bsp_doc.inc34
-rw-r--r--doc/index-layer-0-ptxdist.rst1
-rw-r--r--doc/index.rst2
-rw-r--r--doc/multi_image_platforms.inc8
-rw-r--r--doc/ref_code_signing_helpers.rst101
-rw-r--r--doc/ref_make_macros.rst122
-rw-r--r--doc/ref_make_variables.rst72
-rw-r--r--doc/ref_parameter.rst30
-rw-r--r--doc/user_manual.inc4
24 files changed, 3530 insertions, 797 deletions
diff --git a/doc/_static/css/custom.css b/doc/_static/css/custom.css
index 0efa6f92c..27add4426 100644
--- a/doc/_static/css/custom.css
+++ b/doc/_static/css/custom.css
@@ -12,6 +12,11 @@
vertical-align: middle;
}
+/* "View Page Source" link */
+.wy-breadcrumbs .wy-breadcrumbs-aside > a {
+ display: inline-block;
+ padding: 7px;
+}
/* links */
.wy-menu-vertical a:active {
@@ -97,15 +102,20 @@ nav.wy-nav-side #menu-resize .fa:not(:first-child) {
}
.important {
- background-color: #fff4dd !important;
+ background-color: #fff4dd !important;
}
.important .admonition-title {
- background-color: #ff9b00 !important;
+ background-color: #ff9b00 !important;
}
.note {
- background-color: #f2f9e5 !important;
+ background-color: #f2f9e5 !important;
}
.note .admonition-title {
- background-color: #83983e !important;
+ background-color: #83983e !important;
+}
+
+.wy-table-responsive table.word-wrap td,
+.wy-table-responsive table.word-wrap th {
+ white-space: normal;
}
diff --git a/doc/conf.py b/doc/conf.py
index 92594f407..49d19965f 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -17,6 +17,7 @@ import sys
import os
import re
import fileinput
+import subprocess
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -33,6 +34,13 @@ import fileinput
# ones.
extensions = []
+def add_latex_extensions(app, docname, source):
+ if app.builder.name == 'latex':
+ app.setup_extension('sphinxcontrib.rsvgconverter')
+
+def setup(app):
+ app.connect('source-read', add_latex_extensions)
+
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -100,11 +108,11 @@ pygments_style = 'none'
numfig = True
-gnu_target = os.getenv("PTXCONF_GNU_TARGET") or "arm-v5te-linux-gnueabi"
+gnu_target = os.getenv("PTXCONF_GNU_TARGET") or "arm-v7a-linux-gnueabihf"
try:
toolchain = os.readlink(os.path.join(os.getenv("PTXDIST_PLATFORMDIR",""), "selected_toolchain")).split("/")
except:
- toolchain = "/opt/OSELAS.Toolchain-2019.09.1/arm-v5te-linux-gnueabi/gcc-9.2.1-glibc-2.30-binutils-2.32-kernel-5.0-sanitized/bin".split("/")
+ toolchain = "/opt/OSELAS.Toolchain-2022.10.0/arm-v7a-linux-gnueabihf/gcc-12.2.1-clang-15.0.2-glibc-2.36-binutils-2.39-kernel-6.0.5-sanitized/bin".split("/")
ptxdistPlatformName = os.getenv("PTXCONF_PLATFORM", "versatilepb")
ptxdistPlatformDir = "platform-" + ptxdistPlatformName
@@ -124,6 +132,15 @@ ptxdistPlatformCollection = "\ "
ptxdistVendorVersion = os.getenv("PTXDIST_VERSION_YEAR") + "." + os.getenv("PTXDIST_VERSION_MONTH") + "." + os.getenv("PTXDIST_VERSION_BUGFIX")
package = "<package>"
+if "ptxdistonly" in tags.tags.keys():
+ ptxdistBSPSource = "The source of the BSP of your choice."
+else:
+ try:
+ url = subprocess.check_output('git -C "${PTXDIST_WORKSPACE}" remote get-url origin', shell=True).decode().strip()
+ ptxdistBSPSource = f"From git: `{url} <{url}>`_"
+ except subprocess.CalledProcessError as e:
+ ptxdistBSPSource = ptxdistBSPName + ".tar.bz2 (or a similar source)" + str(e)
+
sys.path.append(".")
try:
from replace import *
@@ -141,6 +158,7 @@ replace_dict = {
b"|ptxdistHwVendor|": ptxdistHwVendor,
b"|ptxdistHwProduct|": ptxdistHwProduct,
b"|ptxdistBSPName|": ptxdistBSPName,
+ b"|ptxdistBSPSource|": ptxdistBSPSource,
b"|ptxdistBSPRevision|": ptxdistBSPRevision,
b"|ptxdistCompilerName|": ptxdistCompilerName,
b"|ptxdistCompilerVersion|": ptxdistCompilerVersion,
@@ -172,15 +190,16 @@ html_theme = 'sphinx_rtd_theme'
html_static_path = ['_static']
-html_context = {
- 'css_files': ['_static/css/custom.css'],
- 'script_files': [
- '_static/js/jquery-3.1.0.min.js',
- '_static/underscore.js',
- '_static/doctools.js',
- '_static/js/main.js',
- ],
-}
+html_css_files = [
+ 'css/custom.css',
+]
+
+html_js_files = [
+ 'js/jquery-3.1.0.min.js',
+ 'underscore.js',
+ 'doctools.js',
+ 'js/main.js',
+]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
diff --git a/doc/contributing.rst b/doc/contributing.rst
index e7cbd90e6..63da67802 100644
--- a/doc/contributing.rst
+++ b/doc/contributing.rst
@@ -139,6 +139,13 @@ in mind:
- Run ``ptxdist licensecheck [<pkg>]`` to make sure that the checksum of
pinned-down license files haven't changed.
+ If the license file has changed, look at the difference between the old and
+ the new version of the file (e.g. by comparing the two versioned build
+ folders in ``platform-nnn/build-target/``), and update the package's
+ ``_LICENSE`` variable if necessary.
+ Often the difference is only in the copyright year, but in any case, describe
+ the changes in the license file when sending your patch!
+
Misc
~~~~
@@ -156,6 +163,10 @@ updated of removed after a version bump. Unknown PTXCONF_* variables or
macros used in menu files. There are often typos or the variables was just
removed.
+New packages must also have licensing information in the ``<PKG>_LICENSE``
+and ``<PKG>_LICENSE_FILES`` variables.
+Refer to the section :ref:`licensing_in_packages` for more information.
+
Helper Scripts
--------------
diff --git a/doc/daily_work.inc b/doc/daily_work.inc
index 8fe7739aa..b98adf751 100644
--- a/doc/daily_work.inc
+++ b/doc/daily_work.inc
@@ -1,3 +1,5 @@
+.. _kernel_local_src:
+
Using an External Kernel Source Tree
------------------------------------
@@ -123,6 +125,78 @@ To rebuild the kernel:
package. A ``ptxdist clean kernel`` call will only delete the
symlinks in the build directory, but not clean the kernel compiled files.
+Using the Code Signing Infrastructure with the Kernel Recipe
+------------------------------------------------------------
+
+The kernel recipe can make use of the :ref:`code signing infrastructure
+<code_signing>` to supply cryptographic key material for several kernel features.
+They can be enabled in the `Linux kernel` section of ``ptxdist platformconfig``.
+
+.. important::
+
+ When supplying the kernel with key material, you should also make sure that
+ all necessary crypto algorithms are enabled in the kernel.
+ For example, if your module signing key is signed with an SHA256 hash,
+ you must enable ``CONFIG_CRYPTO_SHA256`` so that the signature can be verified.
+ Otherwise, some older kernels throw a stack trace on boot, and will not load
+ the supplied key material.
+
+.. _kernel_trust_root:
+
+Trusted Root CAs
+~~~~~~~~~~~~~~~~
+
+In some setups additional trusted CAs can be necessary;
+for example, when using EVM, the EVM key must be issued by a certificate that
+is trusted by the kernel.
+
+When ``PTXCONF_KERNEL_CODE_SIGNING`` ("depend on code signing infrastructure")
+is enabled in the platformconfig, and if the code signing provider supplies CA
+certificates in the ``kernel-trusted`` role,
+PTXdist adds the option ``CONFIG_SYSTEM_TRUSTED_KEYS`` to the kernel config to
+add those certificates to the kernel trust root.
+(The code signing provider should use :ref:`cs_append_ca_from_der`,
+:ref:`cs_append_ca_from_pem`, or :ref:`cs_append_ca_from_uri` with the
+``kernel-trusted`` role to supply those certificates.)
+
+Note that the kernel also always adds the module signing key to the trust root
+(see :ref:`kernel_module_signing` below).
+If the EVM key is signed by the module signing key (or if the two keys are the
+same *and* it is self-signed), no additional trust CA is necessary.
+
+.. _kernel_module_signing:
+
+Kernel Module Signing
+~~~~~~~~~~~~~~~~~~~~~
+
+The kernel's build system can generate cryptographic signatures for all
+kernel modules during the build process.
+This can ensure that all modules loaded on the target at runtime have been
+built by a trustworthy source.
+
+If ``PTXCONF_KERNEL_MODULES_SIGN`` ("sign modules") is enabled in the
+platformconfig, PTXdist augments the kernel config with the following config
+options during the `kernel.compile` and `kernel.install` stages:
+
+* ``CONFIG_MODULE_SIG_KEY`` ("File name or PKCS#11 URI of module signing key"):
+ PTXdist supplies the URI from the ``kernel-modules`` role of the configured
+ code signing provider.
+ (The code signing provider should use :ref:`cs_set_uri` to set the URI.)
+
+However, additional settings must also be enabled in the kernel config:
+
+* ``CONFIG_MODULE_SIG=y`` ("Module signature verification"):
+ Enable this option for module signing, and to get access to its sub-options.
+* ``CONFIG_MODULE_SIG_ALL=y`` ("Automatically sign all modules"):
+ Enable this option so that the kernel's build system signs the modules during
+ PTXdist's `kernel.install` stage.
+* Additionally, ``CONFIG_MODULE_SIG_FORCE`` ("Require modules to be validly
+ signed") can be useful so that the kernel refuses loading modules with
+ invalid, untrusted, or no signature.
+
+For the full overview, refer to the `kernel's module signing documentation
+<https://www.kernel.org/doc/html/latest/admin-guide/module-signing.html>`_.
+
Discovering Runtime Dependencies
--------------------------------
@@ -1443,9 +1517,9 @@ A different approach to have a writable ``/var`` without persistency is to use
a so called *overlay filesystem*. This *overlay filesystem* is a transparent
writable layer on top of a read-only filesystem. After the system's start the
*overlay filesystem layer* is empty and all reads will be satisfied by the
-underlaying read-only filesystem. Writes (new files, directories, changes of
+underlying read-only filesystem. Writes (new files, directories, changes of
existing files) are stored in the *overlay filesystem layer* and on the
-next read satisfied by this layer, instead of the underlaying read-only
+next read satisfied by this layer, instead of the underlying read-only
filesystem.
PTXdist supports this use case, by enabling the *overlay* feature for the
diff --git a/doc/dev_add_new_pkgs.rst b/doc/dev_add_new_pkgs.rst
index 0dbc7a266..6b1248563 100644
--- a/doc/dev_add_new_pkgs.rst
+++ b/doc/dev_add_new_pkgs.rst
@@ -248,6 +248,7 @@ PTXdist specific. What does it mean:
- ``*_LICENSE`` enables the user to get a list of licenses she/he is
using in her/his project (licenses of the enabled packages).
+ See :ref:`licensing_in_packages` below for detailed information.
After enabling the menu entry, we can start to check the *get* and
*extract* stages, calling them manually one after another.
@@ -603,737 +604,3 @@ to do (even if its boring and takes time):
This will re-start with a **clean** BSP and builds exactly the new package and
its (known) dependencies. If this builds successfully as well we are really done
with the new package.
-
-Some Notes about Licenses
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The already mentioned rule variable ``*_LICENSE`` (e.g. ``FOO_LICENSE`` in our
-example) is very important and must be filled by the developer of the package.
-Many licenses bring in obligations using the corresponding package (*attribution*
-for example). To make life easier for everybody the license for a package must
-be provided. *SPDX* license identifiers unify the license names and are used
-in PTXdist to identify license types and obligations.
-
-If a package comes with more than one license, all of their SPDX identifiers
-must be listed and connected with the keyword ``AND``. If your package comes
-with GPL-2.0 and LGPL-2.1 licenses, the definition should look like this:
-
-.. code-block:: make
-
- FOO_LICENSE := GPL-2.0 AND LGPL-2.1
-
-One specific obligation cannot be detected examining the SPDX license identifiers
-by PTXdist: *the license choice*. In this case all licenses of choice must be
-listed and connected by the keyword ``OR``.
-
-If, for example, your obligation is to select one of the licenses *GPL-2.0* **or**
-*GPL-3.0*, the ``*_LICENSE`` variable should look like this:
-
-.. code-block:: make
-
- FOO_LICENSE := GPL-2.0 OR GPL-3.0
-
-SPDX License Identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-A list of SPDX license identifiers can be found here:
-
- https://spdx.org/licenses/
-
-Help to Detect the Correct License
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-License identification isn't trivial. A help in doing so can be the following
-repository and its content. It contains a list of known licenses based on their
-SPDX identifier. The content is without formatting to simplify text search.
-
- https://github.com/spdx/license-list-data/tree/master/text
-
-Advanced Rule Files
-~~~~~~~~~~~~~~~~~~~
-
-The previous example on how to create a rule file sometimes works as
-shown above. But most of the time source archives are not that simple.
-In this section we want to give the user a more detailed selection how
-the package will be built.
-
-Adding Static Configure Parameters
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The ``configure`` scripts of various source archives provide additional
-parameters to enable or disable features, or to configure them in a
-specific way.
-
-We assume the ``configure`` script of our ``foo`` example (refer to
-section :ref:`foo_example`) supports two additional parameters:
-
-- **--enable-debug**: Make the program more noisy. It’s disabled by
- default.
-
-- **--with-bar**: Also build the special executable **bar**. Building
- this executable is also disabled by default.
-
-We now want to forward these options to the ``configure`` script when it
-runs in the *prepare* stage. To do so, we must again open the rule file
-with our favourite editor and navigate to the *prepare* stage entry.
-
-PTXdist uses the variable ``FOO_CONF_OPT`` as the list of parameters to
-be given to ``configure``.
-
-Currently this variable is commented out and defined to:
-
-.. code-block:: make
-
- # FOO_CONF_OPT := $(CROSS_AUTOCONF_USR)
-
-The variable ``CROSS_AUTOCONF_USR`` is predefined by PTXdist and
-contains all basic parameters to instruct ``configure`` to prepare for a
-**cross** compile environment.
-
-To use the two additional mentioned ``configure`` parameters, we comment
-in this line and supplement this expression as follows:
-
-.. code-block:: make
-
- FOO_CONF_OPT := \
- $(CROSS_AUTOCONF_USR) \
- --enable-debug \
- --with-bar
-
-.. note:: We recommend to use this format with each parameter on a line of
- its own. This format is easier to read and a diff shows more exactly any
- change.
-
-To do a fast check if this addition was successful, we run:
-
-.. code-block:: text
-
- $ ptxdist print FOO_CONF_OPT
- --prefix=/usr --sysconfdir=/etc --host=|ptxdistCompilerName| --build=i686-host-linux-gnu --enable-debug --with-bar
-
-.. note:: It depends on the currently selected platform and its architecture
- what content this variable will have. The content shown above is an
- example for a target.
-
-Or re-build the package with the new settings:
-
-.. code-block:: text
-
- $ ptxdist drop foo prepare
- $ ptxdist targetinstall foo
-
-Adding Dynamic Configure Parameters
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Sometimes it makes sense to add this kind of parameters on demand only;
-especially a parameter like ``--enable-debug``. To let the user decide
-if this parameter is to be used or not, we must add a menu entry. So,
-let’s expand our menu. Here is its current content:
-
-.. code-block:: kconfig
-
- ## SECTION=project_specific
-
- config FOO
- tristate
- prompt "foo"
- help
- FIXME
-
-We’ll add two menu entries, one for each optional parameter we want to
-add on demand to the ``configure`` parameters:
-
-.. code-block:: kconfig
-
- ## SECTION=project_specific
-
- config FOO
- tristate
- prompt "foo"
- help
- FIXME
-
- if FOO
- config FOO_DEBUG
- bool
- prompt "add debug noise"
-
- config FOO_BAR
- bool
- prompt "build bar"
-
- endif
-
-.. important:: Always follow the rule to extend the base name by a suboption
- name as the trailing part of the variable name. This gives PTXdist the ability
- to detect a change in the package’s settings (via menuconfig) to force its
- rebuild on demand.
-
-To make usage of the new menu entries, we must check them in the rule
-file and add the correct parameters:
-
-.. code-block:: make
-
- #
- # autoconf
- #
- FOO_CONF_OPT := \
- $(CROSS_AUTOCONF_USR) \
- --$(call ptx/endis, PTXCONF_FOO_DEBUG)-debug \
- --$(call ptx/wwo, PTXCONF_FOO_BAR)-bar
-
-.. important:: Please note the leading ``PTXCONF_`` for each define. While Kconfig is
- using ``FOO_BAR``, the rule file must use ``PTXCONF_FOO_BAR`` instead.
-
-.. note:: Refer :ref:`Rule File Macro Reference <param_macros>` for further
- details about these special kind of option macros (e.g. ``ptx/...``).
-
-It is a good practice to always add both settings, e.g. ``--disable-debug``
-even if this is the default case. Sometimes ``configure`` tries to guess
-something and the binary result might differ depending on the build
-order. For example some kind of package would also build some X related
-tools, if X libraries are found. In this case it depends on the build
-order, if the X related tools are built or not. All the autocheck
-features are problematic here. So, if we do not want ``configure`` to
-guess its settings we **must disable everything we do not want**.
-
-To support this process, PTXdist supplies a helper script, located at
-``/path/to/ptxdist/scripts/configure-helper.py`` that compares the configure
-output with the settings from ``FOO_CONF_OPT``:
-
-.. code-block:: text
-
- $ /opt/ptxdist-2017.06.0/scripts/configure-helper.py -p libsigrok
- --- rules/libsigrok.make
- +++ libsigrok-0.5.0
- @@ -4,3 +4,74 @@
- --libdir=/usr/lib
- --build=x86_64-host-linux-gnu
- --host=arm-v7a-linux-gnueabihf
- + --enable-warnings=min|max|fatal|no
- + --disable-largefile
- + --enable-all-drivers
- + --enable-agilent-dmm
- [...]
- + --enable-ruby
- + --enable-java
- + --without-libserialport
- + --without-libftdi
- + --without-libusb
- + --without-librevisa
- + --without-libgpib
- + --without-libieee1284
- + --with-jni-include-path=DIR-LIST
-
-In this example, many configure options from libsigrok (marked with ``+``)
-are not yet present in ``LIBSIGROK_CONF_OPT`` and must be added, possibly also
-by providing more dynamic options in the package definition.
-
-If some parts of a package are built on demand only, they must also be
-installed on demand only. Besides the *prepare* stage, we also must
-modify our *targetinstall* stage:
-
-.. code-block:: make
-
- @$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foo, /usr/bin/foo)
-
- ifdef PTXCONF_FOO_BAR
- @$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/bar, /usr/bin/bar)
- endif
-
- @$(call install_finish, foo)
- @$(call touch)
-
-Now we can play with our new menu entries and check if they are working
-as expected:
-
-.. code-block:: text
-
- $ ptxdist menuconfig
- $ ptxdist targetinstall foo
-
-Whenever we change a *FOO* related menu entry, PTXdist should detect it
-and re-build the package when a new build is started.
-
-.. _external_dependencies:
-
-Managing External Compile Time Dependencies
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-While running the prepare stage, it could happen that it fails due to a
-missing external dependency.
-
-For example:
-
-.. code-block:: text
-
- checking whether zlib exists....failed
-
-In this example, our new package depends on the compression library
-*zlib*. PTXdist comes with a target *zlib*. All we need to do in this
-case is to declare that our new package *foo* depends on *zlib*. This
-kind of dependency is managed in the menu file of our new package by
-simply adding the ``select ZLIB`` line. After this addition our menu
-file looks like:
-
-.. code-block:: kconfig
-
- ## SECTION=project_specific
-
- config FOO
- tristate
- select ZLIB
- prompt "foo"
- help
- FIXME
-
- if FOO
- config FOO_DEBUG
- bool
- prompt "add debug noise"
-
- config FOO_BAR
- bool
- prompt "build bar"
-
- endif
-
-PTXdist now builds the *zlib* first and our new package thereafter.
-
-Refer :ref:`external_dependencies_variants` for more specific dependency
-description.
-
-Managing External Compile Time Dependencies on Demand
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-It is good practice to add only those dependencies that are really
-required for the current configuration of the package. If the package
-provides the features *foo* and *bar* and its ``configure`` provides
-switches to enable/disable them independently, we can also add
-dependencies on demand. Let’s assume feature *foo* needs the compression
-library *libz* and *bar* needs the XML2 library *libxml2*. These
-libraries are only required at run-time if the corresponding feature is
-enabled. To add these dependencies on demand, the menu file looks like:
-
-.. code-block:: kconfig
-
- ## SECTION=project_specific
-
- config FOO
- tristate
- select ZLIB if FOO_FOO
- select LIBXML2 if FOO_BAR
- prompt "foo"
- help
- FIXME
-
- if FOO
- config FOO_DEBUG
- bool
- prompt "add debug noise"
-
- config FOO_FOO
- bool
- prompt "build foo"
-
- config FOO_BAR
- bool
- prompt "build bar"
-
- endif
-
-.. important:: Do not add these ``select`` statements to the corresponding menu entry.
- They must belong to the main menu entry of the package to ensure that
- the calculation of the dependencies between the packages is done in a
- correct manner.
-
-Managing External Runtime Dependencies
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Some packages are building all of their components and also installing
-them into the target’s sysroot. But only their *targetinstall* stage
-decides which parts are copied to the root filesystem. So, compiling and
-linking of our package will work, because everything required is found
-in the target’s sysroot.
-
-In our example there is a hidden dependency to the math library
-``libm``. Our new package was built successfully, because the linker was
-able to link our binaries against the ``libm`` from the toolchain. But
-in this case the ``libm`` must also be available in the target’s root
-filesystem to fulfill the run-time dependency: We have to force PTXdist to
-install ``libm``. ``libm`` is part of the *glibc* package, but is not
-installed by default (to keep the root filesystem small). So, it **does
-not** help to select the ``GLIBC`` symbol, to get a ``libm`` at run-time.
-
-The correct solution here is to add a ``select LIBC_M`` to our menu
-file. With all the additions above it now looks like:
-
-.. code-block:: kconfig
-
- ## SECTION=project_specific
-
- config FOO
- tristate
- select ZLIB if FOO_FOO
- select LIBXML2 if FOO_BAR
- select LIBC_M
- prompt "foo"
- help
- FIXME
-
- if FOO
- config FOO_DEBUG
- bool
- prompt "add debug noise"
-
- config FOO_FOO
- bool
- prompt "build foo"
-
- config FOO_BAR
- bool
- prompt "build bar"
-
- endif
-
-.. note:: There are other packages around, that do not install everything by
- default. If our new package needs something special, we must take a look
- into the menu of the other package how to force the required components
- to be installed and add the corresponding ``selects`` to our own menu
- file. In this case it does not help to enable the required parts in our
- project configuration, because this has no effect on the build order!
-
-Managing Plain Makefile Packages
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Many packages are still coming with a plain ``Makefile``. The user has
-to adapt it to make it work in a cross compile environment as well.
-PTXdist can also handle this kind of packages. We only have to specify
-a special *prepare* and *compile* stage.
-
-Such packages often have no special need for any kind of preparation. In
-this we must instruct PTXdist to do nothing in the *prepare* stage:
-
-.. code-block:: make
-
- FOO_CONF_TOOL := NO
-
-To compile the package, we can use ``make``\ ’s feature to overwrite
-variables used in the ``Makefile``. With this feature we can still use
-the original ``Makefile`` but with our own (cross compile) settings.
-
-Most of the time the generic compile rule can be used, only a few
-settings are required. For a well defined ``Makefile`` it is sufficient to
-set up the correct cross compile environment for the *compile* stage:
-
-.. code-block:: make
-
- FOO_MAKE_ENV := $(CROSS_ENV)
-
-``make`` will be called in this case with:
-
-``$(FOO_MAKE_ENV) $(MAKE) -C $(FOO_DIR) $(FOO_MAKE_OPT)``
-
-So, in the rule file only the two variables ``FOO_MAKE_ENV`` and
-``FOO_MAKE_OPT`` must be set, to forward the required settings to the
-package’s buildsystem. If the package cannot be built in parallel, we
-can also add the ``FOO_MAKE_PAR := NO``. ``YES`` is the default.
-
-Managing CMake/QMake/Meson Packages
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Building packages that use ``cmake``, ``qmake`` or ``meson`` is much like
-building packages with an autotools based buildsystem. We need to specify
-the configuration tool:
-
-.. code-block:: make
-
- FOO_CONF_TOOL := cmake
-
-or
-
-.. code-block:: make
-
- FOO_CONF_TOOL := qmake
-
-or respectively
-
-.. code-block:: make
-
- FOO_CONF_TOOL := meson
-
-And provide the correct configuration options. The syntax is different so
-PTXdist provides additional macros to simplify configurable features.
-For ``cmake`` the configuration options typically look like this:
-
-.. code-block:: make
-
- FOO_CONF_OPT := \
- $(CROSS_CMAKE_USR) \
- -DBUILD_TESTS:BOOL=OFF \
- -DENABLE_BAR:BOOL=$(call ptx/onoff, PTXCONF_FOO_BAR)
-
-For ``qmake`` the configuration options typically look like this:
-
-.. code-block:: make
-
- FOO_CONF_OPT := \
- $(CROSS_QMAKE_OPT) \
- PREFIX=/usr
-
-And for ``meson`` the configuration options typically look like this:
-
-.. code-block:: make
-
- FOO_CONF_OPT := \
- $(CROSS_MESON_USR) \
- -Dbar=$(call ptx/truefalse,PTXCONF_FOO_BAR)
-
-Please note that currently only host and target ``cmake``\/``meson`` packages
-and only target ``qmake`` packages are supported.
-
-Managing Python Packages
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-As with any other package, the correct configuration tool must be selected
-for Python packages:
-
-.. code-block:: make
-
- FOO_CONF_TOOL := python
-
-.. note:: For Python3 packages the value must be ``python3``.
-
-No Makefiles are used when building Python packages so the usual ``make``
-and ``make install`` for the *compile* and *install* stages cannot be used.
-PTXdist will call ``python setup.py build`` and ``python setup.py install``
-instead.
-
-.. note:: *FOO* is still the name of our example package. It must be
- replaced by the real package name.
-
-
-.. _patching_packages:
-
-Patching Packages
-~~~~~~~~~~~~~~~~~
-
-There can be various reasons why a package must be patched:
-
-- Package is broken for cross compile environments
-
-- Package is broken within a specific feature
-
-- Package is vulnerable and needs some fixes
-
-- or anything else (this case is the most common one)
-
-Ideally, those problems should be addressed in the original project,
-so any patches you add to your BSP or to PTXdist should also be submitted upstream.
-The upstream project can often provide better feedback, they can integrate your
-patch into a new release, and also maintain your changes as part of the project.
-This way we make sure that all advantages of the open source idea work for us;
-and your patch can be removed again later when a new release of the project is
-integrated into your BSP or into PTXdist.
-
-PTXdist handles patching automatically.
-After extracting the archive of a package, PTXdist checks for the existence of
-a patch directory named like its ``<PKG>_PATCHES`` variable, or, if this variable
-is not set, like its ``<PKG>`` variable.
-The patch directory is then searched in all locations listed by the
-``PTXDIST_PATH_PATCHES`` variable, and the first one found is used.
-Take an exemplary package ``foo`` with version ``1.1.0``:
-The variable ``FOO`` will have the value ``foo-1.1.0``, so PTXdist will look for
-a patch directory named ``foo-1.1.0`` in the following locations:
-
-#. the current layer:
-
- a. project (``./patches/foo-1.1.0``)
- b. platform (``./configs/|ptxdistPlatformConfigDir|/patches/foo-1.1.0``)
-
-#. any :ref:`base layers <layers-in-ptxdist>`,
- applying the same search order as above for each layer recursively
-
-#. ptxdist (``<ptxdist/installation/path>/patches/foo-1.1.0``)
-
-The patches from the first location found are used. Note: Due to this
-search order, a PTXdist project can replace global patches from the
-PTXdist installation. This can be useful if a project sticks to a
-specific PTXdist revision but fixes from a more recent revision of
-PTXdist should be used.
-
-PTXdist uses the utilities *git*, *patch* or *quilt* to work with
-patches or patch series. We recommend *git*, as it can manage patch
-series in a very easy way.
-
-Creating a Patch Series for a Package
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-To create a patch series for the first time, we can run the following
-steps. We are still using our *foo-1.1.0* example package here:
-
-Using Quilt
-"""""""""""
-
-We create a special directory for the patch series in the local project
-directory:
-
-.. code-block:: text
-
- $ mkdir -p patches/foo-1.1.0
-
-PTXdist expects a ``series`` file in the patch directory and at least
-one patch. Otherwise it fails. Due to the fact that we do not have any
-patch content yet, we’ll start with a dummy entry in the ``series`` file
-and an empty ``patch`` file.
-
-.. code-block:: text
-
- $ touch patches/foo-1.1.0/dummy
- $ echo dummy > patches/foo-1.1.0/series
-
-Next is to extract the package (if already done, we must remove it
-first):
-
-.. code-block:: text
-
- $ ptxdist extract foo
-
-This will extract the archive and create a symbolic link in the build
-directory pointing to our local patch directory. Working this way will
-ensure that we do not lose our created patches if we enter
-``ptxdist clean foo`` by accident. In our case the patches are still
-present in ``patches/foo-1.1.0`` and can be used the next time we
-extract the package again.
-
-All we have to do now is to do the modification we need to make the
-package work. We change into the build directory and use quilt_ to
-create new patches, add files to respective patches, modify these files
-and refresh the patches to save our changes.
-See the *quilt* documentation (``man 1 quilt``) for more information.
-
-.. note:: For patches that are intended for PTXdist upstream use the git
- workflow described below to get proper patch headers.
-
-.. _quilt: http://savannah.nongnu.org/projects/quilt
-
-Using Git
-"""""""""
-
-Create the patch directory like above for *quilt*,
-but only add an empty series file:
-
-.. code-block:: text
-
- $ mkdir -p patches/foo-1.1.0
- $ touch patches/foo-1.1.0/series
-
-Then extract the package with an additional command line switch:
-
-.. code-block:: text
-
- $ ptxdist --git extract foo
-
-The empty series file makes PTXdist create a Git repository in the
-respective package build directory,
-and import the package source as the first commit.
-
-.. note:: Optionally, you can enable the setting *Developer Options →
- use git to apply patches* in `ptxdist setup` to get this behaviour
- as a default for every package.
- However, note that this setting is meant for development only, and can lead
- to failures – some packages try to determine if they are being compiled from
- a Git source tree, and behave differently in that case.
-
-Then you can change into the package build directory
-(``platform-<name>/build-target/foo-1.1.0``),
-patch the required source files,
-and make Git commits on the way.
-The Git history should now look something like this:
-
-.. code-block:: text
-
- $ git log --oneline --decorate
- * df343e821851 (HEAD -> master) Makefile: don't build the tests
- * 65a360c2bd60 strfry.c: frobnicate the excusator
- * fdc315f6844c (tag: foobar-1.1.0, tag: base) initial commit
-
-Finally, call ``git ptx-patches`` to transform those Git commits into the patch
-series in the ``patches/foo-1.1.0`` folder.
-This way they don't get lost when cleaning the package.
-
-.. note:: PTXdist will only create a Git repository for packages with
- patches. To use Git to generate the first patch, create an empty series
- file ``patches/foobar-1.1.0/series`` before extracting the packages. This
- will tell PTXdist to use Git anyways and ``git ptx-patches`` will put the
- patches there.
-
-Both approaches (Git and quilt) are not suitable for modifying files
-that are autogenerated in autotools-based buildsystems.
-Refer to the section :ref:`configure_rebuild` on how PTXdist can
-handle this special task.
-
-Adding More Patches to a Package
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-If we want to add more patches to an already patched package, we can use
-nearly the same way as creating patches for the first time. But if the
-patch series comes from the PTXdist main installation, we do not have
-write permissions to these directories (do NEVER work on the main
-installation directories, NEVER, NEVER, NEVER). Due to the search order
-in which PTXdist searches for patches for a specific package, we can
-copy the global patch series to our local project directory. Now we have
-the permissions to add more patches or modify the existing ones. Also
-*quilt* and *git* are our friends here to manage the patch series.
-
-If we think that our new patches are valuable also for others, or they
-fix an error, it could be a good idea to send these patches to PTXdist
-mainline, and to the upstream project too.
-
-
-.. _configure_rebuild:
-
-Modifying Autotoolized Packages
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Autotoolized packages are very picky when automatically generated files
-get patched. The patch order is very important in this case and
-sometimes it even fails and nobody knows why.
-
-To improve a package’s autotools-based build system, PTXdist comes with
-its own project local autotools to regenerate the autotools template
-files, instead of patching them. With this feature, only the template
-files must be patched, the required ``configure`` script and the
-``Makefile.in`` files are regenerated in the final stages of the
-*prepare* step.
-
-This feature works like the regular patching mechanism. The only
-difference is the additional ``autogen.sh`` file in the patch directory.
-If it exists and has execution permissions, it will be called after the
-package was patched (while the *extract* stage is running).
-
-Its content depends on developer needs; for the most simple case the
-content can be:
-
-.. code-block:: bash
-
- #!/bin/bash
-
- aclocal $ACLOCAL_FLAGS
-
- libtoolize \
- --force \
- --copy
-
- autoreconf \
- --force \
- --install \
- --warnings=cross \
- --warnings=syntax \
- --warnings=obsolete \
- --warnings=unsupported
-
-.. note:: In this way not yet autotoolized package can be autotoolized. We
- just have to add the common autotool template files (``configure.ac``
- and ``Makefile.am`` for example) via a patch series to the package
- source and the ``autogen.sh`` to the patch directory.
diff --git a/doc/dev_advanced_rule_files.rst b/doc/dev_advanced_rule_files.rst
new file mode 100644
index 000000000..1aa246fe2
--- /dev/null
+++ b/doc/dev_advanced_rule_files.rst
@@ -0,0 +1,494 @@
+*******************
+Advanced Rule Files
+*******************
+
+The previous example on how to create a rule file sometimes works as
+shown above. But most of the time source archives are not that simple.
+In this section we want to give the user a more detailed selection how
+the package will be built.
+
+Adding Static Configure Parameters
+==================================
+
+The ``configure`` scripts of various source archives provide additional
+parameters to enable or disable features, or to configure them in a
+specific way.
+
+We assume the ``configure`` script of our ``foo`` example (refer to
+section :ref:`foo_example`) supports two additional parameters:
+
+- **--enable-debug**: Make the program more noisy. It’s disabled by
+ default.
+
+- **--with-bar**: Also build the special executable **bar**. Building
+ this executable is also disabled by default.
+
+We now want to forward these options to the ``configure`` script when it
+runs in the *prepare* stage. To do so, we must again open the rule file
+with our favourite editor and navigate to the *prepare* stage entry.
+
+PTXdist uses the variable ``FOO_CONF_OPT`` as the list of parameters to
+be given to ``configure``.
+
+Currently this variable is commented out and defined to:
+
+.. code-block:: make
+
+ # FOO_CONF_OPT := $(CROSS_AUTOCONF_USR)
+
+The variable ``CROSS_AUTOCONF_USR`` is predefined by PTXdist and
+contains all basic parameters to instruct ``configure`` to prepare for a
+**cross** compile environment.
+
+To use the two additional mentioned ``configure`` parameters, we comment
+in this line and supplement this expression as follows:
+
+.. code-block:: make
+
+ FOO_CONF_OPT := \
+ $(CROSS_AUTOCONF_USR) \
+ --enable-debug \
+ --with-bar
+
+.. note:: We recommend to use this format with each parameter on a line of
+ its own. This format is easier to read and a diff shows more exactly any
+ change.
+
+To do a fast check if this addition was successful, we run:
+
+.. code-block:: text
+
+ $ ptxdist print FOO_CONF_OPT
+ --prefix=/usr --sysconfdir=/etc --host=|ptxdistCompilerName| --build=i686-host-linux-gnu --enable-debug --with-bar
+
+.. note:: It depends on the currently selected platform and its architecture
+ what content this variable will have. The content shown above is an
+ example for a target.
+
+Or re-build the package with the new settings:
+
+.. code-block:: text
+
+ $ ptxdist drop foo prepare
+ $ ptxdist targetinstall foo
+
+Adding Dynamic Configure Parameters
+===================================
+
+Sometimes it makes sense to add this kind of parameters on demand only;
+especially a parameter like ``--enable-debug``. To let the user decide
+if this parameter is to be used or not, we must add a menu entry. So,
+let’s expand our menu. Here is its current content:
+
+.. code-block:: kconfig
+
+ ## SECTION=project_specific
+
+ config FOO
+ tristate
+ prompt "foo"
+ help
+ FIXME
+
+We’ll add two menu entries, one for each optional parameter we want to
+add on demand to the ``configure`` parameters:
+
+.. code-block:: kconfig
+
+ ## SECTION=project_specific
+
+ config FOO
+ tristate
+ prompt "foo"
+ help
+ FIXME
+
+ if FOO
+ config FOO_DEBUG
+ bool
+ prompt "add debug noise"
+
+ config FOO_BAR
+ bool
+ prompt "build bar"
+
+ endif
+
+.. important:: Always follow the rule to extend the base name by a suboption
+ name as the trailing part of the variable name. This gives PTXdist the ability
+ to detect a change in the package’s settings (via menuconfig) to force its
+ rebuild on demand.
+
+To make usage of the new menu entries, we must check them in the rule
+file and add the correct parameters:
+
+.. code-block:: make
+
+ #
+ # autoconf
+ #
+ FOO_CONF_OPT := \
+ $(CROSS_AUTOCONF_USR) \
+ --$(call ptx/endis, PTXCONF_FOO_DEBUG)-debug \
+ --$(call ptx/wwo, PTXCONF_FOO_BAR)-bar
+
+.. important:: Please note the leading ``PTXCONF_`` for each define. While Kconfig is
+ using ``FOO_BAR``, the rule file must use ``PTXCONF_FOO_BAR`` instead.
+
+.. note:: Refer :ref:`Rule File Macro Reference <param_macros>` for further
+ details about these special kind of option macros (e.g. ``ptx/...``).
+
+It is a good practice to always add both settings, e.g. ``--disable-debug``
+even if this is the default case. Sometimes ``configure`` tries to guess
+something and the binary result might differ depending on the build
+order. For example some kind of package would also build some X related
+tools, if X libraries are found. In this case it depends on the build
+order, if the X related tools are built or not. All the autocheck
+features are problematic here. So, if we do not want ``configure`` to
+guess its settings we **must disable everything we do not want**.
+
+To support this process, PTXdist supplies a helper script, located at
+``/path/to/ptxdist/scripts/configure-helper.py`` that compares the configure
+output with the settings from ``FOO_CONF_OPT``:
+
+.. code-block:: text
+
+ $ /opt/ptxdist-2017.06.0/scripts/configure-helper.py -p libsigrok
+ --- rules/libsigrok.make
+ +++ libsigrok-0.5.0
+ @@ -4,3 +4,74 @@
+ --libdir=/usr/lib
+ --build=x86_64-host-linux-gnu
+ --host=arm-v7a-linux-gnueabihf
+ + --enable-warnings=min|max|fatal|no
+ + --disable-largefile
+ + --enable-all-drivers
+ + --enable-agilent-dmm
+ [...]
+ + --enable-ruby
+ + --enable-java
+ + --without-libserialport
+ + --without-libftdi
+ + --without-libusb
+ + --without-librevisa
+ + --without-libgpib
+ + --without-libieee1284
+ + --with-jni-include-path=DIR-LIST
+
+In this example, many configure options from libsigrok (marked with ``+``)
+are not yet present in ``LIBSIGROK_CONF_OPT`` and must be added, possibly also
+by providing more dynamic options in the package definition.
+
+If some parts of a package are built on demand only, they must also be
+installed on demand only. Besides the *prepare* stage, we also must
+modify our *targetinstall* stage:
+
+.. code-block:: make
+
+ @$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/foo, /usr/bin/foo)
+
+ ifdef PTXCONF_FOO_BAR
+ @$(call install_copy, foo, 0, 0, 0755, $(FOO_DIR)/bar, /usr/bin/bar)
+ endif
+
+ @$(call install_finish, foo)
+ @$(call touch)
+
+Now we can play with our new menu entries and check if they are working
+as expected:
+
+.. code-block:: text
+
+ $ ptxdist menuconfig
+ $ ptxdist targetinstall foo
+
+Whenever we change a *FOO* related menu entry, PTXdist should detect it
+and re-build the package when a new build is started.
+
+.. _external_dependencies:
+
+Managing External Compile Time Dependencies
+===========================================
+
+While running the prepare stage, it could happen that it fails due to a
+missing external dependency.
+
+For example:
+
+.. code-block:: text
+
+ checking whether zlib exists....failed
+
+In this example, our new package depends on the compression library
+*zlib*. PTXdist comes with a target *zlib*. All we need to do in this
+case is to declare that our new package *foo* depends on *zlib*. This
+kind of dependency is managed in the menu file of our new package by
+simply adding the ``select ZLIB`` line. After this addition our menu
+file looks like:
+
+.. code-block:: kconfig
+
+ ## SECTION=project_specific
+
+ config FOO
+ tristate
+ select ZLIB
+ prompt "foo"
+ help
+ FIXME
+
+ if FOO
+ config FOO_DEBUG
+ bool
+ prompt "add debug noise"
+
+ config FOO_BAR
+ bool
+ prompt "build bar"
+
+ endif
+
+PTXdist now builds the *zlib* first and our new package thereafter.
+
+Refer :ref:`external_dependencies_variants` for more specific dependency
+description.
+
+Managing External Compile Time Dependencies on Demand
+=====================================================
+
+It is good practice to add only those dependencies that are really
+required for the current configuration of the package. If the package
+provides the features *foo* and *bar* and its ``configure`` provides
+switches to enable/disable them independently, we can also add
+dependencies on demand. Let’s assume feature *foo* needs the compression
+library *libz* and *bar* needs the XML2 library *libxml2*. These
+libraries are only required at run-time if the corresponding feature is
+enabled. To add these dependencies on demand, the menu file looks like:
+
+.. code-block:: kconfig
+
+ ## SECTION=project_specific
+
+ config FOO
+ tristate
+ select ZLIB if FOO_FOO
+ select LIBXML2 if FOO_BAR
+ prompt "foo"
+ help
+ FIXME
+
+ if FOO
+ config FOO_DEBUG
+ bool
+ prompt "add debug noise"
+
+ config FOO_FOO
+ bool
+ prompt "build foo"
+
+ config FOO_BAR
+ bool
+ prompt "build bar"
+
+ endif
+
+.. important:: Do not add these ``select`` statements to the corresponding menu entry.
+ They must belong to the main menu entry of the package to ensure that
+ the calculation of the dependencies between the packages is done in a
+ correct manner.
+
+Managing External Runtime Dependencies
+======================================
+
+Some packages are building all of their components and also installing
+them into the target’s sysroot. But only their *targetinstall* stage
+decides which parts are copied to the root filesystem. So, compiling and
+linking of our package will work, because everything required is found
+in the target’s sysroot.
+
+In our example there is a hidden dependency to the math library
+``libm``. Our new package was built successfully, because the linker was
+able to link our binaries against the ``libm`` from the toolchain. But
+in this case the ``libm`` must also be available in the target’s root
+filesystem to fulfill the run-time dependency: We have to force PTXdist to
+install ``libm``. ``libm`` is part of the *glibc* package, but is not
+installed by default (to keep the root filesystem small). So, it **does
+not** help to select the ``GLIBC`` symbol, to get a ``libm`` at run-time.
+
+The correct solution here is to add a ``select LIBC_M`` to our menu
+file. With all the additions above it now looks like:
+
+.. code-block:: kconfig
+
+ ## SECTION=project_specific
+
+ config FOO
+ tristate
+ select ZLIB if FOO_FOO
+ select LIBXML2 if FOO_BAR
+ select LIBC_M
+ prompt "foo"
+ help
+ FIXME
+
+ if FOO
+ config FOO_DEBUG
+ bool
+ prompt "add debug noise"
+
+ config FOO_FOO
+ bool
+ prompt "build foo"
+
+ config FOO_BAR
+ bool
+ prompt "build bar"
+
+ endif
+
+.. note:: There are other packages around, that do not install everything by
+ default. If our new package needs something special, we must take a look
+ into the menu of the other package how to force the required components
+ to be installed and add the corresponding ``selects`` to our own menu
+ file. In this case it does not help to enable the required parts in our
+ project configuration, because this has no effect on the build order!
+
+Managing Plain Makefile Packages
+================================
+
+Many packages are still coming with a plain ``Makefile``. The user has
+to adapt it to make it work in a cross compile environment as well.
+PTXdist can also handle this kind of packages. We only have to specify
+a special *prepare* and *compile* stage.
+
+Such packages often have no special need for any kind of preparation. In
+this we must instruct PTXdist to do nothing in the *prepare* stage:
+
+.. code-block:: make
+
+ FOO_CONF_TOOL := NO
+
+To compile the package, we can use ``make``\ ’s feature to overwrite
+variables used in the ``Makefile``. With this feature we can still use
+the original ``Makefile`` but with our own (cross compile) settings.
+
+Most of the time the generic compile rule can be used, only a few
+settings are required. For a well defined ``Makefile`` it is sufficient to
+set up the correct cross compile environment for the *compile* stage:
+
+.. code-block:: make
+
+ FOO_MAKE_ENV := $(CROSS_ENV)
+
+``make`` will be called in this case with:
+
+``$(FOO_MAKE_ENV) $(MAKE) -C $(FOO_DIR) $(FOO_MAKE_OPT)``
+
+So, in the rule file only the two variables ``FOO_MAKE_ENV`` and
+``FOO_MAKE_OPT`` must be set, to forward the required settings to the
+package’s buildsystem. If the package cannot be built in parallel, we
+can also add the ``FOO_MAKE_PAR := NO``. ``YES`` is the default.
+
+Managing CMake/QMake/Meson Packages
+===================================
+
+Building packages that use ``cmake``, ``qmake`` or ``meson`` is much like
+building packages with an autotools based buildsystem. We need to specify
+the configuration tool:
+
+.. code-block:: make
+
+ FOO_CONF_TOOL := cmake
+
+or
+
+.. code-block:: make
+
+ FOO_CONF_TOOL := qmake
+
+or respectively
+
+.. code-block:: make
+
+ FOO_CONF_TOOL := meson
+
+And provide the correct configuration options. The syntax is different so
+PTXdist provides additional macros to simplify configurable features.
+For ``cmake`` the configuration options typically look like this:
+
+.. code-block:: make
+
+ FOO_CONF_OPT := \
+ $(CROSS_CMAKE_USR) \
+ -DBUILD_TESTS:BOOL=OFF \
+ -DENABLE_BAR:BOOL=$(call ptx/onoff, PTXCONF_FOO_BAR)
+
+For ``qmake`` the configuration options typically look like this:
+
+.. code-block:: make
+
+ FOO_CONF_OPT := \
+ $(CROSS_QMAKE_OPT) \
+ PREFIX=/usr
+
+And for ``meson`` the configuration options typically look like this:
+
+.. code-block:: make
+
+ FOO_CONF_OPT := \
+ $(CROSS_MESON_USR) \
+ -Dbar=$(call ptx/truefalse,PTXCONF_FOO_BAR)
+
+Please note that currently only host and target ``cmake``\/``meson`` packages
+and only target ``qmake`` packages are supported.
+
+Managing Python Packages
+========================
+
+As with any other package, the correct configuration tool must be selected
+for Python packages:
+
+.. code-block:: make
+
+ FOO_CONF_TOOL := python
+
+.. note:: For Python3 packages the value must be ``python3``.
+
+No Makefiles are used when building Python packages so the usual ``make``
+and ``make install`` for the *compile* and *install* stages cannot be used.
+PTXdist will call ``python setup.py build`` and ``python setup.py install``
+instead.
+
+.. note:: *FOO* is still the name of our example package. It must be
+ replaced by the real package name.
+
+Managing Cargo Packages
+=======================
+
+As with any other package, the correct configuration tool must be selected
+for Cargo packages:
+
+.. code-block:: make
+
+ FOO_CONF_TOOL := cargo
+
+Additional *cargo* options can be added to the compile options like this:
+
+.. code-block:: make
+
+ FOO_MAKE_OPT := \
+ $(CROSS_CARGO_OPT) \
+ --features ...
+
+Cargo wants to manage its own dependencies. PTXdist wants to manage all
+downloads. To make this work, PTXdist must be aware of all cargo
+dependencies. To make this possible, the package must contain a
+``Cargo.lock`` file.
+For new packages or whenever the ``Cargo.lock`` file changes, ``ptxdist
+cargosync foo`` must be called. This creates (or updates)
+``foo.cargo.make``. It is placed in the same directory as ``foo.make``.
+This introduces all dependencies from ``Cargo.lock`` as additional sources
+for the package.
+Finally, PTXdist builds all cargo packages with ``--frozen`` to ensure that
+the exact same versions are used and nothing is downloaded in the compile
+stage.
diff --git a/doc/dev_code_signing.rst b/doc/dev_code_signing.rst
index 56ac0e3b3..1e7759abe 100644
--- a/doc/dev_code_signing.rst
+++ b/doc/dev_code_signing.rst
@@ -10,6 +10,10 @@ This is also essential when a verified boot chain is established, e.g. via
*High Assurance Boot* (HAB), signed FIT images, and a verified root file
system.
+.. image:: dev_code_signing_flowchart.svg
+
+On the one side, **code signing consumers** are PTXdist recipes that want to
+make use of key material, e.g. for signing kernel modules or disk images.
PTXdist uses `PKCS#11 <pkcs11-doc_>`_ internally to provide access to keys and
certificates, therefore code signing consumers should implement a PKCS#11
interface to make use of PTXdist's code signing infrastructure.
@@ -19,6 +23,11 @@ development) the URIs are usually not hardcoded in the package configuration.
Instead, PTXdist has the idea of **roles** which are string identifiers used to
access a single private/public key pair and a certificate.
+Roles can be grouped into **role groups**.
+Role groups should be used where more than one role is needed, but the exact
+names and/or number of roles depend on the concrete code signing provider.
+For example, an i.MX HABv4 fuse table can contain up to four keys.
+
Finally, one or several **code signing providers** supply the mapping from
roles to the respective key material or even provide it themselves for
development.
@@ -93,7 +102,7 @@ like this:
ifdef PTXCONF_CODE_SIGNING_PROVIDER_<NAME>
CODE_SIGNING_ENV += \
- PKCS11_MODULE_PATH="${PTXDIST_SYSROOT_HOST}/lib/pkcs11/opensc-pkcs11.so"
+ PKCS11_MODULE_PATH="${PTXDIST_SYSROOT_HOST}/usr/lib/pkcs11/opensc-pkcs11.so"
endif
Note that the module is built in the BSP in this case.
diff --git a/doc/dev_code_signing_flowchart.svg b/doc/dev_code_signing_flowchart.svg
new file mode 100644
index 000000000..e7aaa6bb7
--- /dev/null
+++ b/doc/dev_code_signing_flowchart.svg
@@ -0,0 +1,1977 @@
+<?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"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="552.84961"
+ height="381.23526"
+ viewBox="0 0 146.27481 100.86849"
+ version="1.1"
+ id="svg1889">
+ <defs
+ id="defs1883">
+ <marker
+ style="overflow:visible"
+ id="marker7252"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path7250" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker7242"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(-0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path7240" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6797"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path6795" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6787"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(-0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path6785" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker5387"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path5385" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker4973"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path4971" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker4963"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(-0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path4961" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker3475"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path3473" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker7027"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(-0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path7025" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker7007"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(-0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path7005" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6717"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6715" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6707"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6705" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6697"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6695" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6687"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6685" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6443"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6441" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6423"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6421" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker6413"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path6411" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2Mstart"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1103" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Sstart"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1091" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker4268"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#002a42;fill-opacity:1;fill-rule:evenodd;stroke:#002a42;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path4266" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker4188"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#002a42;fill-opacity:1;fill-rule:evenodd;stroke:#002a42;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path4186" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker4140"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="scale(0.4)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path4138" />
+ </marker>
+ <linearGradient
+ id="linearGradient14132-6">
+ <stop
+ style="stop-color:#b98309"
+ offset="0"
+ id="stop14134-2" />
+ <stop
+ style="stop-color:#382605"
+ offset="1"
+ id="stop14136-2" />
+ </linearGradient>
+ <filter
+ id="filter14148-8"
+ x="-0.10750898"
+ width="1.215018"
+ y="-0.10849553"
+ height="1.2169911"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="3.9237191"
+ id="feGaussianBlur14150-8" />
+ </filter>
+ <filter
+ id="filter14140-3"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="2.4365744"
+ id="feGaussianBlur14142-5" />
+ </filter>
+ <linearGradient
+ id="linearGradient14168-5">
+ <stop
+ style="stop-color:#ebc40c"
+ offset="0"
+ id="stop14170-8" />
+ <stop
+ style="stop-color:#ebc40c;stop-opacity:0"
+ offset="1"
+ id="stop14172-0" />
+ </linearGradient>
+ <filter
+ id="filter14176-5"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.3702557"
+ id="feGaussianBlur14178-0" />
+ </filter>
+ <filter
+ id="filter15053-7"
+ x="-0.10103524"
+ width="1.2020705"
+ y="-0.042669769"
+ height="1.0853395"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="1.1322032"
+ id="feGaussianBlur15055-3" />
+ </filter>
+ <linearGradient
+ id="linearGradient14830-4">
+ <stop
+ id="stop14832-6"
+ offset="0"
+ style="stop-color:#7c7c7c" />
+ <stop
+ id="stop14834-5"
+ offset="1"
+ style="stop-color:#7c7c7c;stop-opacity:0.32941177" />
+ </linearGradient>
+ <filter
+ id="filter14812-5"
+ x="-0.070455663"
+ width="1.1409113"
+ y="-0.15060219"
+ height="1.3012044"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="1.0252435"
+ id="feGaussianBlur14814-2" />
+ </filter>
+ <filter
+ id="filter14812-0-9"
+ x="-0.070455663"
+ width="1.1409113"
+ y="-0.15060219"
+ height="1.3012044"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="1.0252435"
+ id="feGaussianBlur14814-6-7" />
+ </filter>
+ <linearGradient
+ id="linearGradient14518-6">
+ <stop
+ id="stop14540-0"
+ offset="0"
+ style="stop-color:#110800" />
+ <stop
+ style="stop-color:#a65a00;stop-opacity:0.80000001"
+ offset="0.59066743"
+ id="stop14542-5" />
+ <stop
+ style="stop-color:#ff921e;stop-opacity:0"
+ offset="1"
+ id="stop14522-4" />
+ </linearGradient>
+ <filter
+ id="filter14897-2"
+ x="-0.20050517"
+ width="1.4010103"
+ y="-0.23409025"
+ height="1.4681805"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="2.8444356"
+ id="feGaussianBlur14899-5" />
+ </filter>
+ <filter
+ id="filter14951-8"
+ x="-0.091410659"
+ width="1.1828213"
+ y="-0.10672215"
+ height="1.2134444"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="1.2967831"
+ id="feGaussianBlur14953-7" />
+ </filter>
+ <filter
+ id="filter15211-9"
+ x="-0.46932927"
+ width="1.9386586"
+ y="-0.27372435"
+ height="1.5474488"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.85991809"
+ id="feGaussianBlur15213-7" />
+ </filter>
+ <filter
+ id="filter14706-3"
+ x="-0.60389674"
+ width="2.2077935"
+ y="-0.48226368"
+ height="1.9645272"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="2.6400036"
+ id="feGaussianBlur14708-8" />
+ </filter>
+ <linearGradient
+ id="linearGradient15103-0">
+ <stop
+ style="stop-color:#000000"
+ offset="0"
+ id="stop15105-1" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop15107-6" />
+ </linearGradient>
+ <filter
+ id="filter15115-3"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="2.2091576"
+ id="feGaussianBlur15117-8" />
+ </filter>
+ <linearGradient
+ id="linearGradient14392-8">
+ <stop
+ style="stop-color:#3e2a06"
+ offset="0"
+ id="stop14394-3" />
+ <stop
+ style="stop-color:#ad780a"
+ offset="1"
+ id="stop14396-0" />
+ </linearGradient>
+ <filter
+ id="filter14416-8"
+ x="-0.14501533"
+ width="1.2900307"
+ y="-0.14299878"
+ height="1.2859976"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="4.7787162"
+ id="feGaussianBlur14418-5" />
+ </filter>
+ <filter
+ id="filter14432-2"
+ x="-0.11529266"
+ width="1.2305853"
+ y="-0.12494507"
+ height="1.2498901"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="3.1725155"
+ id="feGaussianBlur14434-2" />
+ </filter>
+ <linearGradient
+ id="linearGradient17009">
+ <stop
+ style="stop-color:#f3cd0c"
+ offset="0"
+ id="stop17011" />
+ <stop
+ style="stop-color:#f3cd0c;stop-opacity:0"
+ offset="1"
+ id="stop17013" />
+ </linearGradient>
+ <filter
+ id="filter17044"
+ x="-0.020911871"
+ width="1.0418237"
+ y="-0.12926871"
+ height="1.2585374"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.47946431"
+ id="feGaussianBlur17046" />
+ </filter>
+ <filter
+ id="filter15185-2"
+ x="-0.17754583"
+ width="1.3550917"
+ y="-0.15942827"
+ height="1.3188565"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.90083196"
+ id="feGaussianBlur15187-7" />
+ </filter>
+ <filter
+ height="1.1156476"
+ y="-0.057823781"
+ width="2.6331918"
+ x="-0.81659585"
+ id="filter4592-2"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur4594-6"
+ stdDeviation="1.4463082" />
+ </filter>
+ <linearGradient
+ id="linearGradient4417-0">
+ <stop
+ id="stop4419-4-4"
+ offset="0"
+ style="stop-color:#000000" />
+ <stop
+ id="stop4421-2-0"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0.24886878" />
+ </linearGradient>
+ <filter
+ id="filter4538-7"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur4540-9"
+ stdDeviation="0.7854602" />
+ </filter>
+ <filter
+ id="filter4427-5-7"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur4429-4-8"
+ stdDeviation="1.1383167" />
+ </filter>
+ <filter
+ id="filter4487-6"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur4489-4"
+ stdDeviation="0.6434074" />
+ </filter>
+ <filter
+ id="filter14666-9"
+ x="-0.11753157"
+ width="1.2350631"
+ y="-0.040046327"
+ height="1.0800927"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="1.352085"
+ id="feGaussianBlur14668-7" />
+ </filter>
+ <linearGradient
+ id="linearGradient29652-2">
+ <stop
+ style="stop-color:#c8c8c8"
+ offset="0"
+ id="stop29654-6" />
+ <stop
+ style="stop-color:#797978"
+ offset="1"
+ id="stop29656-1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient28469-0">
+ <stop
+ style="stop-color:#d2940a"
+ offset="0"
+ id="stop28479-4" />
+ <stop
+ style="stop-color:#d89c08"
+ offset="0.75143719"
+ id="stop28477-2" />
+ <stop
+ id="stop28485-7"
+ offset="0.86579126"
+ style="stop-color:#b67e07" />
+ <stop
+ id="stop28473-1"
+ offset="1"
+ style="stop-color:#946106" />
+ </linearGradient>
+ <filter
+ height="1.429882"
+ y="-0.21494099"
+ width="1.3096611"
+ x="-0.1548306"
+ id="filter28502-8"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur28504-3"
+ stdDeviation="0.89858666" />
+ </filter>
+ <filter
+ id="filter15145-6"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.75821369"
+ id="feGaussianBlur15147-1" />
+ </filter>
+ <linearGradient
+ id="linearGradient28275-8">
+ <stop
+ id="stop28277-1"
+ offset="0"
+ style="stop-color:#ad780a" />
+ <stop
+ style="stop-color:#d89e08"
+ offset="0.11972899"
+ id="stop28291-9" />
+ <stop
+ style="stop-color:#edb80b"
+ offset="0.25514477"
+ id="stop28289-6" />
+ <stop
+ style="stop-color:#ebc80d"
+ offset="0.39194193"
+ id="stop28287-6" />
+ <stop
+ style="stop-color:#f5d838"
+ offset="0.52741116"
+ id="stop28285-7" />
+ <stop
+ style="stop-color:#f6d811"
+ offset="0.76906693"
+ id="stop28283-7" />
+ <stop
+ id="stop28279-5"
+ offset="1"
+ style="stop-color:#f5cd31" />
+ </linearGradient>
+ <filter
+ id="filter14963-7"
+ x="-0.16095592"
+ width="1.3219118"
+ y="-0.13027605"
+ height="1.260552"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.84878819"
+ id="feGaussianBlur14965-0" />
+ </filter>
+ <linearGradient
+ id="linearGradient29529-6">
+ <stop
+ id="stop29531-0"
+ offset="0"
+ style="stop-color:#3a2903" />
+ <stop
+ style="stop-color:#735208"
+ offset="0.55472803"
+ id="stop29539-7" />
+ <stop
+ id="stop29533-8"
+ offset="1"
+ style="stop-color:#ac8c04" />
+ </linearGradient>
+ <filter
+ id="filter15177-1"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.11039302"
+ id="feGaussianBlur15179-3" />
+ </filter>
+ <filter
+ id="filter15173-0"
+ x="-0.11644644"
+ width="1.2328929"
+ y="-0.10572958"
+ height="1.2114592"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="0.11039302"
+ id="feGaussianBlur15175-4" />
+ </filter>
+ <linearGradient
+ id="linearGradient28572-7">
+ <stop
+ id="stop28574-5"
+ offset="0"
+ style="stop-color:#f5ce2d" />
+ <stop
+ id="stop28576-0"
+ offset="1"
+ style="stop-color:#d79b08" />
+ </linearGradient>
+ <filter
+ height="1.2722148"
+ y="-0.13610739"
+ width="1.2146032"
+ x="-0.10730159"
+ id="filter28584-4"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur28586-3"
+ stdDeviation="0.2640625" />
+ </filter>
+ <linearGradient
+ id="linearGradient29477-3">
+ <stop
+ id="stop29479-5"
+ offset="0"
+ style="stop-color:#757574;stop-opacity:0" />
+ <stop
+ style="stop-color:#757574"
+ offset="0.26291031"
+ id="stop29487-5" />
+ <stop
+ style="stop-color:#757574"
+ offset="0.5"
+ id="stop29485-0" />
+ <stop
+ id="stop29481-3"
+ offset="1"
+ style="stop-color:#757574;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ height="1.2921369"
+ y="-0.14606842"
+ width="1.4689326"
+ x="-0.23446631"
+ id="filter29493-2"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur29495-7"
+ stdDeviation="0.51262416" />
+ </filter>
+ <linearGradient
+ id="linearGradient29336-6">
+ <stop
+ id="stop29338-1"
+ offset="0"
+ style="stop-color:#646464;stop-opacity:0" />
+ <stop
+ style="stop-color:#646464;stop-opacity:0.5825243"
+ offset="0.30628255"
+ id="stop29344-7" />
+ <stop
+ id="stop29354-5"
+ offset="0.47000006"
+ style="stop-color:#646464" />
+ <stop
+ style="stop-color:#646464;stop-opacity:0.25728154"
+ offset="0.72834015"
+ id="stop29356-3" />
+ <stop
+ id="stop29340-6"
+ offset="1"
+ style="stop-color:#646464;stop-opacity:0" />
+ </linearGradient>
+ <filter
+ id="filter29447-1"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur29449-4"
+ stdDeviation="0.13475369" />
+ </filter>
+ <filter
+ id="filter29350-1"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur29352-7"
+ stdDeviation="0.1475" />
+ </filter>
+ <linearGradient
+ id="linearGradient28976-3">
+ <stop
+ id="stop28978-7"
+ offset="0"
+ style="stop-color:#747474" />
+ <stop
+ style="stop-color:#8c8c8c"
+ offset="0.125"
+ id="stop29259-5" />
+ <stop
+ style="stop-color:#a4a4a4"
+ offset="0.25"
+ id="stop29257-0" />
+ <stop
+ style="stop-color:#d4d4d4"
+ offset="0.5"
+ id="stop28984-4" />
+ <stop
+ id="stop28986-0"
+ offset="0.61919296"
+ style="stop-color:#d4d4d4" />
+ <stop
+ id="stop28980-2"
+ offset="1"
+ style="stop-color:#7c7c7c" />
+ </linearGradient>
+ <filter
+ height="1.4183974"
+ y="-0.2091987"
+ width="1.3159075"
+ x="-0.15795375"
+ id="filter28927-8"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur28929-2"
+ stdDeviation="0.24891089" />
+ </filter>
+ <linearGradient
+ id="linearGradient28935-8">
+ <stop
+ id="stop28937-7"
+ offset="0"
+ style="stop-color:#949494;stop-opacity:0.39215687" />
+ <stop
+ style="stop-color:#949494"
+ offset="0.5"
+ id="stop28943-3" />
+ <stop
+ id="stop28939-8"
+ offset="1"
+ style="stop-color:#949494;stop-opacity:0.39215687" />
+ </linearGradient>
+ <filter
+ height="1.3626815"
+ y="-0.18134074"
+ width="1.3573579"
+ x="-0.17867894"
+ id="filter28949-8"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur28951-1"
+ stdDeviation="0.51947927" />
+ </filter>
+ <filter
+ id="filter15133-1"
+ x="-0.2921797"
+ width="1.5843594"
+ y="-0.30825046"
+ height="1.6165009"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ stdDeviation="1.7403319"
+ id="feGaussianBlur15135-5" />
+ </filter>
+ <linearGradient
+ id="linearGradient28853-5">
+ <stop
+ id="stop28855-3"
+ offset="0"
+ style="stop-color:#020204" />
+ <stop
+ style="stop-color:#020204"
+ offset="0.73448181"
+ id="stop28865-0" />
+ <stop
+ id="stop28857-9"
+ offset="1"
+ style="stop-color:#5c5c5c" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient28799-3">
+ <stop
+ id="stop28801-6"
+ offset="0"
+ style="stop-color:#fefefc" />
+ <stop
+ style="stop-color:#fefefc"
+ offset="0.75733864"
+ id="stop28807-7" />
+ <stop
+ id="stop28803-0"
+ offset="1"
+ style="stop-color:#d4d4d4" />
+ </linearGradient>
+ <filter
+ id="filter30475-4"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur30477-9"
+ stdDeviation="0.93152507" />
+ </filter>
+ <filter
+ height="1.2583811"
+ y="-0.12919053"
+ width="1.1527554"
+ x="-0.07637769"
+ id="filter30479-2"
+ style="color-interpolation-filters:sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur30481-9"
+ stdDeviation="2.0355046" />
+ </filter>
+ <radialGradient
+ xlink:href="#linearGradient28799-3"
+ id="radialGradient18806"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.3678445,-0.14174542,0.12232724,5.1555606,-4050.2842,-3651.9091)"
+ cx="223.19559"
+ cy="137.66095"
+ fx="223.19559"
+ fy="137.66095"
+ r="14.572236" />
+ <radialGradient
+ xlink:href="#linearGradient28799-3"
+ id="radialGradient18808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.4854583,-0.14174542,0.16292135,5.1555606,-4153.9928,-3651.9091)"
+ cx="223.19559"
+ cy="137.66095"
+ fx="223.19559"
+ fy="137.66095"
+ r="14.572236" />
+ <radialGradient
+ xlink:href="#linearGradient28853-5"
+ id="radialGradient18810"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.8828667,-2.095182,1.9017128,2.6166623,-4309.1569,-2748.9641)"
+ cx="275.53763"
+ cy="150.65126"
+ fx="275.53763"
+ fy="150.65126"
+ r="15.382211" />
+ <linearGradient
+ xlink:href="#linearGradient28935-8"
+ id="linearGradient18812"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-3872.2972,-3591.6209)"
+ x1="213.01591"
+ y1="132.76981"
+ x2="219.73343"
+ y2="140.72476" />
+ <linearGradient
+ xlink:href="#linearGradient28976-3"
+ id="linearGradient18814"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4469.3396,-3533.2586)"
+ x1="337.25"
+ y1="119.98718"
+ x2="358.625"
+ y2="132.48718" />
+ <linearGradient
+ xlink:href="#linearGradient29336-6"
+ id="linearGradient18816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4362.7847,-3534.2586)"
+ x1="294.50998"
+ y1="114.56181"
+ x2="308.74051"
+ y2="127.99684" />
+ <linearGradient
+ xlink:href="#linearGradient29336-6"
+ id="linearGradient18818"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4362.7847,-3534.2586)"
+ x1="253.22745"
+ y1="115.66637"
+ x2="266.62701"
+ y2="128.57106" />
+ <linearGradient
+ xlink:href="#linearGradient29477-3"
+ id="linearGradient18820"
+ gradientUnits="userSpaceOnUse"
+ x1="164.04878"
+ y1="132.06271"
+ x2="169.8824"
+ y2="142.49252"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-3830.9862,-3591.6209)" />
+ <radialGradient
+ xlink:href="#linearGradient28469-0"
+ id="radialGradient18822"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.8674771,-1.5962723,1.1208968,2.7157292,-4446.5165,-2927.1324)"
+ cx="294.48483"
+ cy="193.09949"
+ fx="294.48483"
+ fy="193.09949"
+ r="31.111488" />
+ <linearGradient
+ xlink:href="#linearGradient28275-8"
+ id="linearGradient18824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4304.0956,-3533.2586)"
+ x1="256.85657"
+ y1="158.31404"
+ x2="313.3367"
+ y2="157.8721" />
+ <radialGradient
+ xlink:href="#linearGradient29529-6"
+ id="radialGradient18826"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.131097,0,0,2.409777,-3376.5661,-3337.9047)"
+ cx="77.67215"
+ cy="147.09335"
+ fx="77.67215"
+ fy="147.09335"
+ r="3.2300935" />
+ <radialGradient
+ xlink:href="#linearGradient29529-6"
+ id="radialGradient18828"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.4414189,-3376.5659,-3637.4522)"
+ cx="63.125401"
+ cy="147.44128"
+ fx="63.125401"
+ fy="147.44128"
+ r="1.5350333" />
+ <linearGradient
+ xlink:href="#linearGradient28572-7"
+ id="linearGradient18830"
+ gradientUnits="userSpaceOnUse"
+ x1="243.03125"
+ y1="157.01843"
+ x2="243.46875"
+ y2="159.76843"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-3913.8041,-2496.738)" />
+ <radialGradient
+ xlink:href="#linearGradient29652-2"
+ id="radialGradient18832"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83204988,-0.13699038,0.12661832,0.76905233,-3449.4809,-3062.1657)"
+ cx="268.06998"
+ cy="126.53491"
+ fx="268.06998"
+ fy="126.53491"
+ r="35.51144" />
+ <radialGradient
+ xlink:href="#linearGradient4417-0"
+ id="radialGradient18834"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.8853315,0,0,3.1535055,-2001.7189,-3325.7952)"
+ cx="336.22372"
+ cy="220.53755"
+ fx="336.22372"
+ fy="220.53755"
+ r="27.391165" />
+ <radialGradient
+ xlink:href="#linearGradient4417-0"
+ id="radialGradient18836"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,3.1535055,-4244.096,-3384.1575)"
+ cx="312.14502"
+ cy="236.36569"
+ fx="312.14502"
+ fy="236.36569"
+ r="27.391165" />
+ <radialGradient
+ xlink:href="#linearGradient4417-0"
+ id="radialGradient18838"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.4171109,-4244.096,-3653.0102)"
+ cx="275.55389"
+ cy="225.13487"
+ fx="275.55389"
+ fy="225.13487"
+ r="10.84542" />
+ <linearGradient
+ xlink:href="#linearGradient15103-0"
+ id="linearGradient18840"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4329.3811,-3533.2586)"
+ x1="338.28552"
+ y1="323.90076"
+ x2="341.98224"
+ y2="351.48654" />
+ <linearGradient
+ xlink:href="#linearGradient14392-8"
+ id="linearGradient18842"
+ gradientUnits="userSpaceOnUse"
+ x1="442.03912"
+ y1="371.54401"
+ x2="490.12241"
+ y2="293.58548"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4657.205,-3591.6209)" />
+ <linearGradient
+ xlink:href="#linearGradient17009"
+ id="linearGradient18844"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4244.096,-3599.8828)"
+ x1="355.16373"
+ y1="289.58905"
+ x2="353.74951"
+ y2="302.31699" />
+ <radialGradient
+ xlink:href="#linearGradient14518-6"
+ id="radialGradient18846"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(5.40433,1.4480851,-1.5200531,5.6729179,-4246.2002,-4584.5264)"
+ cx="363.33957"
+ cy="303.41541"
+ fx="363.33957"
+ fy="303.41541"
+ r="16.845654" />
+ <radialGradient
+ xlink:href="#linearGradient14518-6"
+ id="radialGradient18848"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(5.40433,1.4480851,-1.5200531,5.6729179,-4406.1997,-5539.2375)"
+ cx="363.33957"
+ cy="303.41541"
+ fx="363.33957"
+ fy="303.41541"
+ r="16.845654" />
+ <radialGradient
+ xlink:href="#linearGradient14830-4"
+ id="radialGradient18850"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4882364,0.64777425,-0.29937164,0.68779495,-3017.4627,-2781.6546)"
+ cx="382.23483"
+ cy="246.85757"
+ fx="382.23483"
+ fy="246.85757"
+ r="20.537666" />
+ <linearGradient
+ xlink:href="#linearGradient14830-4"
+ id="linearGradient18852"
+ gradientUnits="userSpaceOnUse"
+ x1="358.5"
+ y1="279.36218"
+ x2="361.5"
+ y2="279.23718"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-4094.0958,-3533.2586)" />
+ <linearGradient
+ xlink:href="#linearGradient14132-6"
+ id="linearGradient18854"
+ gradientUnits="userSpaceOnUse"
+ x1="123.13397"
+ y1="301.54044"
+ x2="170.86368"
+ y2="381.62027"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-3954.9192,-3591.6209)" />
+ <linearGradient
+ xlink:href="#linearGradient14168-5"
+ id="linearGradient18856"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.1310954,0,0,4.1310954,-3957.1101,-3598.9236)"
+ x1="171.57079"
+ y1="323.99109"
+ x2="186.5968"
+ y2="352.27536" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath391">
+ <path
+ id="path393"
+ d="m 137.57703,281.0191 c 1.59929,-0.66295 3.3982,-0.78361 5.10074,-0.46963 1.70253,0.31398 3.31141,1.04948 4.74342,2.02239 2.86402,1.94583 4.98821,4.77774 7.02263,7.57952 4.67189,6.43406 9.16868,13.00227 13.24488,19.8293 3.30635,5.53766 6.34352,11.25685 10.16415,16.45304 2.49398,3.3919 5.3066,6.53947 7.813,9.92221 2.50639,3.38273 4.72794,7.05586 5.83931,11.11662 1.44411,5.27653 0.88463,11.09291 -1.62666,15.95302 -1.76663,3.41896 -4.47646,6.35228 -7.77242,8.33898 -3.29595,1.9867 -7.17064,3.01444 -11.01635,2.87021 -6.11413,-0.2293 -11.69944,-3.28515 -17.38362,-5.54906 -11.58097,-4.6125 -24.15978,-6.0594 -36.09666,-9.65174 -3.66859,-1.10404 -7.27582,-2.4107 -10.96988,-3.42629 -1.64125,-0.45122 -3.30866,-0.8482 -4.85875,-1.55144 -1.55008,-0.70325 -2.999548,-1.7491 -3.86171,-3.21675 -0.666391,-1.13439 -0.948386,-2.47002 -0.930187,-3.78554 0.0182,-1.31552 0.325889,-2.61453 0.773815,-3.85158 0.895851,-2.47409 2.343262,-4.71374 3.320162,-7.15696 1.59511,-3.98935 1.88169,-8.38839 1.66657,-12.67942 -0.21511,-4.29103 -0.91078,-8.54478 -1.20454,-12.83115 -0.13118,-1.91406 -0.18066,-3.85256 0.18479,-5.73598 0.36545,-1.88343 1.17577,-3.72459 2.55771,-5.05541 1.27406,-1.22693 2.96492,-1.95531 4.69643,-2.31651 1.73151,-0.3612 3.51533,-0.37747 5.28367,-0.33762 1.76833,0.0399 3.54067,0.13425 5.30351,-0.0106 1.76284,-0.14488 3.53347,-0.54055 5.06911,-1.41828 1.45996,-0.83447 2.65433,-2.0745 3.64374,-3.43424 0.9894,-1.35974 1.78909,-2.84573 2.60891,-4.31396 0.81983,-1.46823 1.66834,-2.93151 2.74157,-4.22611 1.07324,-1.2946 2.38923,-2.42304 3.94266,-3.06698"
+ style="fill:url(#linearGradient395)"
+ transform="matrix(1,0,0,1.0182804,0,-4.0313444)" />
+ </clipPath>
+ <linearGradient
+ xlink:href="#linearGradient14132-6"
+ id="linearGradient395"
+ gradientUnits="userSpaceOnUse"
+ x1="123.13397"
+ y1="301.54044"
+ x2="170.86368"
+ y2="381.62027" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath401">
+ <path
+ transform="translate(-240.00015,-1)"
+ style="fill:url(#linearGradient395)"
+ d="m 137.57703,281.0191 c 1.59929,-0.66295 3.3982,-0.78361 5.10074,-0.46963 1.70253,0.31398 3.31141,1.04948 4.74342,2.02239 2.86402,1.94583 4.98821,4.77774 7.02263,7.57952 4.67189,6.43406 9.16868,13.00227 13.24488,19.8293 3.30635,5.53766 6.34352,11.25685 10.16415,16.45304 2.49398,3.3919 5.3066,6.53947 7.813,9.92221 2.50639,3.38273 4.72794,7.05586 5.83931,11.11662 1.44411,5.27653 0.88463,11.09291 -1.62666,15.95302 -1.76663,3.41896 -4.47646,6.35228 -7.77242,8.33898 -3.29595,1.9867 -7.17064,3.01444 -11.01635,2.87021 -6.11413,-0.2293 -11.69944,-3.28515 -17.38362,-5.54906 -11.58097,-4.6125 -24.15978,-6.0594 -36.09666,-9.65174 -3.66859,-1.10404 -7.27582,-2.4107 -10.96988,-3.42629 -1.64125,-0.45122 -3.30866,-0.8482 -4.85875,-1.55144 -1.55008,-0.70325 -2.999548,-1.7491 -3.86171,-3.21675 -0.666391,-1.13439 -0.948386,-2.47002 -0.930187,-3.78554 0.0182,-1.31552 0.325889,-2.61453 0.773815,-3.85158 0.895851,-2.47409 2.343262,-4.71374 3.320162,-7.15696 1.59511,-3.98935 1.88169,-8.38839 1.66657,-12.67942 -0.21511,-4.29103 -0.91078,-8.54478 -1.20454,-12.83115 -0.13118,-1.91406 -0.18066,-3.85256 0.18479,-5.73598 0.36545,-1.88343 1.17577,-3.72459 2.55771,-5.05541 1.27406,-1.22693 2.96492,-1.95531 4.69643,-2.31651 1.73151,-0.3612 3.51533,-0.37747 5.28367,-0.33762 1.76833,0.0399 3.54067,0.13425 5.30351,-0.0106 1.76284,-0.14488 3.53347,-0.54055 5.06911,-1.41828 1.45996,-0.83447 2.65433,-2.0745 3.64374,-3.43424 0.9894,-1.35974 1.78909,-2.84573 2.60891,-4.31396 0.81983,-1.46823 1.66834,-2.93151 2.74157,-4.22611 1.07324,-1.2946 2.38923,-2.42304 3.94266,-3.06698"
+ id="path403" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath419">
+ <path
+ style="fill:url(#linearGradient423)"
+ d="m 513.18983,336.61385 c -2.6238,3.11482 -6.268,5.17039 -9.89648,7.01985 -6.1886,3.15437 -12.60169,5.92177 -18.41964,9.71654 -3.89802,2.54249 -7.4959,5.52671 -10.86016,8.74238 -2.87719,2.75012 -5.60582,5.68745 -8.83247,8.01771 -3.25567,2.35122 -7.01915,4.05426 -10.99061,4.6502 -4.83026,0.72481 -9.82134,-0.21289 -14.29898,-2.16416 -3.13754,-1.36728 -6.15569,-3.3229 -7.96301,-6.22931 -1.81425,-2.91754 -2.22807,-6.48813 -2.23266,-9.92375 -0.008,-6.07666 1.11824,-12.09004 2.17848,-18.07349 0.88097,-4.97177 1.71949,-9.95483 2.26013,-14.97502 0.98337,-9.13118 0.9763,-18.35278 0.3199,-27.51327 -0.10993,-1.53416 -0.23754,-3.0832 -0.008,-4.60412 0.22922,-1.52092 0.85475,-3.0367 2.02069,-4.03986 1.07696,-0.9266 2.52093,-1.33598 3.93947,-1.4145 1.41854,-0.0785 2.83404,0.14655 4.23982,0.35197 3.31254,0.48405 6.65159,0.8649 9.88917,1.71656 2.04284,0.53738 4.03315,1.25925 6.0722,1.81081 3.40258,0.92039 6.96639,1.36144 10.46739,0.95192 3.76917,-0.44089 7.42987,-1.85678 11.22363,-1.76474 1.55658,0.0378 3.1015,0.33171 4.58649,0.79985 1.51539,0.47772 3.00914,1.16182 4.12281,2.29512 0.84639,0.8613 1.43579,1.94539 1.87872,3.06879 0.65982,1.67352 1.01492,3.457 1.16703,5.24945 0.13475,1.58788 0.11343,3.19441 0.41433,4.75933 0.49503,2.57458 1.84746,4.92305 3.52848,6.93494 1.68102,2.01189 3.68982,3.72048 5.69641,5.40783 1.99908,1.68103 4.0106,3.35469 6.16708,4.82839 1.0121,0.69165 2.05642,1.33949 3.01736,2.10062 0.96094,0.76113 1.84466,1.6468 2.44543,2.71535 0.81492,1.44944 1.06377,3.2077 0.53758,4.87655 -0.5262,1.66885 -1.48162,3.27659 -2.67059,4.68806 z"
+ id="path421"
+ clip-path="none" />
+ </clipPath>
+ <linearGradient
+ xlink:href="#linearGradient14392-8"
+ id="linearGradient423"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-250.00016,-58.362187)"
+ x1="442.03912"
+ y1="371.54401"
+ x2="490.12241"
+ y2="293.58548" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath426">
+ <path
+ style="fill:url(#linearGradient430);stroke-width:0.842603"
+ d="m 509.36312,335.7449 c -2.29559,2.52764 -5.48394,4.19571 -8.65854,5.69652 -5.41448,2.55973 -11.02537,4.80544 -16.11557,7.88485 -3.41042,2.0632 -6.55825,4.48486 -9.50168,7.09433 -2.51729,2.23169 -4.9046,4.6153 -7.72764,6.50627 -2.84842,1.90799 -6.14114,3.28999 -9.61581,3.77358 -4.22606,0.58818 -8.59281,-0.17275 -12.51035,-1.75618 -2.74507,-1.10954 -5.38569,-2.6965 -6.96694,-5.05501 -1.5873,-2.36755 -1.94936,-5.26504 -1.95338,-8.053 -0.007,-4.93114 0.97837,-9.81092 1.90598,-14.66641 0.77077,-4.03453 1.5044,-8.07822 1.97742,-12.15205 0.86036,-7.40983 0.85417,-14.89305 0.27988,-22.32667 -0.0962,-1.24495 -0.20783,-2.50198 -0.007,-3.73619 0.20055,-1.23421 0.74783,-2.46424 1.76793,-3.27829 0.94224,-0.75193 2.20559,-1.08414 3.44669,-1.14785 1.24109,-0.0637 2.47953,0.11892 3.70947,0.28562 2.89818,0.3928 5.81955,0.70185 8.65215,1.39296 1.78731,0.43608 3.52865,1.02187 5.31264,1.46945 2.97696,0.74689 6.09498,1.10479 9.15805,0.77247 3.29769,-0.35777 6.50048,-1.50675 9.81968,-1.43206 1.36187,0.0307 2.71354,0.26918 4.01278,0.64907 1.32583,0.38766 2.63273,0.9428 3.6071,1.86246 0.74051,0.69893 1.25619,1.57866 1.64371,2.49028 0.57728,1.35804 0.88797,2.80532 1.02105,4.25987 0.11789,1.28854 0.0992,2.59222 0.3625,3.86213 0.43311,2.08924 1.61637,3.995 3.08711,5.62762 1.47074,1.63263 3.22827,3.01913 4.98386,4.38839 1.74902,1.36413 3.50892,2.72229 5.39565,3.91818 0.8855,0.56126 1.79919,1.08698 2.63992,1.70462 0.84074,0.61765 1.61392,1.33636 2.13954,2.20348 0.71298,1.1762 0.93071,2.60301 0.47034,3.95726 -0.46038,1.35425 -1.29629,2.65891 -2.33654,3.8043 z"
+ id="path428"
+ clip-path="none" />
+ </clipPath>
+ <linearGradient
+ xlink:href="#linearGradient14392-8"
+ id="linearGradient430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.87491199,0,0,0.81148755,-158.36095,15.22676)"
+ x1="442.03912"
+ y1="371.54401"
+ x2="490.12241"
+ y2="293.58548" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath433">
+ <path
+ style="fill:url(#linearGradient437)"
+ d="m 263.18967,278.25167 c -2.6238,3.11482 -6.268,5.17039 -9.89648,7.01985 -6.1886,3.15437 -12.60169,5.92177 -18.41964,9.71654 -3.89802,2.54249 -7.4959,5.52671 -10.86016,8.74238 -2.87719,2.75012 -5.60582,5.68745 -8.83247,8.01771 -3.25567,2.35122 -7.01915,4.05426 -10.99061,4.6502 -4.83026,0.72481 -9.82134,-0.21289 -14.29898,-2.16416 -3.13754,-1.36728 -6.15569,-3.3229 -7.96301,-6.22931 -1.81425,-2.91754 -2.22807,-6.48813 -2.23266,-9.92375 -0.008,-6.07666 1.11824,-12.09004 2.17848,-18.07349 0.88097,-4.97177 1.71949,-9.95483 2.26013,-14.97502 0.98337,-9.13118 0.9763,-18.35278 0.3199,-27.51327 -0.10993,-1.53416 -0.23754,-3.0832 -0.008,-4.60412 0.22922,-1.52092 0.85475,-3.0367 2.02069,-4.03986 1.07696,-0.9266 2.52093,-1.33598 3.93947,-1.4145 1.41854,-0.0785 2.83404,0.14655 4.23982,0.35197 3.31254,0.48405 6.65159,0.8649 9.88917,1.71656 2.04284,0.53738 4.03315,1.25925 6.0722,1.81081 3.40258,0.92039 6.96639,1.36144 10.46739,0.95192 3.76917,-0.44089 7.42987,-1.85678 11.22363,-1.76474 1.55658,0.0378 3.1015,0.33171 4.58649,0.79985 1.51539,0.47772 3.00914,1.16182 4.12281,2.29512 0.84639,0.8613 1.43579,1.94539 1.87872,3.06879 0.65982,1.67352 1.01492,3.457 1.16703,5.24945 0.13475,1.58788 0.11343,3.19441 0.41433,4.75933 0.49503,2.57458 1.84746,4.92305 3.52848,6.93494 1.68102,2.01189 3.68982,3.72048 5.69641,5.40783 1.99908,1.68103 4.0106,3.35469 6.16708,4.82839 1.0121,0.69165 2.05642,1.33949 3.01736,2.10062 0.96094,0.76113 1.84466,1.6468 2.44543,2.71535 0.81492,1.44944 1.06377,3.2077 0.53758,4.87655 -0.5262,1.66885 -1.48162,3.27659 -2.67059,4.68806 z"
+ id="path435"
+ clip-path="none" />
+ </clipPath>
+ <linearGradient
+ xlink:href="#linearGradient14392-8"
+ id="linearGradient437"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-500.00032,-116.72437)"
+ x1="442.03912"
+ y1="371.54401"
+ x2="490.12241"
+ y2="293.58548" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath504">
+ <path
+ style="fill:#020204;stroke-width:0.991084"
+ id="path506"
+ d="m 304.84727,225.44951 c 5.97679,4.89463 9.76903,12.28597 10.94319,20.00305 0.91574,6.01859 0.32054,12.19496 -1.0124,18.13223 -1.33294,5.93726 -3.39093,11.67615 -5.43351,17.40051 -0.81452,2.2827 -1.63269,4.5871 -1.95634,6.9933 -0.32365,2.40621 -0.1187,4.95426 1.02109,7.08777 1.3066,2.44578 3.74526,4.13021 6.36677,4.92292 2.58816,0.78263 5.38374,0.76618 8.00354,0.10153 2.61979,-0.66466 5.06582,-1.96341 7.19828,-3.64929 5.41763,-4.28306 8.68657,-10.94871 9.95201,-17.81211 1.26545,-6.86339 0.68401,-13.95038 -0.49258,-20.83014 -1.60443,-9.38136 -4.30394,-18.55105 -7.74003,-27.40773 -2.52746,-6.51466 -5.7653,-12.74244 -9.61753,-18.52016 -3.77934,-5.66839 -9.14163,-10.09303 -13.10336,-15.63502 -1.37643,-1.92547 -3.03189,-3.93159 -4.38419,-5.87845 -2.91575,-4.19771 -2.25544,-3.41451 -4.06424,-6.13155 -1.31235,-1.9713 -3.38449,-2.6487 -5.56491,-3.51096 -2.18041,-0.86226 -4.629,-1.11623 -6.88065,-0.47108 -2.96781,0.85034 -5.39233,3.23113 -6.68215,6.08208 -1.28982,2.85095 -1.51545,6.12313 -1.01363,9.2201 0.64739,3.99536 2.44215,7.70258 4.46569,11.18873 2.28537,3.93724 4.93283,7.72707 8.38442,10.65407 3.60205,3.05459 7.95771,5.06875 11.61053,8.0602" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath508">
+ <path
+ id="path510"
+ d="m 240.47307,195.03592 c -7.07309,8.03686 -14.35222,15.81627 -18.34577,24.50506 -1.97625,4.41329 -2.91077,9.20725 -4.26498,13.84932 -1.5379,5.27176 -3.62609,10.3703 -5.97071,15.33612 -2.16496,4.58531 -4.54982,9.06291 -6.93891,13.53553 -1.7382,3.25409 -3.50514,6.58104 -4.10782,10.22071 -0.47628,2.87632 -0.1985,5.84423 0.53375,8.66626 0.73225,2.82202 1.90965,5.5106 3.23776,8.10601 5.66725,11.07504 14.17003,20.62168 24.24176,27.92472 4.57063,3.31418 9.46669,6.18109 14.60245,8.52595 2.78247,1.27041 5.71355,2.40436 8.77186,2.45744 1.52915,0.0265 3.0741,-0.22544 4.47434,-0.84055 1.40023,-0.6151 2.65068,-1.60373 3.48254,-2.88709 1.02278,-1.5779 1.36992,-3.53829 1.16461,-5.40743 -0.2053,-1.86914 -0.93484,-3.65294 -1.91324,-5.25873 -2.38997,-3.92251 -6.1652,-6.76055 -9.79642,-9.57343 -7.84055,-6.07358 -15.42465,-12.48039 -22.68212,-19.23996 -2.04912,-1.90854 -4.09841,-3.87759 -5.53019,-6.28412 -1.3943,-2.34352 -2.1476,-5.01376 -2.65783,-7.69253 -1.39972,-7.34873 -1.04092,-15.08286 1.45958,-22.13343 0.97822,-2.75826 2.27118,-5.39201 3.51815,-8.03965 2.16133,-4.58906 4.20725,-9.26564 7.04933,-13.46723 3.53798,-5.23037 8.26749,-9.66049 11.15147,-15.27803 2.43423,-4.74149 3.41994,-10.07236 4.36185,-15.31831 0.73693,-4.10434 2.15042,-8.12437 2.86923,-12.23193 -1.40611,2.66567 -5.93796,7.04283 -8.71069,10.5253 z"
+ style="fill:#020204" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath533">
+ <path
+ style="fill:#020204"
+ id="path535"
+ d="m 386.1875,285.32775 c -0.40516,-1.10369 -1.11845,-2.08156 -1.9907,-2.86987 -0.87226,-0.78832 -1.90049,-1.39229 -2.98278,-1.85155 -2.16459,-0.91852 -4.52053,-1.26149 -6.83152,-1.69556 -2.17919,-0.40931 -4.34179,-0.90631 -6.52782,-1.27734 -2.27136,-0.38551 -4.6179,-0.63213 -6.8653,-0.1253 -1.96583,0.44333 -3.7845,1.45879 -5.27172,2.81864 -1.48723,1.35984 -2.64911,3.0564 -3.48499,4.89007 -1.47218,3.22952 -1.93451,6.86503 -1.65394,10.40316 0.20881,2.63325 0.87532,5.34594 2.60877,7.33912 1.40065,1.61052 3.38733,2.61526 5.43398,3.22092 3.52502,1.04316 7.36663,0.98822 10.86038,-0.1553 5.76689,-1.93113 10.87568,-5.77387 14.33034,-10.77903 1.13861,-1.64963 2.11217,-3.44809 2.5532,-5.4034 0.33597,-1.48955 0.34831,-3.08112 -0.1779,-4.51456" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath538">
+ <path
+ d="m 386.1875,285.32775 c -0.40516,-1.10369 -1.11845,-2.08156 -1.9907,-2.86987 -0.87226,-0.78832 -1.90049,-1.39229 -2.98278,-1.85155 -2.16459,-0.91852 -4.52053,-1.26149 -6.83152,-1.69556 -2.17919,-0.40931 -4.34179,-0.90631 -6.52782,-1.27734 -2.27136,-0.38551 -4.6179,-0.63213 -6.8653,-0.1253 -1.96583,0.44333 -3.7845,1.45879 -5.27172,2.81864 -1.48723,1.35984 -2.64911,3.0564 -3.48499,4.89007 -1.47218,3.22952 -1.93451,6.86503 -1.65394,10.40316 0.20881,2.63325 0.87532,5.34594 2.60877,7.33912 1.40065,1.61052 3.38733,2.61526 5.43398,3.22092 3.52502,1.04316 7.36663,0.98822 10.86038,-0.1553 5.76689,-1.93113 10.87568,-5.77387 14.33034,-10.77903 1.13861,-1.64963 2.11217,-3.44809 2.5532,-5.4034 0.33597,-1.48955 0.34831,-3.08112 -0.1779,-4.51456"
+ id="path540"
+ style="fill:#020204" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath622">
+ <path
+ style="fill:url(#radialGradient626)"
+ d="m 85.75,122.36218 c -2.78042,1.91023 -5.11057,4.57487 -6.25,7.75 -1.43603,4.00163 -0.88584,8.48071 0.5,12.5 1.41949,4.11688 3.79379,8.04098 7.37932,10.51234 1.79277,1.23567 3.86809,2.08301 6.0304,2.33859 2.16231,0.25558 4.40928,-0.0949 6.34028,-1.10093 2.35312,-1.22596 4.14782,-3.37278 5.26217,-5.78076 1.11436,-2.40798 1.5888,-5.0701 1.73783,-7.71924 0.18989,-3.37546 -0.14047,-6.80646 -1.25,-10 -1.20527,-3.46909 -3.39005,-6.67055 -6.47275,-8.6666 -1.54136,-0.99803 -3.29195,-1.68356 -5.11089,-1.93515 -1.81893,-0.25158 -3.70476,-0.0633 -5.41636,0.60175 -0.97547,0.37901 -1.88744,0.9074 -2.75,1.5"
+ id="path624" />
+ </clipPath>
+ <radialGradient
+ xlink:href="#linearGradient28799-3"
+ id="radialGradient626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0857794,-0.03431182,0.03943781,1.2479887,-15.5421,-75.904827)"
+ cx="223.19559"
+ cy="137.66095"
+ fx="223.19559"
+ fy="137.66095"
+ r="14.572236" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath631">
+ <path
+ style="fill:url(#radialGradient635)"
+ d="m 54.23244,122.36218 c -1.78096,0.097 -3.48461,0.91899 -4.78785,2.1367 -1.30323,1.21771 -2.22137,2.81176 -2.78618,4.50357 -1.12962,3.38363 -0.87548,7.05177 -0.6187,10.60973 0.23251,3.22162 0.47041,6.50533 1.67679,9.50158 0.60319,1.49813 1.45024,2.91021 2.58034,4.06395 1.13009,1.15374 2.55173,2.04189 4.11829,2.43447 1.46884,0.36809 3.03816,0.29183 4.48279,-0.16209 1.44462,-0.45392 2.76391,-1.27887 3.84623,-2.33791 1.57904,-1.54507 2.64326,-3.5662 3.25345,-5.68947 0.61019,-2.12328 0.78416,-4.35155 0.7524,-6.56053 -0.0397,-2.76435 -0.40091,-5.53851 -1.26575,-8.16439 -0.86485,-2.62588 -2.24575,-5.10327 -4.1728,-7.08561 -0.93331,-0.96009 -1.99776,-1.80513 -3.19858,-2.39747 -1.20082,-0.59233 -2.54344,-0.92535 -3.88043,-0.85253"
+ id="path633" />
+ </clipPath>
+ <radialGradient
+ xlink:href="#linearGradient28799-3"
+ id="radialGradient635"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.81524244,-0.03431182,0.02961133,1.2479887,9.5624,-75.904827)"
+ cx="223.19559"
+ cy="137.66095"
+ fx="223.19559"
+ fy="137.66095"
+ r="14.572236" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath697">
+ <path
+ style="fill:url(#radialGradient701);stroke-width:0.77538"
+ d="m 214.63605,148.03815 c -2.51029,-0.0409 -4.99135,0.28921 -7.27146,0.88384 -4.05254,1.05688 -7.57367,2.93934 -10.08468,5.39315 -1.62814,0.85539 -3.05003,1.89919 -4.20722,3.08639 -0.66186,0.67901 -1.24391,1.41694 -1.50131,2.24757 -0.20244,0.65333 -0.19857,1.34469 -0.28524,2.01986 -0.0324,0.25293 -0.0778,0.5073 -0.0362,0.76548 0.0208,0.12909 0.0631,0.25809 0.13756,0.38081 0.0221,0.0364 0.0528,0.0707 0.0806,0.1055 0.0825,0.15031 0.18297,0.29681 0.31473,0.43099 0.28806,0.29334 0.68023,0.53107 1.09417,0.73203 0.41394,0.20097 0.85255,0.36757 1.2815,0.54936 2.28006,0.96628 4.22773,2.32456 5.9925,3.75924 2.3677,1.92485 4.52941,4.06099 7.5099,5.46004 2.10465,0.98794 4.52773,1.552 6.92602,1.72396 2.81637,0.20193 5.58521,-0.12293 8.18167,-0.69344 2.40631,-0.52873 4.69673,-1.27132 6.75202,-2.25401 3.90702,-1.86802 6.98699,-4.60634 11.42445,-5.83442 0.96876,-0.2681 1.99041,-0.45921 2.91317,-0.78993 0.92276,-0.33072 1.76305,-0.8265 2.11948,-1.52711 0.34261,-0.67347 0.2049,-1.45031 0.23569,-2.18968 0.0329,-0.791 0.26357,-1.5559 0.33312,-2.34278 0.0695,-0.78687 -0.0382,-1.6289 -0.62199,-2.35178 -0.12955,-0.16043 -0.28324,-0.31001 -0.45163,-0.45157 -0.0509,-0.29235 -0.22134,-0.58029 -0.46622,-0.83239 -0.50487,-0.51975 -1.29334,-0.87172 -2.09515,-1.11671 -1.09824,-0.33555 -2.25599,-0.50211 -3.39891,-0.69601 -3.51093,-0.59565 -6.96955,-1.47539 -10.29467,-2.60394 -1.65302,-0.56104 -3.27073,-1.18327 -4.90416,-1.77928 -1.67927,-0.61273 -3.38672,-1.20103 -5.16515,-1.57729 -1.49109,-0.31546 -3.00643,-0.47332 -4.51259,-0.49788 z"
+ id="path699" />
+ </clipPath>
+ <radialGradient
+ xlink:href="#linearGradient28469-0"
+ id="radialGradient701"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.81494503,-0.25452614,0.31491054,0.43302392,-75.371375,150.73818)"
+ cx="294.48483"
+ cy="193.09949"
+ fx="294.48483"
+ fy="193.09949"
+ r="31.111488" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath816">
+ <path
+ style="fill:#fdfdfb"
+ d="m -26.29567,154.81433 c -1.0464,1.31136 -1.72773,2.88726 -2.13927,4.51369 -0.41153,1.62642 -0.56228,3.30801 -0.62653,4.98446 -0.12849,3.35291 0.0765,6.77015 -0.81096,10.00604 -0.94874,3.4595 -3.07595,6.45649 -5.15761,9.37795 -3.60485,5.05916 -7.248548,10.25011 -9.027058,16.20217 -1.077103,3.60469 -1.435613,7.42255 -1.04841,11.16474 -4.035298,5.9262 -7.528852,12.22112 -10.4229,18.78069 -4.386197,9.94163 -7.396115,20.5265 -8.454552,31.34105 -1.296051,13.24236 0.397579,26.86184 5.627472,39.09655 3.781309,8.84592 9.417708,16.94379 16.68566,23.2466 3.695408,3.20468 7.799668,5.93944 12.189498,8.09709 15.21252,7.47713 34.01348,7.49101 48.97296,-0.48031 7.81838,-4.16611 14.41789,-10.2582 20.78084,-16.42232 3.83183,-3.71209 7.64353,-7.51249 10.56653,-11.97551 5.62746,-8.59236 7.58747,-19.03566 8.80544,-29.23436 2.12971,-17.83321 2.1984,-36.66998 -5.62137,-52.83816 -2.69219,-5.56638 -6.27896,-10.69891 -10.58065,-15.14052 -1.14547,-7.78087 -3.40638,-15.39666 -6.69212,-22.54215 -2.37045,-5.15502 -5.2683,-10.06187 -7.47079,-15.29085 -0.90422,-2.14672 -1.68995,-4.34486 -2.69346,-6.44699 -1.00352,-2.10213 -2.24145,-4.12498 -3.92446,-5.73541 -1.72343,-1.6491 -3.87096,-2.81824 -6.13593,-3.56631 -2.26498,-0.74806 -4.64917,-1.08697 -7.03147,-1.2068 -4.7646,-0.23966 -9.53872,0.38348 -14.30559,0.19423 -3.79476,-0.15066 -7.57776,-0.81566 -11.36892,-0.59186 -1.89557,0.1119 -3.79087,0.45058 -5.55026,1.1649 -1.7594,0.71432 -3.38173,1.81713 -4.56609,3.30139"
+ id="path818" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath820">
+ <path
+ id="path822"
+ d="m -47.29567,161.44377 c -1.0464,1.42368 -1.72773,3.13456 -2.13927,4.9003 -0.41153,1.76572 -0.56228,3.59134 -0.62653,5.41138 -0.12849,3.64009 0.0765,7.35002 -0.81096,10.86307 -0.94874,3.75581 -3.07595,7.0095 -5.15761,10.18119 -3.60485,5.49248 -7.248548,11.12804 -9.027058,17.58991 -1.077103,3.91343 -1.435613,8.0583 -1.04841,12.12101 -4.035298,6.43379 -7.528852,13.26788 -10.4229,20.38928 -4.386197,10.79315 -7.396115,22.28463 -8.454552,34.02546 -1.296051,14.37658 0.397579,29.16259 5.627472,42.44522 3.781309,9.60359 9.417708,18.39505 16.68566,25.23771 3.695408,3.47916 7.799668,6.44816 12.189498,8.79061 15.21252,8.11756 34.01348,8.13263 48.97296,-0.52145 7.81838,-4.52294 14.41789,-11.13683 20.78084,-17.82891 3.83183,-4.03004 7.64353,-8.15595 10.56653,-13.00123 5.62746,-9.32831 7.58747,-20.66609 8.80544,-31.73832 2.12971,-19.36065 2.1984,-39.81082 -5.62137,-57.36383 -2.69219,-6.04314 -6.27896,-11.61528 -10.58065,-16.43732 -1.14547,-8.44732 -3.40638,-16.71541 -6.69212,-24.47292 -2.37045,-5.59655 -5.2683,-10.92368 -7.47079,-16.60053 -0.90422,-2.33059 -1.68995,-4.71701 -2.69346,-6.99919 -1.00352,-2.28218 -2.24145,-4.47829 -3.92446,-6.22665 -1.72343,-1.79035 -3.87096,-3.05963 -6.13593,-3.87177 -2.26498,-0.81213 -4.64917,-1.18007 -7.03147,-1.31016 -4.7646,-0.26019 -9.53872,0.41632 -14.30559,0.21086 -3.79476,-0.16356 -7.57776,-0.88552 -11.36892,-0.64255 -1.89557,0.12148 -3.79087,0.48917 -5.55026,1.26467 -1.7594,0.77551 -3.38173,1.97277 -4.56609,3.58416"
+ style="fill:#fdfdfb;stroke-width:1.04195" />
+ </clipPath>
+ </defs>
+ <metadata
+ id="metadata1886">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <rect
+ style="fill:#eaecef;fill-opacity:0.99806601;fill-rule:evenodd;stroke:none;stroke-width:0.469157;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+ id="rect9516"
+ width="44.37664"
+ height="95.576836"
+ x="99.252327"
+ y="2.6458309"
+ rx="2.0593712"
+ ry="2.0593712" />
+ <rect
+ style="fill:#eaecef;fill-opacity:0.99806601;fill-rule:evenodd;stroke:none;stroke-width:0.451142;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+ id="rect9514"
+ width="41.034023"
+ height="95.576836"
+ x="2.6458337"
+ y="2.6458309"
+ rx="2.0593712"
+ ry="2.0593712" />
+ <g
+ id="g4037"
+ transform="matrix(0.38632647,0,0,0.38632647,42.374522,21.078916)">
+ <g
+ id="logo"
+ transform="matrix(0.26458333,0,0,0.26458333,36.63503,14.525527)">
+ <g
+ style="stroke-width:0.740741"
+ transform="matrix(1.35,0,0,1.35,254.80649,13.590502)"
+ id="baseplate">
+ <path
+ id="rect1083"
+ style="display:inline;opacity:1;vector-effect:none;fill:#4a6c1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.63111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M -160.02233,0.20609549 H -8.8412571 c 10.4693001,0 18.8976531,8.42835351 18.8976531,18.89765351 V 170.28482 c 0,10.4693 -8.428353,18.89765 -18.8976531,18.89765 H -160.02233 c -10.4693,0 -18.89765,-8.42835 -18.89765,-18.89765 V 19.103749 c 0,-10.4693 8.42835,-18.89765351 18.89765,-18.89765351 z" />
+ <ellipse
+ style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.63111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path1085"
+ cx="-163.04599"
+ cy="16.080099"
+ rx="5.2913389"
+ ry="5.2913384" />
+ <ellipse
+ ry="5.2913384"
+ rx="5.2913389"
+ cy="16.080099"
+ cx="-5.8176479"
+ id="ellipse1087"
+ style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.63111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <ellipse
+ style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.63111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse1089"
+ cx="-5.8176479"
+ cy="173.30853"
+ rx="5.2913389"
+ ry="5.2913384" />
+ <ellipse
+ ry="5.2913384"
+ rx="5.2913389"
+ cy="173.30853"
+ cx="-163.04599"
+ id="ellipse1091"
+ style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.63111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="penguin">
+ <path
+ id="path65"
+ d="m 97.791067,210.93178 43.032003,44.41 27.614,-30.648 -0.582,1.512 c -1.516,5.96 -1.278,14.293 6.165,23.295 l 1.954,2.365 2.298,-2.035 c 0.339,-0.301 8.239,-7.416 7.993,-16.809 -0.054,-2.016 -0.47,-3.961 -1.242,-5.83 1.175,0.305 2.383,0.456 3.623,0.456 8.008,0 14.123,-6.613 14.382,-6.892 l 2.077,-2.287 -2.359,-1.987 c -4.785,-4.022 -9.887,-6.062 -15.161,-6.062 -1.14,0 -3.1713,0.2398 -3.5343,0.2748 z"
+ style="fill:#ffffff" />
+ <path
+ id="path16"
+ d="m 204.01607,156.61778 -0.001,-23.812 H 77.532067 c 0,0 0,23.806 0.001,23.812 z"
+ style="fill:#ffffff" />
+ <path
+ d="m 234.75407,88.440783 c 0,-20.429 -16.899,-37.054 -37.332,-37.054 -4.865,0 -9.648,0.971 -13.906,2.682 -2.61,1.046 -5.145,2.377 -7.422,3.969 -0.51,-2.782 -1.43,-5.424 -2.627,-7.891 -5.021,-10.359 -15.63,-17.532 -27.892,-17.532 -8.64,0 -16.461,3.557 -22.09,9.278 -1.968,2 -3.667,4.264 -5.039,6.734 -1.574,-2.36 -3.431,-4.512 -5.486,-6.451 -6.637,-6.247 -15.545003,-10.108 -25.358003,-10.108 -20.43,0 -37.007,16.621 -37.007,37.054 0,13.862 7.939,25.926 19.003,32.268997 V 89.563783 h 7.935 V 124.86978 H 204.01507 v -13.306 h 7.935 v 11.273 c 13.536,-5.464 22.804,-18.828 22.804,-34.395997 z"
+ id="path20"
+ style="fill:#ffffff" />
+ <path
+ style="fill:#001024"
+ id="path24"
+ d="m 204.01607,156.61878 c 0,0 -126.479003,-0.008 -126.479003,-0.002 0.004,32.285 10.435,59.566 47.459003,65.409 l 12.768,13.382 c 0.76,0.811 1.833,1.322 3.031,1.322 1.187,0 2.25,-0.501 3.009,-1.297 l 12.755,-13.409 c 37.002,-5.849 47.457,-33.116 47.457,-65.405 z" />
+ <path
+ style="fill:#ffffff"
+ id="path26"
+ d="m 157.90607,188.45778 v -1.114 c 0,-4.216 3.563,-7.776 7.781,-7.776 4.213,0 7.771,3.561 7.771,7.776 v 1.114 h 10.897 v -1.114 c 0,-10.296 -8.375,-18.672 -18.669,-18.672 -10.299,0 -18.678,8.376 -18.678,18.672 v 1.114 z" />
+ <path
+ style="fill:#ffffff"
+ id="path28"
+ d="m 106.72307,188.45778 v -1.114 c 0,-4.216 3.56,-7.776 7.772,-7.776 4.215,0 7.775,3.561 7.775,7.776 v 1.114 h 10.897 v -1.114 c 0,-10.296 -8.376,-18.672 -18.672,-18.672 -10.294,0 -18.668003,8.376 -18.668003,18.672 v 1.114 z" />
+ <path
+ style="fill:#ff9b00"
+ id="path30"
+ d="m 167.68807,201.51878 c 0,0 -7.633,-6.097 -26.857,-6.097 -19.221,0 -26.854,6.097 -26.854,6.097 l 26.843,27.809 z" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g3444"
+ transform="matrix(0.53068417,0,0,0.53068417,136.24088,57.917875)">
+ <g
+ transform="matrix(0.28222222,0,0,0.28222222,-154.43109,0.38685556)"
+ id="g5740-8-5">
+ <path
+ style="fill:#9e1f63;fill-opacity:1"
+ d="m 55.083984,105.09766 h 40.550782 c 5.193104,0 9.402344,-4.20926 9.402344,-9.402348 V 9.3710938 c 0,-5.193107 -4.20924,-9.40429692 -9.402344,-9.40429692 H 55.083984 Z"
+ id="path5738-0-9"
+ transform="translate(414.17371,14.17103)" />
+ <path
+ style="fill:#1f639e;fill-opacity:1"
+ d="M 49.859375,-0.03320312 H 9.3085938 c -5.1930901,0 -9.4023438,4.21118982 -9.4023438,9.40429692 V 95.695312 c 0,5.192678 4.2092538,9.402348 9.4023438,9.402348 H 49.859375 Z"
+ id="path5736-5-9"
+ transform="translate(414.17371,14.17103)" />
+ <g
+ transform="matrix(0.41208579,0,0,0.41208579,408.61385,8.4235118)"
+ id="g4986-4-6-1">
+ <g
+ id="g4988-0-6-4">
+ <circle
+ style="fill:#ffffff"
+ cx="35.129002"
+ cy="34.964001"
+ r="7.4099998"
+ id="circle4990-6-4-9" />
+ <circle
+ style="fill:#ffffff"
+ cx="246.895"
+ cy="34.964001"
+ r="7.4099998"
+ id="circle4992-2-0-1" />
+ <circle
+ style="fill:#ffffff"
+ cx="246.895"
+ cy="246.729"
+ r="7.4089999"
+ id="circle4994-9-0-0" />
+ <circle
+ style="fill:#ffffff"
+ cx="35.131001"
+ cy="246.729"
+ r="7.4089999"
+ id="circle4996-9-4-7" />
+ </g>
+ </g>
+ </g>
+ <g
+ style="fill:#ffffff;fill-opacity:1"
+ transform="matrix(0.48031713,0,0,0.43545026,-340.63223,-89.699674)"
+ id="g5468-8-6-2-4-9-4-5-8-6-0-5-7-5-5-8-5-0-6-5">
+ <g
+ style="fill:#ffffff;fill-opacity:1"
+ transform="translate(0.36303102,-0.36486702)"
+ id="g4915-2-9-6-5-73-3-2-8">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:FontAwesome;-inkscape-font-specification:FontAwesome;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
+ x="249.03232"
+ y="-648.62506"
+ id="text5711-4-4-9-7-8-2-2-1-4-3-26-4-3-6-3-9-6-7"
+ transform="rotate(90)"><tspan
+ id="tspan5713-07-9-3-2-5-7-3-9-7-0-1-9-9-1-89-1-7-0"
+ x="249.03232"
+ y="-648.62506"
+ style="font-size:40px;line-height:1.25"></tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:FontAwesome;-inkscape-font-specification:FontAwesome;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
+ x="-251.92296"
+ y="674.35278"
+ id="text5711-7-5-5-4-1-2-0-7-4-6-7-06-0-4-1-5-9-5-4"
+ transform="rotate(-90)"><tspan
+ id="tspan5713-7-4-3-6-4-3-9-5-7-5-8-1-9-8-5-53-6-6-8"
+ x="-251.92296"
+ y="674.35278"
+ style="font-size:40px;line-height:1.25"></tspan></text>
+ </g>
+ </g>
+ </g>
+ <g
+ id="g3351"
+ transform="matrix(0.17494972,0,0,0.17494972,125.01765,33.077337)">
+ <path
+ id="path14"
+ style="fill:#092239;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m 40.192619,-60.786636 c 0,4.445706 -3.603625,8.050094 -8.049331,8.050094 h -73.90074 c -4.445847,0 -8.049543,-3.604388 -8.049543,-8.050094 v -73.900244 c 0,-4.44571 3.603696,-8.05004 8.049543,-8.05004 h 73.90074 c 4.445706,0 8.049331,3.60433 8.049331,8.05004 v 73.900244" />
+ <path
+ id="path16-0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m -42.093579,-132.68099 c 1.44392,0 2.614295,-1.17016 2.614295,-2.61373 0,-1.44356 -1.170375,-2.61443 -2.614295,-2.61443 -1.443214,0 -2.613837,1.17087 -2.613837,2.61443 0,1.44357 1.170623,2.61373 2.613837,2.61373" />
+ <path
+ id="path18"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m 32.612482,-137.90915 c -1.443214,0 -2.614083,1.17087 -2.614083,2.61443 0,1.44357 1.170869,2.61373 2.614083,2.61373 1.443567,0 2.614084,-1.17016 2.614084,-2.61373 0,-1.44356 -1.170517,-2.61443 -2.614084,-2.61443" />
+ <path
+ id="path20-4"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m 32.612482,-57.975279 c 1.443567,0 2.614084,-1.170658 2.614084,-2.61373 0,-1.444343 -1.170517,-2.613872 -2.614084,-2.613872 -1.443214,0 -2.614083,1.169529 -2.614083,2.613872 0,1.443072 1.170869,2.61373 2.614083,2.61373" />
+ <path
+ id="path22"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m -42.092873,-63.202881 c -1.44392,0 -2.614543,1.169529 -2.614543,2.613872 0,1.443072 1.170623,2.61373 2.614543,2.61373 1.443496,0 2.613589,-1.170658 2.613589,-2.61373 0,-1.444343 -1.170093,-2.613872 -2.613589,-2.613872" />
+ <path
+ id="path24-8"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m 21.902501,-108.22678 -26.6241404,-15.37159 -16.4151386,9.47738 v -19.05283 h -10.230698 v 55.6888 L -4.7216394,-62.113398 21.902501,-77.48502 v -30.74176" />
+ <path
+ id="path26-7"
+ style="fill:#f25373;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m -4.7216394,-73.678195 -16.6084616,-9.588783 v -19.177772 l 16.6084616,-9.58921 v 38.355765" />
+ <path
+ id="path28-1"
+ style="fill:#ee294a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0352778"
+ d="m 11.886787,-83.266978 -16.6084264,9.588783 v -38.355765 l 16.6084264,9.58921 v 19.177772" />
+ </g>
+ <g
+ transform="matrix(0.06404675,0,0,0.06404675,115.11,30.318776)"
+ id="layer2">
+ <g
+ id="g463">
+ <path
+ style="fill:#020204"
+ d="m 140.8125,19.578125 c -7.16795,-0.07795 -14.42402,1.374646 -20.73438,4.775391 -6.70663,3.614308 -12.20088,9.395485 -15.58593,16.220703 -3.38347,6.822028 -4.712926,14.108148 -4.914065,22.132808 -0.382163,15.24684 0.34393,31.23872 1.494145,45.730473 0.3054,4.41258 0.85369,6.99499 0.29297,11.52344 -1.88652,9.62986 -10.313201,16.11178 -14.80468,24.57031 -4.954704,9.33089 -7.043403,19.88101 -10.783203,29.76172 -3.422488,9.04236 -8.227578,17.52067 -11.470703,26.62891 -4.534864,12.73604 -5.890504,26.73088 -2.894532,39.91406 2.283855,10.04965 7.054597,19.47291 13.484375,27.5332 -0.930503,1.67688 -1.832233,3.3716 -2.792968,5.03125 -2.979452,5.14693 -6.619557,10.02667 -8.316407,15.72656 -0.848425,2.84995 -1.182417,5.88981 -0.634765,8.8125 0.547652,2.92268 2.02651,5.71858 4.351562,7.57227 1.522028,1.21346 3.357446,1.99485 5.253906,2.43359 1.896461,0.43879 3.856625,0.54531 5.802735,0.50391 7.394587,-0.15718 14.559024,-2.40522 21.71289,-4.2832 4.23946,-1.11291 8.51036,-2.10105 12.80273,-2.98829 15.24055,-3.12209 32.25031,-1.87591 46.39844,0.17579 4.79197,0.72368 9.54981,1.67102 14.25977,2.8125 7.37714,1.78788 14.72878,4.06701 22.3164,4.2832 1.99729,0.0569 4.0106,-0.0306 5.96094,-0.46484 1.95034,-0.43429 3.84211,-1.22688 5.4043,-2.47266 2.32922,-1.85746 3.80834,-4.65745 4.35546,-7.58594 0.54713,-2.9285 0.20917,-5.97702 -0.64843,-8.83008 -1.71521,-5.70613 -5.38873,-10.5749 -8.43555,-15.69531 -1.20215,-2.0203 -2.32023,-4.0926 -3.51367,-6.11719 9.16873,-10.29563 16.54824,-22.20278 20.8164,-35.28125 4.65874,-14.27524 5.51426,-29.64566 3.55274,-44.5332 -1.96148,-14.88754 -6.6821,-29.32114 -12.8984,-42.99023 -7.79769,-17.13839 -14.35278,-23.331 -19.10351,-38.38086 -5.13471,-16.266273 -0.8948,-35.514213 -4.71094,-50.267583 -1.3618,-5.0173 -3.53277,-9.80681 -6.32617,-14.191405 -3.27306,-5.137474 -7.42457,-9.742407 -12.35743,-13.316406 -7.87066,-5.702527 -17.61519,-8.638455 -27.33398,-8.744141 z"
+ id="path28712-2" />
+ <path
+ id="path29719-5"
+ d="m 112.70417,105.45215 c -1.0464,1.31136 -1.72773,2.88726 -2.13927,4.51369 -0.41153,1.62642 -0.56228,3.30801 -0.62653,4.98446 -0.12849,3.35291 0.0765,6.77015 -0.81096,10.00604 -0.94874,3.4595 -3.07595,6.45649 -5.15761,9.37795 -3.60485,5.05916 -7.248548,10.25011 -9.027058,16.20217 -1.077103,3.60469 -1.435613,7.42255 -1.04841,11.16474 -4.035298,5.9262 -7.528852,12.22112 -10.4229,18.78069 -4.386197,9.94163 -7.396115,20.5265 -8.454552,31.34105 -1.296051,13.24236 0.397579,26.86184 5.627472,39.09655 3.781309,8.84592 9.417708,16.94379 16.68566,23.2466 3.695408,3.20468 7.799668,5.93944 12.189498,8.09709 15.21252,7.47713 34.01348,7.49101 48.97296,-0.48031 7.81838,-4.16611 14.41789,-10.2582 20.78084,-16.42232 3.83183,-3.71209 7.64353,-7.51249 10.56653,-11.97551 5.62746,-8.59236 7.58747,-19.03566 8.80544,-29.23436 2.12971,-17.83321 2.1984,-36.66998 -5.62137,-52.83816 -2.69219,-5.56638 -6.27896,-10.69891 -10.58065,-15.14052 -1.14547,-7.78087 -3.40638,-15.39666 -6.69212,-22.54215 -2.37045,-5.15502 -5.2683,-10.06187 -7.47079,-15.29085 -0.90422,-2.14672 -1.68995,-4.34486 -2.69346,-6.44699 -1.00352,-2.10213 -2.24145,-4.12498 -3.92446,-5.73541 -1.72343,-1.6491 -3.87096,-2.81824 -6.13593,-3.56631 -2.26498,-0.74806 -4.64917,-1.08697 -7.03147,-1.2068 -4.7646,-0.23966 -9.53872,0.38348 -14.30559,0.19423 -3.79476,-0.15066 -7.57776,-0.81566 -11.36892,-0.59186 -1.89557,0.1119 -3.79087,0.45058 -5.55026,1.1649 -1.7594,0.71432 -3.38173,1.81713 -4.56609,3.30139"
+ style="fill:#fdfdfb" />
+ </g>
+ <g
+ id="g562">
+ <path
+ transform="matrix(1.1543044,0,0,1,166.33231,-58.362183)"
+ id="path4400-1"
+ d="m -61.00266,211.59308 c 0.88005,1.52387 -0.54737,6.77829 19.96381,3.4153 0,0 -3.60202,0.4573 -7.15281,1.40419 -5.52127,2.1334 -10.33021,4.51706 -14.04019,7.67524 -3.67553,3.12167 -6.36707,7.19694 -9.73973,10.69705 0,0 5.46173,-11.5187 6.82331,-14.98742 1.36157,-3.46872 -0.22795,-3.30999 0.84893,-8.4136 1.07688,-5.1036 3.71346,-10.00699 3.71346,-10.00699 0,0 -2.15241,7.21088 -0.41678,10.21623 z"
+ style="opacity:0.25;fill:url(#radialGradient18834);filter:url(#filter4487-6)" />
+ <path
+ id="path4400-2-8"
+ d="m 172.04993,151.8559 c -4.82509,3.36138 -7.65241,2.96341 -13.50685,3.62087 -5.85444,0.65746 -21.69838,0.41943 -21.69838,0.41943 0,0 2.29371,-0.0427 7.37759,0.90419 5.08388,0.94693 15.45307,1.85232 21.29176,4.07468 5.83869,2.22236 7.96846,2.8566 11.51723,5.10056 5.05107,3.19388 8.75817,8.19694 13.587,11.69705 0,0 0.23377,-4.6437 -1.71568,-8.11242 -1.94945,-3.46872 -7.19037,-8.93499 -8.7322,-14.0386 -1.54183,-5.1036 -2.27429,-15.13199 -2.27429,-15.13199 0,0 -1.02108,8.10485 -5.84618,11.46623 z"
+ style="opacity:0.42;fill:url(#radialGradient18836);filter:url(#filter4427-5-7)" />
+ <path
+ id="path4491-9"
+ d="m 126.66974,144.67794 c -0.17937,1.45594 -0.41189,2.90533 -0.69695,4.34431 -0.14052,0.70936 -0.2949,1.41989 -0.55905,2.09306 -0.26414,0.67317 -0.64419,1.31214 -1.18125,1.79639 -0.47071,0.42443 -1.04439,0.71595 -1.62069,0.97975 -2.24827,1.02916 -4.6544,1.71261 -7.10798,2.01899 0.97993,0.0719 1.95856,0.16127 2.93528,0.2682 0.61534,0.0674 1.23207,0.14208 1.83169,0.29586 0.59961,0.15377 1.18472,0.38955 1.68422,0.75518 0.54781,0.40099 0.97799,0.94833 1.29931,1.54636 0.64023,1.19159 0.85435,2.56281 0.97272,3.91031 0.15139,1.72336 0.16244,3.45904 0.033,5.18419 0.11585,-1.15429 0.35775,-2.29589 0.72,-3.39797 0.65284,-1.98614 1.70416,-3.84789 3.11974,-5.38642 0.56171,-0.6105 1.18038,-1.17036 1.85876,-1.6479 2.07821,-1.46294 4.71804,-2.1055 7.23612,-1.76133 -2.55897,0.11302 -5.14896,-0.69089 -7.19419,-2.23302 -1.04161,-0.78539 -1.94875,-1.76287 -2.57976,-2.90463 -0.97579,-1.76561 -1.25012,-3.90675 -0.75097,-5.86133"
+ style="opacity:0.2;fill:url(#radialGradient18838);filter:url(#filter4538-7)" />
+ <path
+ id="path4542-7"
+ d="m 120.49984,178.71875 c -1.22954,4.67934 -2.07519,9.45949 -2.52566,14.27665 -0.63702,6.81216 -0.48368,13.6725 -0.84934,20.5046 -0.31029,5.79753 -0.99107,11.65587 0.0159,17.3737 0.48017,2.72655 1.34273,5.38547 2.55456,7.87467 0.19249,-0.95006 0.33356,-1.91054 0.42239,-2.87583 0.42661,-4.63604 -0.3541,-9.28689 -0.61781,-13.93504 -0.46225,-8.14744 0.66569,-16.2899 1.125,-24.4375 0.3526,-6.25476 0.31082,-12.53173 -0.125,-18.78125 h -4e-5"
+ style="opacity:0.11;filter:url(#filter4592-2)" />
+ <path
+ id="path28767-9-3"
+ d="m 351.9604,200.85653 c -1.45162,0.38883 -1.23008,3.99417 -0.29604,5.49789 0.78886,1.26999 3.07235,2.27109 3.75853,1.00504 1.11412,-2.05562 -1.47192,-7.03613 -3.46249,-6.50293 z"
+ style="opacity:0.25;fill:#7c7c7c;filter:url(#filter15211-9)"
+ transform="matrix(-0.06991927,0.95700905,-0.56450744,-0.11853409,236.56758,-180.37928)" />
+ <path
+ transform="matrix(-0.09596121,-0.95700905,-0.77476232,0.11853409,398.90188,493.24449)"
+ style="opacity:0.75;fill:#7c7c7c;filter:url(#filter14706-3)"
+ d="m 361.75,209.34296 c 0.002,-1.53313 -7.56474,-10.0564 -9.7896,-8.48643 -2.22486,1.56998 -0.49172,3.7842 -0.29604,5.49789 0.19568,1.71368 -0.94537,6.60933 0.23849,7.25934 1.18386,0.65001 3.36607,-2.5198 5.30111,-4.27697 1.55818,-1.41494 4.54398,1.53929 4.54604,0.006 z"
+ id="path15189-4" />
+ <path
+ id="path28767-3"
+ d="m 277.9604,90.856536 c -2.22486,1.569973 -1.25289,3.530477 -0.29604,5.497884 0.95685,1.967407 -2.10429,7.63969 -2.13651,7.88434 -0.0322,0.24465 6.02534,-2.8754 7.67611,-4.901967 1.94956,-2.393373 6.87703,3.237917 6.60851,2.381167 0.002,-1.53312 -9.62721,-12.431397 -11.85207,-10.861424 z"
+ style="fill:#7c7c7c;filter:url(#filter15133-1)"
+ transform="matrix(1.1522137,0,0,1.1522137,-163.02721,-72.199565)" />
+ <path
+ style="fill:#838384;filter:url(#filter15185-2)"
+ d="m 16.687345,165.86218 c -2.16217,1.96937 1.01359,4.92767 2.51966,8.40429 0.93626,2.16126 3.52677,5.20509 6.03244,4.7175 1.8848,-0.36677 3.05427,-3.07936 2.87588,-4.99121 -0.34416,-3.68852 -3.45669,-4.55256 -5.7172,-5.81949 -1.79139,-1.00401 -4.19258,-3.69391 -5.71078,-2.31109 z"
+ id="path4596-3"
+ transform="translate(160,-57.362183)" />
+ <path
+ clip-path="url(#clipPath816)"
+ transform="translate(138.99984,-49.362181)"
+ style="fill:#000000;fill-opacity:0.258824;filter:url(#filter30479-2)"
+ id="path28461-8-7"
+ d="m -28.632498,172.60136 c 1.702936,4.93775 5.13035,9.15199 9.185848,12.44354 1.348656,1.0946 2.782167,2.10442 4.366233,2.817 1.584067,0.71257 3.331648,1.11945 5.062377,0.97245 1.6949733,-0.14396 3.3074706,-0.80936 4.788721,-1.64575 1.4812505,-0.8364 2.8560173,-1.84688 4.29298914,-2.75725 2.46262056,-1.56015 5.09983966,-2.82139 7.65715996,-4.22092 3.0824622,-1.68692 6.0695999,-3.59014 8.6646899,-5.95927 1.187948,-1.08451 2.295748,-2.26795 3.607519,-3.19888 1.31177,-0.93094 2.882987,-1.60572 4.487811,-1.49651 1.203853,0.0819 2.332908,0.59386 3.51249,0.84794 0.589792,0.12704 1.200784,0.18932 1.797215,0.0984 0.596431,-0.0909 1.179727,-0.34439 1.597895,-0.77928 0.512367,-0.53286 0.736406,-1.29981 0.709607,-2.03855 -0.0268,-0.73874 -0.284448,-1.45303 -0.628853,-2.10712 -0.68881,-1.30819 -1.734547,-2.43513 -2.200224,-3.83833 -0.414395,-1.24867 -0.330451,-2.59887 -0.293929,-3.91401 0.03652,-1.31513 0.0075,-2.68902 -0.598601,-3.85671 -0.461591,-0.88922 -1.236126,-1.59525 -2.12164,-2.06391 -0.885513,-0.46867 -1.878578,-0.71001 -2.876081,-0.80365 -1.995007,-0.18727 -3.993929,0.19997 -5.994489,0.31349 -2.655817,0.1507 -5.321957,-0.18176 -7.9772499,-0.0221 -3.3112912,0.1991 -6.5570138,1.16053 -9.87428,1.16645 -3.7859765,0.007 -7.5681223,-1.23192 -11.3075401,-0.63996 -1.60458,0.25401 -3.134778,0.8376 -4.675685,1.35219 -1.540906,0.5146 -3.132742,0.96724 -4.757133,0.94371 -1.844198,-0.0267 -3.629272,-0.66537 -5.468985,-0.79666 -0.919856,-0.0656 -1.86247,-1.8e-4 -2.726086,0.32326 -0.863615,0.32344 -1.644513,0.92357 -2.068349,1.7426 -0.242869,0.46932 -0.363194,0.99683 -0.385859,1.52479 -0.02266,0.52795 0.05026,1.05702 0.177828,1.56983 0.255132,1.02563 0.724233,1.98285 1.109821,2.96688 1.392508,3.55373 1.692361,7.44806 2.93678,11.05632" />
+ <path
+ clip-path="url(#clipPath820)"
+ style="opacity:0.3;fill:#000000;filter:url(#filter30475-4)"
+ id="path28461-84-3"
+ d="m -54.3809,165.4735 c 3.308481,2.21892 6.276719,4.94413 8.76949,8.0515 2.313244,2.88358 4.281072,6.1543 7.29931,8.28886 2.132561,1.50819 4.694875,2.3578 7.29406,2.61606 3.051509,0.3032 6.139761,-0.18685 9.08171,-1.05205 2.72664,-0.80188 5.363225,-1.92931 7.78216,-3.4214 4.5982326,-2.83636 8.4392136,-6.99279 13.51002,-8.85709 1.1070251,-0.407 2.2592345,-0.69817 3.3265087,-1.20024 1.0672741,-0.50208 2.071356,-1.25404 2.5810913,-2.31768 0.489979,-1.02241 0.4709637,-2.20249 0.63053,-3.32496 0.1707072,-1.20085 0.5537633,-2.36184 0.7638732,-3.55642 0.2101099,-1.19458 0.2351735,-2.47234 -0.2814032,-3.56975 -0.4277722,-0.90876 -1.2053869,-1.6278 -2.0998754,-2.08466 -0.8944886,-0.45686 -1.9010816,-0.6644 -2.9042801,-0.71362 -2.00639693,-0.0985 -3.9875479,0.41519 -5.9880545,0.59766 -2.649555,0.24167 -5.3179008,-0.0991 -7.97725,-0.019 -3.308278,0.0996 -6.568191,0.84884 -9.87428,1.00503 -3.771652,0.17818 -7.534056,-0.41751 -11.30754,-0.55139 -1.632251,-0.0579 -3.2754,-0.0286 -4.884302,0.25254 -1.608902,0.28112 -3.188197,0.82168 -4.548518,1.72563 -1.319979,0.87714 -2.396737,2.06728 -3.606567,3.09101 -0.604916,0.51187 -1.247757,0.98508 -1.953748,1.34495 -0.705991,0.35987 -1.478799,0.60451 -2.270305,0.64257 -0.40728,0.0196 -0.818345,-0.0152 -1.2213,0.0472 -0.676172,0.10463 -1.303709,0.49355 -1.698284,1.05254 -0.394576,0.55899 -0.550896,1.28053 -0.423046,1.9527 v 1e-5"
+ transform="matrix(1,0,0,0.92110599,159.99984,-43.254675)" />
+ </g>
+ <g
+ id="g481">
+ <path
+ transform="translate(160,-57.362183)"
+ d="m 45.10134,224.44951 c 6.084796,4.89463 9.945575,12.28597 11.14096,20.00305 0.932288,6.01859 0.326343,12.19496 -1.030694,18.13223 -1.357038,5.93726 -3.452212,11.67615 -5.531716,17.40051 -0.829244,2.2827 -1.662186,4.5871 -1.991686,6.9933 -0.3295,2.40621 -0.120849,4.95426 1.039536,7.08777 1.330223,2.44578 3.812954,4.13021 6.48184,4.92292 2.634941,0.78263 5.481042,0.76618 8.148186,0.10153 2.667145,-0.66466 7.157372,-1.52591 9.328374,-3.21179 5.515551,-4.28306 6.82474,-11.71935 8.13188,-18.24961 1.363195,-6.8103 0.69637,-13.95038 -0.50149,-20.83014 -1.63342,-9.38136 -4.38172,-18.55105 -7.87991,-27.40773 -2.573144,-6.51466 -5.8695,-12.74244 -9.79135,-18.52016 -3.847635,-5.66839 -9.306853,-10.09303 -13.34018,-15.63502 -1.401311,-1.92547 -3.086675,-3.93159 -4.463417,-5.87845 -2.968456,-4.19771 -2.296208,-3.41451 -4.137707,-6.13155 -1.336068,-1.9713 -3.445653,-2.6487 -5.665474,-3.51096 -2.219821,-0.86226 -4.71266,-1.11623 -7.005012,-0.47108 -3.021449,0.85034 -5.489775,3.23113 -6.802912,6.08208 -1.313136,2.85095 -1.54284,6.12313 -1.031948,9.2201 0.659095,3.99536 2.486278,7.70258 4.54639,11.18873 2.326679,3.93724 5.021993,7.72707 8.53596,10.65407 3.667149,3.05459 8.101532,5.06875 11.82037,8.0602"
+ id="path29705-5-0"
+ style="fill:#020204" />
+ <path
+ transform="translate(160,-57.362183)"
+ style="fill:#020204"
+ d="m -69.527091,194.03592 c -7.073089,8.03686 -14.352222,15.81627 -18.345769,24.50506 -1.976249,4.41329 -2.910774,9.20725 -4.26498,13.84932 -1.537901,5.27176 -3.626089,10.3703 -5.97071,15.33612 -2.16496,4.58531 -4.54982,9.06291 -6.93891,13.53553 -1.7382,3.25409 -3.50514,6.58104 -4.10782,10.22071 -0.47628,2.87632 -0.1985,5.84423 0.53375,8.66626 0.73225,2.82202 1.90965,5.5106 3.23776,8.10601 5.667249,11.07504 14.170032,20.62168 24.24176,27.92472 4.570626,3.31418 9.466691,6.18109 14.60245,8.52595 2.782468,1.27041 5.713552,2.40436 8.771859,2.45744 1.529154,0.0265 3.074104,-0.22544 4.47434,-0.84055 1.400236,-0.6151 2.650677,-1.60373 3.482541,-2.88709 1.022778,-1.5779 1.369917,-3.53829 1.164614,-5.40743 -0.205303,-1.86914 -0.934843,-3.65294 -1.913244,-5.25873 -2.389971,-3.92251 -6.165196,-6.76055 -9.79642,-9.57343 -7.840549,-6.07358 -15.424654,-12.48039 -22.68212,-19.23996 -2.049117,-1.90854 -4.098407,-3.87759 -5.53019,-6.28412 -1.394295,-2.34352 -2.147602,-5.01376 -2.65783,-7.69253 -1.399719,-7.34873 -1.040921,-15.08286 1.45958,-22.13343 0.978222,-2.75826 2.271183,-5.39201 3.51815,-8.03965 2.161326,-4.58906 4.207248,-9.26564 7.04933,-13.46723 3.537978,-5.23037 8.267489,-9.66049 11.15147,-15.27803 2.434229,-4.74149 3.419942,-10.07236 4.36185,-15.31831 0.736933,-4.10434 2.150416,-8.12437 2.869234,-12.23193 -1.406111,2.66567 -5.937961,7.04283 -8.710695,10.5253 z"
+ id="path14967-1-0" />
+ </g>
+ <g
+ id="g514">
+ <path
+ style="fill:#838384;filter:url(#filter14666-9)"
+ d="m 290.78125,216.01843 c 0.48482,0.46774 0.98091,0.94261 1.5,1.375 3.66715,3.05459 5.61879,6.48526 9.33763,9.47671 6.0848,4.89463 12.25895,13.34358 13.45434,21.06066 0.93229,6.01859 -0.30093,9.28947 -1.80468,16.3878 -1.50374,7.09832 -5.76944,17.14832 -8.07376,23.99211 -0.9189,2.7291 1.86121,1.60306 1.49609,4.4798 -0.17944,1.41384 -0.19766,2.84238 -0.0346,4.25917 0.0227,-0.27104 0.0388,-0.5525 0.0693,-0.82194 0.44281,-3.92274 1.62331,-7.69479 2.90878,-11.39514 2.47416,-7.12214 5.31434,-14.10109 7.27196,-21.40792 1.95763,-7.30683 1.74028,-12.56443 0.71875,-18.84375 -1.28459,-7.89637 -5.79703,-15.18702 -12.1875,-20 -4.51852,-3.40313 -9.84688,-5.58465 -14.65625,-8.5625 z"
+ id="path29705-9"
+ clip-path="url(#clipPath504)"
+ transform="matrix(1.0180731,0,0,1,-105.25547,-58.362183)" />
+ <path
+ style="opacity:0.95;fill:#7c7c7c;filter:url(#filter15053-7)"
+ d="m 232.33049,224.26954 c -2.32126,2.13749 -4.33307,4.61051 -5.95338,7.31823 -2.66801,4.45854 -4.23905,9.46835 -6.17809,14.28882 -1.44362,3.58886 -3.12519,7.19314 -3.32662,11.05622 -0.10346,1.98418 0.19056,3.96588 0.25671,5.95165 0.0662,1.98578 -0.11756,4.05108 -1.08967,5.78391 -0.81338,1.44988 -2.1659,2.58902 -3.73298,3.14402 2.11547,0.70686 4.00453,2.07546 5.33532,3.86539 1.11451,1.49902 1.82759,3.25366 2.79609,4.85091 0.78716,1.29818 1.75335,2.50124 2.94285,3.44463 1.1895,0.94339 2.61141,1.61974 4.11726,1.81293 2.06623,0.26508 4.23574,-0.42815 5.76541,-1.84225 -1.92538,-18.0357 -0.16195,-36.4572 5.15013,-53.80008 0.33544,-1.09515 0.68725,-2.19828 0.77034,-3.34063 0.0831,-1.14235 -0.12896,-2.34792 -0.82414,-3.2582 -0.37014,-0.48467 -0.86838,-0.87059 -1.4302,-1.1078 -0.56182,-0.2372 -1.18588,-0.32512 -1.79136,-0.25236 -0.60549,0.0727 -1.19096,0.306 -1.68059,0.66954 -0.48964,0.36355 -0.88227,0.85651 -1.12706,1.41507 h -2e-5"
+ id="path15007-0"
+ clip-path="url(#clipPath508)"
+ transform="translate(-150.00016,-58.362183)" />
+ </g>
+ <g
+ id="g457">
+ <g
+ id="g444">
+ <path
+ transform="matrix(1.0268828,0,0,1,157.6864,-58.362183)"
+ style="opacity:0.2;fill:url(#linearGradient18840);filter:url(#filter15115-3)"
+ d="m 86.05618,328.13191 c -0.45671,1.54919 -1.15216,3.04585 -2.04962,4.41089 -1.9805,3.01237 -4.85449,5.2794 -7.7268,7.37015 -4.89889,3.56589 -10.00272,6.83785 -14.56318,10.89029 -3.05551,2.71513 -5.84112,5.75937 -8.42278,8.96491 -2.20789,2.74146 -4.2839,5.61929 -6.80089,8.05729 -2.53964,2.45993 -5.53049,4.44676 -8.75187,5.52933 -3.91796,1.31667 -8.05795,1.2533 -11.83233,0.25938 -2.64475,-0.69647 -5.22365,-1.90703 -6.86216,-4.0969 -1.6448,-2.19828 -2.1777,-5.15218 -2.36802,-8.05186 -0.33651,-5.12875 0.25967,-10.36956 0.8034,-15.57549 0.45167,-4.3257 0.86825,-8.65475 1.03855,-12.97167 0.30984,-7.85202 -0.19668,-15.63586 -1.23186,-23.27336 -0.17336,-1.27909 -0.36202,-2.56818 -0.25656,-3.88562 0.10519,-1.31741 0.5354,-2.6883 1.43615,-3.70529 0.83202,-0.93937 1.9928,-1.49566 3.15071,-1.76892 1.15792,-0.27325 2.32983,-0.2898 3.4927,-0.3215 2.74018,-0.0747 5.49647,-0.24039 8.19521,0.006 1.70282,0.15559 3.37264,0.47459 5.07313,0.6427 2.83764,0.28052 5.78134,0.13286 8.62739,-0.72369 3.06405,-0.92215 5.98631,-2.65158 9.09944,-3.12742 1.27732,-0.19521 2.559,-0.17251 3.80104,0.006 1.26746,0.18218 2.5284,0.54175 3.50235,1.33598 0.74019,0.60362 1.28194,1.43281 1.70583,2.31655 0.63144,1.31651 1.01921,2.77031 1.24115,4.2613 0.19663,1.32082 0.26639,2.68017 0.59789,3.95737 0.54536,2.10123 1.78089,3.88647 3.26736,5.33963 1.48646,1.45316 3.22499,2.60245 4.96058,3.73413 1.72907,1.12743 3.46794,2.24684 5.31472,3.17629 0.86675,0.43621 1.75751,0.83074 2.58612,1.33307 0.8286,0.50234 1.60071,1.12107 2.15093,1.93549 0.74634,1.10471 1.04569,2.55273 0.82168,3.97474 l 2e-5,-1e-5"
+ id="path14483-7-4" />
+ <path
+ clip-path="none"
+ id="path14296-0"
+ d="m 263.18967,278.25167 c -2.6238,3.11482 -6.268,5.17039 -9.89648,7.01985 -6.1886,3.15437 -12.60169,5.92177 -18.41964,9.71654 -3.89802,2.54249 -7.4959,5.52671 -10.86016,8.74238 -2.87719,2.75012 -5.60582,5.68745 -8.83247,8.01771 -3.25567,2.35122 -7.01915,4.05426 -10.99061,4.6502 -4.83026,0.72481 -9.82134,-0.21289 -14.29898,-2.16416 -3.13754,-1.36728 -6.15569,-3.3229 -7.96301,-6.22931 -1.81425,-2.91754 -2.22807,-6.48813 -2.23266,-9.92375 -0.008,-6.07666 1.11824,-12.09004 2.17848,-18.07349 0.88097,-4.97177 1.71949,-9.95483 2.26013,-14.97502 0.98337,-9.13118 0.9763,-18.35278 0.3199,-27.51327 -0.10993,-1.53416 -0.23754,-3.0832 -0.008,-4.60412 0.22922,-1.52092 0.85475,-3.0367 2.02069,-4.03986 1.07696,-0.9266 2.52093,-1.33598 3.93947,-1.4145 1.41854,-0.0785 2.83404,0.14655 4.23982,0.35197 3.31254,0.48405 6.65159,0.8649 9.88917,1.71656 2.04284,0.53738 4.03315,1.25925 6.0722,1.81081 3.40258,0.92039 6.96639,1.36144 10.46739,0.95192 3.76917,-0.44089 7.42987,-1.85678 11.22363,-1.76474 1.55658,0.0378 3.1015,0.33171 4.58649,0.79985 1.51539,0.47772 3.00914,1.16182 4.12281,2.29512 0.84639,0.8613 1.43579,1.94539 1.87872,3.06879 0.65982,1.67352 1.01492,3.457 1.16703,5.24945 0.13475,1.58788 0.11343,3.19441 0.41433,4.75933 0.49503,2.57458 1.84746,4.92305 3.52848,6.93494 1.68102,2.01189 3.68982,3.72048 5.69641,5.40783 1.99908,1.68103 4.0106,3.35469 6.16708,4.82839 1.0121,0.69165 2.05642,1.33949 3.01736,2.10062 0.96094,0.76113 1.84466,1.6468 2.44543,2.71535 0.81492,1.44944 1.06377,3.2077 0.53758,4.87655 -0.5262,1.66885 -1.48162,3.27659 -2.67059,4.68806 z"
+ style="fill:url(#linearGradient18842)" />
+ <path
+ transform="translate(-250.00016,-58.362183)"
+ clip-path="url(#clipPath419)"
+ id="path14296-3-7"
+ d="m 512.89128,328.72435 c -0.61724,1.54745 -1.48971,2.99275 -2.57146,4.2598 -2.40248,2.814 -5.72921,4.65444 -9.03774,6.31099 -5.65305,2.83043 -11.50277,5.31761 -16.82133,8.73539 -3.55362,2.28361 -6.84076,4.96564 -9.9178,7.85959 -2.62917,2.47273 -5.12496,5.116 -8.06607,7.20809 -2.98093,2.12042 -6.41793,3.6468 -10.03693,4.18063 -4.40931,0.65041 -8.96019,-0.19314 -13.05822,-1.94562 -2.85719,-1.22185 -5.61733,-2.97002 -7.27205,-5.60029 -1.64629,-2.61688 -2.0313,-5.83002 -2.03893,-8.92166 -0.0135,-5.46467 1.01827,-10.87076 1.98945,-16.24846 0.80703,-4.46875 1.57531,-8.9482 2.06402,-13.46287 0.88853,-8.20825 0.8481,-16.49756 0.29214,-24.73502 -0.0931,-1.38017 -0.20023,-2.77381 0.0118,-4.14077 0.21204,-1.36695 0.77803,-2.72737 1.82595,-3.63036 0.9828,-0.84687 2.30304,-1.21795 3.5986,-1.28594 1.29556,-0.068 2.58744,0.14181 3.87096,0.3307 3.02315,0.4449 6.07241,0.77918 9.03106,1.54323 1.86541,0.48173 3.68372,1.13165 5.54531,1.62795 3.10947,0.82898 6.36227,1.22486 9.55911,0.8558 3.44127,-0.39728 6.78665,-1.67148 10.24974,-1.58654 1.42063,0.0348 2.83052,0.30037 4.1885,0.71908 1.38179,0.42605 2.74909,1.03446 3.76507,2.06337 0.76566,0.7754 1.29538,1.75352 1.7157,2.75891 0.62574,1.49674 1.03256,3.09742 1.06577,4.71936 0.0347,1.69374 -0.33552,3.39491 -0.10594,5.07338 0.18638,1.36264 0.7635,2.64802 1.50064,3.80912 0.73713,1.1611 1.634,2.2109 2.52251,3.26069 1.71726,2.02897 3.4393,4.09674 5.5931,5.65457 2.45218,1.77364 5.36188,2.81145 7.89508,4.46732 0.75511,0.49359 1.48596,1.05215 2.01814,1.78058 0.8972,1.22806 1.1387,2.90791 0.62379,4.33898 h 2e-5"
+ style="fill:#cd8907;filter:url(#filter14416-8)" />
+ <path
+ clip-path="url(#clipPath426)"
+ transform="matrix(1.1429721,0,0,1.2323048,-318.99817,-135.48838)"
+ id="path14296-3-1-9"
+ d="m 508.79285,327.92545 c -0.60151,1.26455 -1.38215,2.44372 -2.31134,3.49133 -2.15335,2.42776 -5.06099,4.09917 -8.12349,5.1725 -5.04166,1.76698 -10.54565,2.00437 -15.49471,4.01618 -3.01615,1.22607 -5.73063,3.07339 -8.47914,4.81871 -2.22174,1.41082 -4.49246,2.76887 -6.93206,3.75622 -2.75548,1.1152 -5.68568,1.74047 -8.62582,2.17857 -1.87082,0.27876 -3.76259,0.48423 -5.65156,0.38704 -1.88898,-0.0972 -3.78418,-0.50735 -5.45127,-1.40092 -1.26399,-0.6775 -2.40126,-1.6529 -3.07596,-2.91839 -0.74956,-1.4059 -0.87959,-3.05603 -0.86243,-4.64917 0.0457,-4.24592 1.02557,-8.4458 0.99617,-12.69186 -0.0256,-3.69614 -0.81525,-7.34495 -1.04231,-11.03419 -0.43665,-7.09457 1.2047,-14.31322 -0.23989,-21.27287 -0.23125,-1.11413 -0.54212,-2.22686 -0.52701,-3.36463 0.008,-0.56889 0.0988,-1.14101 0.31541,-1.66709 0.21661,-0.52609 0.56289,-1.00508 1.02461,-1.33751 0.38878,-0.27992 0.85044,-0.45024 1.32336,-0.52677 0.47292,-0.0765 0.95748,-0.0616 1.43166,0.007 0.94836,0.13656 1.85188,0.48215 2.77546,0.73718 2.64193,0.72952 5.43254,0.71432 8.11748,1.26484 1.68527,0.34555 3.31679,0.91149 4.98436,1.33427 2.80028,0.70996 5.72013,1.0133 8.59212,0.70142 3.0885,-0.33539 6.10714,-1.37534 9.21289,-1.30034 1.27305,0.0307 2.53741,0.25005 3.76479,0.58936 1.22771,0.3394 2.45538,0.81951 3.38421,1.69114 0.6693,0.62809 1.15135,1.4307 1.54214,2.26121 0.5703,1.21202 0.96726,2.52854 0.95796,3.868 -0.005,0.6968 -0.11899,1.38758 -0.18672,2.0811 -0.0677,0.69352 -0.0878,1.40368 0.0914,2.07705 0.18009,0.67656 0.55415,1.2867 0.98269,1.84033 0.42854,0.55364 0.91471,1.06002 1.35819,1.60176 1.24195,1.51713 2.12961,3.28544 3.09724,4.99067 0.96764,1.70523 2.05232,3.39266 3.58036,4.62117 2.0797,1.67204 4.77798,2.34016 7.09642,3.66141 0.67877,0.38682 1.33676,0.84082 1.81399,1.45937 0.38231,0.49552 0.63762,1.0882 0.73509,1.70642 0.0975,0.61822 0.0369,1.26071 -0.1744,1.84982 h 9e-5"
+ style="fill:#f5c021;filter:url(#filter14432-2)" />
+ <path
+ clip-path="url(#clipPath433)"
+ id="path16493"
+ d="m 187.30911,230.28754 c 3.27611,-0.88704 6.0662,1.5972 8.44228,3.47233 1.53527,1.30928 3.75348,0.97992 5.63665,1.04213 3.12069,-0.11321 6.22535,0.52281 9.34708,0.13577 6.14462,-0.51932 12.16847,-2.02966 18.34236,-2.28984 2.94948,-0.18579 6.25992,-0.35725 8.80813,1.36517 1.03299,0.7155 2.54702,3.74139 3.56647,2.60489 -0.42031,-3.17821 -2.77748,-6.25589 -5.93906,-7.10224 -2.47492,-0.38942 -4.98985,0.29134 -7.48947,0.0711 -7.42294,-0.17706 -14.79344,-1.5554 -22.23396,-1.16015 -5.17644,0.0448 -10.34657,-0.19501 -15.51546,-0.39662 -2.03057,-0.41489 -2.74674,1.38901 -3.8489,2.08085"
+ style="fill:url(#linearGradient18844);filter:url(#filter17044)" />
+ </g>
+ <g
+ id="g411">
+ <path
+ style="fill:url(#linearGradient18854)"
+ d="m 57.57688,222.65692 c 1.59929,-0.66295 3.3982,-0.78361 5.10074,-0.46963 1.70253,0.31398 3.31141,1.04948 4.74342,2.02239 2.86402,1.94583 4.98821,4.77774 7.02263,7.57952 4.67189,6.43406 9.16868,13.00227 13.24488,19.8293 3.30635,5.53766 6.34352,11.25685 10.16415,16.45304 2.49398,3.3919 5.3066,6.53947 7.813,9.92221 2.50639,3.38273 4.72794,7.05586 5.83931,11.11662 1.44411,5.27653 0.88463,11.09291 -1.62666,15.95302 -1.76663,3.41896 -4.47646,6.35228 -7.77242,8.33898 -3.29595,1.9867 -7.17064,3.01444 -11.01635,2.87021 -6.11413,-0.2293 -11.69944,-3.28515 -17.38362,-5.54906 -11.58097,-4.6125 -24.15978,-6.0594 -36.09666,-9.65174 -3.66859,-1.10404 -7.27582,-2.4107 -10.96988,-3.42629 -1.64125,-0.45122 -3.30866,-0.8482 -4.85875,-1.55144 -1.55008,-0.70325 -2.999548,-1.7491 -3.86171,-3.21675 -0.666391,-1.13439 -0.948386,-2.47002 -0.930187,-3.78554 0.0182,-1.31552 0.325889,-2.61453 0.773815,-3.85158 0.895851,-2.47409 2.343262,-4.71374 3.320162,-7.15696 1.59511,-3.98935 1.88169,-8.38839 1.66657,-12.67942 -0.21511,-4.29103 -0.91078,-8.54478 -1.20454,-12.83115 -0.13118,-1.91406 -0.18066,-3.85256 0.18479,-5.73598 0.36545,-1.88343 1.17577,-3.72459 2.55771,-5.05541 1.27406,-1.22693 2.96492,-1.95531 4.69643,-2.31651 1.73151,-0.3612 3.51533,-0.37747 5.28367,-0.33762 1.76833,0.0399 3.54067,0.13425 5.30351,-0.0106 1.76284,-0.14488 3.53347,-0.54055 5.06911,-1.41828 1.45996,-0.83447 2.65433,-2.0745 3.64374,-3.43424 0.9894,-1.35974 1.78909,-2.84573 2.60891,-4.31396 0.81983,-1.46823 1.66834,-2.93151 2.74157,-4.22611 1.07324,-1.2946 2.38923,-2.42304 3.94266,-3.06698"
+ id="path4635-1" />
+ <path
+ transform="translate(160,-57.362183)"
+ clip-path="url(#clipPath401)"
+ id="path13596-6"
+ d="m -99.89049,282.77885 c 1.45515,-0.58619 3.09423,-0.65064 4.62272,-0.30406 1.52849,0.34657 2.94957,1.09015 4.18836,2.047 2.47758,1.91371 4.19983,4.61379 5.85419,7.26861 3.97009,6.43306 7.8514,12.93381 11.5161,19.56716 2.7769,4.99324 5.4247,10.09253 8.83749,14.67892 2.26379,3.04154 4.84735,5.83139 7.15787,8.83675 2.31051,3.00536 4.37126,6.28214 5.3928,9.93347 1.31626,4.70582 0.78265,9.91001 -1.49541,14.23282 -1.63755,3.10576 -4.15203,5.74644 -7.18609,7.5126 -3.03406,1.76617 -6.57924,2.64923 -10.08655,2.48791 -5.59831,-0.25772 -10.71129,-3.05353 -15.98089,-4.95071 -10.10307,-3.66572 -21.05344,-4.15754 -31.41615,-7.02001 -3.71479,-1.00833 -7.33661,-2.35276 -11.06955,-3.29396 -1.65162,-0.41658 -3.33303,-0.75712 -4.90217,-1.4193 -1.56914,-0.66219 -3.04681,-1.68866 -3.89752,-3.16474 -0.63282,-1.09717 -0.88561,-2.38838 -0.84651,-3.65421 0.0391,-1.26584 0.35915,-2.51035 0.80992,-3.69386 0.90155,-2.36701 2.32025,-4.51029 3.22912,-6.87464 1.3787,-3.57425 1.54994,-7.50412 1.29397,-11.32617 -0.25597,-3.82205 -0.9211,-7.60949 -1.15326,-11.4336 -0.10374,-1.70896 -0.11933,-3.43899 0.22634,-5.11576 0.34564,-1.67677 1.07606,-3.30971 2.29486,-4.512 1.32089,-1.30904 3.14116,-2.02413 4.97727,-2.30427 1.83611,-0.28013 3.70601,-0.15808 5.55479,0.007 1.84877,0.16495 3.70503,0.37271 5.56113,0.26163 1.85609,-0.11109 3.7357,-0.56331 5.26886,-1.60694 1.39737,-0.94461 2.44584,-2.32407 3.24439,-3.79842 0.79856,-1.47435 1.3676,-3.05544 1.97644,-4.61656 0.60885,-1.56113 1.26672,-3.12189 2.2218,-4.50973 0.95509,-1.38785 2.23612,-2.60467 3.80568,-3.23473"
+ style="fill:#d99a03;filter:url(#filter14148-8)" />
+ <path
+ clip-path="url(#clipPath391)"
+ transform="matrix(1,0,0,0.98204782,-80.00015,-54.40321)"
+ style="fill:#f5bd0c;filter:url(#filter14140-3)"
+ d="m 138.7532,281.23531 c 1.40907,-0.7122 3.07062,-0.85812 4.61642,-0.53681 1.54579,0.3213 2.97823,1.09063 4.19572,2.09584 2.43498,2.0104 3.98026,4.8747 5.41939,7.68535 3.30494,6.45466 6.3834,13.04983 10.33791,19.12824 2.86875,4.40952 6.17965,8.51701 9.08155,12.90479 3.93557,5.95071 7.13582,12.4957 8.45639,19.50682 0.88822,4.71571 0.85899,9.80955 -1.37244,14.05779 -1.46869,2.79611 -3.85002,5.08988 -6.66339,6.52522 -2.81337,1.43533 -6.0432,2.01701 -9.18889,1.73441 -4.95423,-0.44507 -9.4537,-2.92512 -14.11748,-4.65475 -8.27469,-3.06879 -17.21809,-3.80325 -25.73435,-6.1187 -3.59196,-0.9766 -7.10999,-2.23521 -10.7509,-3.00963 -1.60616,-0.34163 -3.24361,-0.59125 -4.77675,-1.17943 -1.53313,-0.58818 -2.98623,-1.56578 -3.76965,-3.00894 -0.55139,-1.01573 -0.73656,-2.20459 -0.65433,-3.3574 0.0822,-1.15282 0.42084,-2.27486 0.86462,-3.34201 0.88755,-2.13429 2.20087,-4.08935 2.89035,-6.29561 1.01321,-3.24214 0.59672,-6.75718 -0.1636,-10.06777 -0.76031,-3.31059 -1.85667,-6.56127 -2.19448,-9.94121 -0.15046,-1.50543 -0.14681,-3.03993 0.19136,-4.51458 0.33818,-1.47465 1.02687,-2.89176 2.10855,-3.94955 1.3932,-1.36244 3.34372,-2.03997 5.28315,-2.22925 1.93944,-0.18927 3.89217,0.0689 5.82027,0.3512 1.9281,0.28227 3.86824,0.59003 5.8148,0.49986 1.94656,-0.0902 3.92849,-0.61081 5.45316,-1.82432 1.50782,-1.20011 2.45577,-2.98713 2.99939,-4.83599 0.54362,-1.84885 0.71997,-3.78191 0.94267,-5.69612 0.2227,-1.91421 0.50044,-3.8462 1.22971,-5.63 0.72928,-1.7838 1.96094,-3.42814 3.68085,-4.29745"
+ id="path4635-2-4" />
+ <path
+ style="fill:url(#linearGradient18856);filter:url(#filter14176-5)"
+ d="m 76.40702,237.60723 c 2.60622,4.71337 4.1958,10.12156 6.78125,14.875 2.3781,4.37223 5.08446,8.87379 7.5,12.90625 1.07545,1.79534 3.58329,4.5546 6.11895,8.83731 2.29771,3.88081 4.61826,9.29715 5.91658,11.1158 -0.74552,-2.12877 -2.27926,-7.84655 -4.10875,-11.92255 -1.70955,-3.80877 -3.69976,-5.98219 -4.92678,-8.03056 -2.41553,-4.03246 -5.01691,-7.65647 -7.5,-11.5 -3.42521,-5.30181 -6.03558,-11.23523 -9.78125,-16.28125 z"
+ id="path4792-8" />
+ </g>
+ </g>
+ <g
+ id="g526">
+ <path
+ d="m 231.4835,237.27796 c -0.56258,-1.10201 -1.58692,-1.92585 -2.72873,-2.40251 -1.1418,-0.47667 -2.39692,-0.6289 -3.63419,-0.61936 -2.47454,0.0191 -4.93459,0.66357 -7.39999,0.45028 -2.0826,-0.18018 -4.05875,-0.96301 -6.08982,-1.45739 -2.09726,-0.51049 -4.32188,-0.70969 -6.40465,-0.14297 -2.22595,0.60568 -4.18942,2.09362 -5.41915,4.04541 -1.08426,1.72091 -1.59909,3.75274 -1.76111,5.78028 -0.16202,2.02754 0.013,4.06578 0.21815,6.08941 0.1484,1.46363 0.31354,2.93079 0.66764,4.35866 0.35411,1.42788 0.90422,2.82282 1.76608,4.01506 1.24071,1.71632 3.08337,2.9395 5.06938,3.67497 3.24183,1.20053 6.9338,1.13597 10.13167,-0.17718 5.65885,-2.45702 10.44922,-6.8639 13.36879,-12.29857 1.04539,-1.94596 1.8574,-4.01932 2.38189,-6.16513 0.20845,-0.85283 0.37215,-1.72236 0.37977,-2.60027 0.008,-0.8779 -0.14655,-1.76875 -0.54573,-2.55069"
+ id="path29714-8-2"
+ style="opacity:0.35;fill:url(#radialGradient18846);filter:url(#filter14897-2)" />
+ <path
+ d="m 71.483661,295.64014 c -0.562575,-1.10201 -1.586921,-1.92585 -2.728725,-2.40251 -1.141803,-0.47667 -2.396928,-0.6289 -3.634197,-0.61936 -2.474537,0.0191 -4.934587,0.66357 -7.399988,0.45028 -2.082597,-0.18018 -4.058745,-0.96301 -6.08982,-1.45739 -2.097262,-0.51049 -4.321879,-0.70969 -6.40465,-0.14297 -2.225952,0.60568 -4.189424,2.09362 -5.41915,4.04541 -1.084262,1.72091 -1.599093,3.75274 -1.76111,5.78028 -0.162016,2.02754 0.01297,4.06578 0.21815,6.08941 0.148398,1.46363 0.31354,2.93079 0.667645,4.35866 0.354105,1.42788 0.904219,2.82282 1.766075,4.01506 1.240713,1.71632 3.083374,2.9395 5.06938,3.67497 3.241832,1.20053 6.933796,1.13597 10.13167,-0.17718 5.658851,-2.45702 10.449216,-6.8639 13.36879,-12.29857 1.045394,-1.94596 1.857401,-4.01932 2.38189,-6.16513 0.208453,-0.85283 0.372151,-1.72236 0.379775,-2.60027 0.0076,-0.8779 -0.146556,-1.76875 -0.545735,-2.55069"
+ id="path29714-8-3-0"
+ style="opacity:0.35;fill:url(#radialGradient18848);filter:url(#filter14951-8)"
+ transform="matrix(1,0,0,0.72292525,159.99984,20.396294)" />
+ </g>
+ <g
+ id="g545">
+ <path
+ d="m 76.1875,285.32775 c -0.405158,-1.10369 -1.118445,-2.08156 -1.990705,-2.86987 -0.872259,-0.78832 -1.900482,-1.39229 -2.982775,-1.85155 -2.164587,-0.91852 -4.520525,-1.26149 -6.83152,-1.69556 -2.179187,-0.40931 -4.34179,-0.90631 -6.52782,-1.27734 -2.27136,-0.38551 -4.617897,-0.63213 -6.8653,-0.1253 -1.965827,0.44333 -3.784499,1.45879 -5.271724,2.81864 -1.487225,1.35984 -2.649109,3.0564 -3.484986,4.89007 -1.472176,3.22952 -1.934512,6.86503 -1.65394,10.40316 0.208815,2.63325 0.875323,5.34594 2.60877,7.33912 1.400654,1.61052 3.387329,2.61526 5.43398,3.22092 3.525017,1.04316 7.366632,0.98822 10.86038,-0.1553 5.766894,-1.93113 10.875681,-5.77387 14.33034,-10.77903 1.138609,-1.64963 2.112174,-3.44809 2.5532,-5.4034 0.335973,-1.48955 0.348308,-3.08112 -0.1779,-4.51456"
+ id="path29714-5-4"
+ style="fill:#020204"
+ transform="translate(159.99984,-58.362183)" />
+ <path
+ style="fill:url(#radialGradient18850);filter:url(#filter14812-5)"
+ d="m 362.21875,276.45593 c -0.54933,0.0306 -1.08144,0.0909 -1.625,0.1875 -3.46951,0.61686 -6.64705,2.80857 -8.4375,5.84375 -1.26396,2.14267 -1.83985,4.67634 -1.65625,7.15625 0.0732,-1.74163 0.52946,-3.44685 1.375,-4.96875 1.43442,-2.58185 4.03238,-4.52979 6.9375,-5.0625 1.78976,-0.32819 3.63182,-0.13095 5.4375,0.0937 1.73256,0.2156 3.48115,0.44287 5.1875,0.8125 2.64101,0.57209 5.25428,1.45135 7.46875,3 0.51646,0.36118 0.99955,0.76857 1.40625,1.25 0.40669,0.48143 0.72188,1.03792 0.84375,1.65625 0.17824,0.90428 -0.0794,1.85295 -0.53125,2.65625 -0.45189,0.8033 -1.06491,1.50665 -1.71875,2.15625 -0.52923,0.5258 -1.09482,1.03417 -1.65625,1.53125 2.559,-0.49571 5.15199,-1.19766 7.28125,-2.6875 0.89975,-0.62955 1.71523,-1.38464 2.25,-2.34375 0.53477,-0.95912 0.76245,-2.1212 0.5,-3.1875 -0.17714,-0.71971 -0.57137,-1.3824 -1.0625,-1.9375 -0.49114,-0.55511 -1.0805,-1.01217 -1.6875,-1.4375 -2.67877,-1.87701 -5.81493,-3.07854 -9.0625,-3.46875 -2.08149,-0.38286 -4.18122,-0.70597 -6.28125,-0.96875 -1.64344,-0.20564 -3.32077,-0.37313 -4.96875,-0.28125 z"
+ id="path29714-3-9-9"
+ clip-path="url(#clipPath533)"
+ transform="translate(-150.00016,-58.362183)" />
+ <path
+ style="fill:url(#linearGradient18852);filter:url(#filter14812-0-9)"
+ d="m 362.21875,276.45593 c -0.54933,0.0306 -1.08144,0.0909 -1.625,0.1875 -3.46951,0.61686 -6.64705,2.80857 -8.4375,5.84375 -1.26396,2.14267 -1.83985,4.67634 -1.65625,7.15625 0.0732,-1.74163 0.52946,-3.44685 1.375,-4.96875 1.43442,-2.58185 4.03238,-4.52979 6.9375,-5.0625 1.78976,-0.32819 3.63182,-0.13095 5.4375,0.0937 1.73256,0.2156 3.48115,0.44287 5.1875,0.8125 2.64101,0.57209 5.25428,1.45135 7.46875,3 0.51646,0.36118 0.99955,0.76857 1.40625,1.25 0.40669,0.48143 0.72188,1.03792 0.84375,1.65625 0.17824,0.90428 -0.0794,1.85295 -0.53125,2.65625 -0.45189,0.8033 -1.06491,1.50665 -1.71875,2.15625 -0.52923,0.5258 -1.09482,1.03417 -1.65625,1.53125 2.559,-0.49571 5.15199,-1.19766 7.28125,-2.6875 0.89975,-0.62955 1.71523,-1.38464 2.25,-2.34375 0.53477,-0.95912 0.76245,-2.1212 0.5,-3.1875 -0.17714,-0.71971 -0.57137,-1.3824 -1.0625,-1.9375 -0.49114,-0.55511 -1.0805,-1.01217 -1.6875,-1.4375 -2.67877,-1.87701 -5.81493,-3.07854 -9.0625,-3.46875 -2.08149,-0.38286 -4.18122,-0.70597 -6.28125,-0.96875 -1.64344,-0.20564 -3.32077,-0.37313 -4.96875,-0.28125 z"
+ id="path29714-3-9-3-8"
+ clip-path="url(#clipPath538)"
+ transform="translate(-150.00016,-58.36218)" />
+ </g>
+ <g
+ id="g777">
+ <g
+ id="g669">
+ <g
+ id="g643">
+ <path
+ id="path28795-9-5"
+ d="m -24.767558,113.36218 c -1.780966,0.097 -3.484616,0.91899 -4.787852,2.1367 -1.303235,1.21771 -2.221372,2.81176 -2.786181,4.50357 -1.129618,3.38363 -0.87548,7.05177 -0.618697,10.60973 0.23251,3.22162 0.470404,6.50533 1.676785,9.50158 0.60319,1.49813 1.450246,2.91021 2.580338,4.06395 1.130092,1.15374 2.551736,2.04189 4.118297,2.43447 1.468838,0.36809 3.03816,0.29183 4.482783,-0.16209 1.444622,-0.45392 2.763916,-1.27887 3.846235,-2.33791 1.57904,-1.54507 2.643262,-3.5662 3.253449,-5.68947 0.610186,-2.12328 0.784157,-4.35155 0.752401,-6.56053 -0.03974,-2.76435 -0.400909,-5.53851 -1.265755,-8.16439 -0.864846,-2.62588 -2.245743,-5.10327 -4.172795,-7.08561 -0.933308,-0.96009 -1.997765,-1.80513 -3.198585,-2.39747 -1.200819,-0.59233 -2.543439,-0.92535 -3.880423,-0.85253"
+ style="fill:url(#radialGradient18806)"
+ transform="translate(138.99984,-49.362181)" />
+ <g
+ id="g605">
+ <path
+ transform="translate(-50.00015,-58.362183)"
+ style="fill:#020204"
+ id="path29453-9"
+ d="m 159.93889,137.11161 c -0.37211,2.24574 -0.38563,4.60199 0.3864,6.74344 0.50979,1.41404 1.35041,2.69692 2.37218,3.79935 0.66903,0.72184 1.42824,1.37779 2.31576,1.80318 0.88752,0.42539 1.91578,0.60638 2.87035,0.36671 0.88113,-0.22123 1.65156,-0.78859 2.22013,-1.49715 0.56856,-0.70857 0.9476,-1.55295 1.2177,-2.42034 0.7974,-2.56075 0.66926,-5.36165 -0.12241,-7.92418 -0.5768,-1.86701 -1.53208,-3.66794 -3.02664,-4.9268 -0.71307,-0.60061 -1.54773,-1.07115 -2.45479,-1.28664 -0.90707,-0.2155 -1.88874,-0.16505 -2.73754,0.22063 -0.9423,0.42817 -1.67159,1.24304 -2.14907,2.16134 -0.47749,0.91829 -0.72288,1.93936 -0.89207,2.96046" />
+ <path
+ style="fill:url(#linearGradient18820);filter:url(#filter29493-2)"
+ d="m 114.68735,77.124997 c 0.24185,0.6337 1.05418,0.86381 1.5,1.375 0.43302,0.49651 0.88735,1.01055 1.125,1.625 0.4549,1.17616 -0.4488,2.91931 0.5,3.75 0.29782,0.26075 0.89472,0.26639 1.1875,0 1.14539,-1.04215 0.89094,-3.14433 0.4375,-4.625 -0.4115,-1.34371 -1.42747,-2.61637 -2.67923,-3.25512 -0.57882,-0.29536 -1.45077,-0.54089 -1.94577,-0.11988 -0.31898,0.2713 -0.27431,0.85878 -0.125,1.25 z"
+ id="path29465-8" />
+ </g>
+ <path
+ transform="translate(59.99984,-58.362183)"
+ clip-path="url(#clipPath631)"
+ style="fill:url(#radialGradient18832)"
+ d="m 50.39208,129.52717 c 2.68537,-1.59933 5.95507,-1.97034 9.066699,-1.67565 3.111629,0.29468 6.125434,1.20847 9.141301,2.02921 2.211625,0.60188 4.451579,1.16149 6.525325,2.13777 2.073747,0.97627 3.99989,2.41568 5.141935,4.40296 0.183191,0.31877 0.345257,0.6497 0.539254,0.96201 0.193996,0.31232 0.42311,0.60867 0.716456,0.83031 0.293346,0.22164 0.656994,0.3643 1.024107,0.34424 0.183557,-0.01 0.365612,-0.0609 0.524176,-0.15388 0.158563,-0.093 0.292945,-0.22871 0.377987,-0.39169 0.09778,-0.18739 0.128079,-0.40446 0.117139,-0.61554 -0.01094,-0.21108 -0.06122,-0.41805 -0.117139,-0.62189 -0.755202,-2.75296 -2.53499,-5.08832 -3.88909,-7.6014 -0.8126,-1.5081 -1.476963,-3.09273 -2.2981,-4.5962 -2.81829,-5.16019 -7.443597,-9.21564 -12.701405,-11.84733 -5.257808,-2.6317 -11.127445,-3.89613 -16.997075,-4.23934 -6.801182,-0.39768 -13.619761,0.40945 -20.32932,1.59099 -2.908599,0.5122 -5.86079,1.11511 -8.435686,2.56156 -1.287447,0.72322 -2.467452,1.65662 -3.388474,2.81087 -0.921022,1.15425 -1.576477,2.53523 -1.78765,3.99673 -0.203522,1.40855 0.0088,2.86057 0.501301,4.19582 0.492484,1.33524 1.258246,2.5585 2.156537,3.66236 1.796584,2.20771 4.100665,3.93361 6.222432,5.83092 2.121308,1.8969 4.09001,3.99204 6.462948,5.56282 1.186469,0.78539 2.472664,1.43499 3.843385,1.81666 1.37072,0.38166 2.829918,0.48917 4.223827,0.20358 1.444987,-0.29606 2.782689,-1.005 3.953624,-1.90197 1.170934,-0.89697 2.186129,-1.98006 3.148417,-3.09793 1.924576,-2.23575 3.722539,-4.68648 6.257089,-6.19599"
+ id="path29551-9" />
+ <path
+ transform="translate(160,-57.362183)"
+ id="path28795-9-2-2"
+ d="m -38.437655,119.37798 c 2.5037,2.34533 4.36502,5.2397 5.625,8.30939 -0.550665,-3.38469 -1.423402,-6.10373 -3.625,-8.30939 -1.35129,-1.26581 -2.88639,-2.37775 -4.625,-3.1587 -1.52128,-0.68334 -3.213598,-1.10788 -4.180828,-1.12552 -0.96723,-0.0176 -1.2022,0.004 -1.40094,0.0134 -0.19874,0.009 -0.35739,0.0162 0.27185,0.0877 0.62924,0.0715 2.03368,0.45118 3.541104,1.12827 1.507424,0.6771 3.042524,1.78904 4.393814,3.05485 z"
+ style="fill:url(#linearGradient18818);filter:url(#filter29447-1)" />
+ </g>
+ <g
+ id="g652">
+ <path
+ id="path28795-3"
+ d="m 6.7500001,113.36218 c -2.780425,1.91023 -5.110569,4.57487 -6.24999996,7.75 -1.4360294,4.00163 -0.88583807,8.48071 0.49999996,12.5 1.4194877,4.11688 3.793788,8.04098 7.37932,10.51234 1.7927659,1.23567 3.8680909,2.08301 6.0304019,2.33859 2.162311,0.25558 4.409274,-0.0949 6.340278,-1.10093 2.353116,-1.22596 4.147816,-3.37278 5.262172,-5.78076 1.114356,-2.40798 1.588797,-5.0701 1.737828,-7.71924 0.189892,-3.37546 -0.140469,-6.80646 -1.25,-10 -1.205266,-3.46909 -3.390051,-6.67055 -6.472754,-8.6666 -1.541351,-0.99803 -3.291947,-1.68356 -5.110883,-1.93515 -1.818936,-0.25158 -3.704766,-0.0633 -5.4163629,0.60175 -0.9754713,0.37901 -1.8874384,0.9074 -2.75,1.5"
+ style="fill:url(#radialGradient18808)"
+ transform="translate(138.99984,-49.362181)" />
+ <g
+ id="g613">
+ <path
+ transform="translate(-150.00015,-58.362183)"
+ style="fill:#020204"
+ id="path28879-6"
+ d="m 302.16152,130.75695 c -1.04548,0.0749 -2.06437,0.4318 -2.95135,0.99028 -0.88699,0.55848 -1.64327,1.31521 -2.23701,2.17899 -1.18748,1.72757 -1.70894,3.84675 -1.793,5.94139 -0.0631,1.5723 0.11098,3.16512 0.63245,4.64977 0.52147,1.48465 1.40089,2.85877 2.61276,3.86251 1.24011,1.02713 2.81647,1.64364 4.42485,1.72094 1.60838,0.0773 3.23948,-0.38665 4.56105,-1.3066 1.05288,-0.73292 1.9021,-1.74168 2.50666,-2.87315 0.60455,-1.13148 0.96879,-2.38348 1.1353,-3.65549 0.29411,-2.24678 -0.0385,-4.59295 -1.07692,-6.60695 -1.03841,-2.01401 -2.80051,-3.67269 -4.92674,-4.45606 -0.92093,-0.3393 -1.90911,-0.51576 -2.88805,-0.44563" />
+ <path
+ style="fill:#141413;filter:url(#filter28927-8)"
+ d="m 154.6561,79.249997 c -0.86591,0.34162 -2.23657,0.12677 -2.61622,0.9767 -0.22493,0.50357 0.0927,1.33252 0.60343,1.54061 1.03244,0.42063 2.63193,-0.34111 3.04876,-1.3751 0.18104,-0.4491 -0.0934,-1.16101 -0.53974,-1.34865 -0.16515,-0.0694 -0.32958,0.14069 -0.49623,0.20644 z"
+ id="path28891-5" />
+ <path
+ style="fill:url(#linearGradient18812);filter:url(#filter28949-8)"
+ d="m 158.62485,81.499997 c 1.16113,-1.16113 -0.82613,-4.23951 -2.375,-5.5 -1.12184,-0.91296 -4.39063,-1.86851 -4.25,-0.875 0.14063,0.99351 1.60988,2.26647 2.59467,3.23744 1.21236,1.19533 3.47886,3.68903 4.03033,3.13756 z"
+ id="path28887-6" />
+ </g>
+ <path
+ transform="translate(59.99984,-58.362183)"
+ clip-path="url(#clipPath622)"
+ id="path28972-5"
+ d="m 75.25,132.48718 c 2.383746,-1.98014 5.160908,-3.48474 8.12154,-4.40008 6.085564,-1.88147 12.999677,-1.13706 18.37846,2.27508 1.85708,1.17808 3.51244,2.64192 5.23935,4.00367 1.72691,1.36176 3.56115,2.64122 5.63565,3.37133 1.12086,0.39448 2.31818,0.62345 3.5,0.5 1.06768,-0.11153 2.09928,-0.5118 2.98444,-1.11915 0.88515,-0.60736 1.62476,-1.4185 2.18064,-2.33686 1.11176,-1.8367 1.47001,-4.06457 1.27839,-6.20298 -0.38324,-4.27682 -2.79556,-8.05341 -4.81847,-11.84101 -0.63342,-1.18598 -1.23642,-2.39333 -2,-3.5 -2.34327,-3.39616 -6.07312,-5.63562 -9.98498,-6.94794 -3.91185,-1.31233 -8.046257,-1.78639 -12.14002,-2.30206 -1.825736,-0.22998 -3.673032,-0.46998 -5.5,-0.25 -2.099797,0.25283 -4.075978,1.101 -6.125,1.625 -0.972648,0.24874 -1.963662,0.42478 -2.928029,0.70391 -0.964366,0.27912 -1.912957,0.669 -2.696971,1.29609 -1.144817,0.91567 -1.865056,2.29088 -2.176504,3.72338 -0.311449,1.4325 -0.240517,2.92444 -0.01161,4.37242 0.457809,2.89597 1.540886,5.72407 1.438116,8.6542 -0.07058,2.01227 -0.702287,3.98797 -0.625,6 0.02266,0.58987 0.106588,1.17738 0.25,1.75"
+ style="fill:url(#linearGradient18814)" />
+ <path
+ transform="translate(160,-57.362183)"
+ id="path28795-92-2"
+ d="m -4.593905,113.125 c -0.47695,0.59985 -0.90798,1.25231 -1.25,1.96875 2.14641,0.46247 4.19906,1.34575 6.03125,2.5625 3.54507,2.35427 6.237,5.7965 8.125,9.625 0.44076,-0.48807 0.84202,-1.01184 1.1875,-1.59375 -1.89751,-3.9878 -4.64382,-7.5949 -8.3125,-10.03125 -1.76231,-1.17035 -3.72465,-2.05369 -5.78125,-2.53125 z"
+ style="fill:url(#linearGradient18816);filter:url(#filter29350-1)" />
+ </g>
+ </g>
+ <g
+ id="g735">
+ <path
+ transform="translate(138.99984,-49.362181)"
+ style="fill:url(#radialGradient18810)"
+ d="m -16.39938,136.86218 c 1.767366,-1.98662 2.976192,-4.41053 4.674142,-6.45679 0.848975,-1.02314 1.8284211,-1.95533 2.9816817,-2.61681 1.1532606,-0.66147 2.4919769,-1.0411 3.8165164,-0.9264 1.4744902,0.12769 2.8545436,0.86228 3.93407466,1.87472 1.07953103,1.01244 1.8797683,2.29027 2.51864534,3.62528 0.6117397,1.27831 1.0977635,2.64027 1.97912,3.75 0.940326,1.18398 2.2595274,1.99218 3.4510909,2.92288 0.5957818,0.46535 1.167477,0.96911 1.6383978,1.5605 0.4709209,0.59139 0.8396117,1.27595 0.9909913,2.01662 0.1537234,0.75214 0.077153,1.54506 -0.1851792,2.26653 -0.2623326,0.72148 -0.7066964,1.37174 -1.2596263,1.90429 -1.1058598,1.0651 -2.6135811,1.63957 -4.1338116,1.85466 -3.04046123,0.43016 -6.1146629,-0.47583 -9.1842429,-0.39142 -3.1068902,0.0854 -6.1415551,1.18366 -9.2475441,1.07007 -1.552994,-0.0568 -3.128063,-0.43624 -4.404252,-1.32301 -0.638094,-0.44339 -1.194008,-1.01055 -1.595831,-1.6756 -0.401824,-0.66505 -0.646688,-1.42894 -0.672863,-2.20552 -0.02497,-0.74092 0.148043,-1.48088 0.444075,-2.16055 0.296033,-0.67967 0.712681,-1.30175 1.182123,-1.87552 0.938883,-1.14753 2.086993,-2.10617 3.072492,-3.21393"
+ id="path28849-2" />
+ <g
+ id="g712">
+ <path
+ d="m 45.751683,165.03156 c 0.06146,0.29539 0.172509,0.58039 0.32709,0.8395 0.265683,0.44533 0.653935,0.80631 1.073256,1.1114 0.419321,0.30509 0.872799,0.55947 1.311827,0.83545 2.333646,1.46695 4.235362,3.52905 5.924734,5.70709 2.266543,2.92217 4.271913,6.16491 7.29931,8.28886 2.137781,1.49982 4.695713,2.35501 7.29406,2.61606 3.051317,0.30656 6.139876,-0.18595 9.08171,-1.05205 2.726384,-0.80267 5.363099,-1.92956 7.78216,-3.4214 4.598507,-2.83591 8.439249,-6.99271 13.51002,-8.85709 1.10702,-0.40702 2.25922,-0.69819 3.3265,-1.20026 1.06727,-0.50207 2.07136,-1.25403 2.5811,-2.31766 0.48998,-1.02241 0.47097,-2.20249 0.63053,-3.32496 0.1707,-1.20084 0.55374,-2.36184 0.76385,-3.55642 0.2101,-1.19458 0.23517,-2.47233 -0.28138,-3.56975 -0.42775,-0.90878 -1.20535,-1.62786 -2.09983,-2.08475 -0.89448,-0.4569 -1.90108,-0.66447 -2.90429,-0.71372 -2.006415,-0.0985 -3.987581,0.41519 -5.98809,0.59785 -2.649534,0.24193 -5.317874,-0.0982 -7.97725,-0.019 -3.308296,0.0986 -6.568402,0.84468 -9.87428,1.00503 -3.771518,0.18294 -7.534685,-0.39851 -11.30754,-0.55139 -1.634066,-0.0662 -3.279962,-0.0512 -4.891819,0.22531 -1.611857,0.27654 -3.195234,0.82363 -4.541001,1.75286 -1.311442,0.90553 -2.355916,2.14022 -3.560189,3.18405 -0.602137,0.52192 -1.249488,0.99929 -1.966273,1.3474 -0.716785,0.34812 -1.50749,0.564 -2.304158,0.54708 -0.409601,-0.009 -0.830861,-0.0769 -1.2213,0.0472 -0.243915,0.0775 -0.460478,0.22705 -0.643532,0.40593 -0.183054,0.17888 -0.334787,0.38705 -0.477798,0.59931 -0.332537,0.49356 -0.623066,1.01541 -0.867417,1.55807"
+ id="path28461-2"
+ style="fill:url(#radialGradient18822)"
+ transform="translate(59.99984,-58.362183)" />
+ <path
+ d="m 60.55673,169.09742 c -0.386462,1.59605 -0.151992,3.33408 0.64359,4.77067 0.795582,1.43659 2.144391,2.5575 3.70231,3.07676 1.977755,0.65919 4.206575,0.33635 6.05477,-0.62813 1.071362,-0.55909 2.051171,-1.34588 2.669379,-2.38425 0.309105,-0.51918 0.523981,-1.09707 0.604518,-1.69591 0.08054,-0.59884 0.02471,-1.2185 -0.184887,-1.78522 -0.229715,-0.62112 -0.640261,-1.16849 -1.146053,-1.59596 -0.505791,-0.42748 -1.104668,-0.7378 -1.733436,-0.94568 -1.257537,-0.41575 -2.610936,-0.42405 -3.933891,-0.36051 -2.005209,0.0963 -4.002918,0.34837 -5.9692,0.75318"
+ id="path28487-2"
+ style="fill:#d9b30d;filter:url(#filter28502-8)"
+ transform="translate(59.99984,-58.362183)" />
+ <path
+ id="path27476-7-8"
+ d="m 54.0663,156.67992 c -1.338955,0.79147 -2.628584,1.66369 -3.8975,2.56317 -0.656705,0.46551 -1.334168,0.96895 -1.68056,1.69557 -0.245501,0.51498 -0.301768,1.09903 -0.309586,1.66948 -0.0078,0.57045 0.02884,1.14399 -0.04618,1.70954 -0.05124,0.38625 -0.154326,0.76619 -0.171537,1.15544 -0.0086,0.19463 0.0047,0.39145 0.05602,0.57938 0.05134,0.18793 0.141902,0.36704 0.275482,0.50885 0.172556,0.18318 0.407931,0.29591 0.64865,0.36931 0.240719,0.0734 0.490638,0.1112 0.73562,0.16878 1.174662,0.27611 2.196917,0.99676 3.094125,1.80366 0.897208,0.8069 1.702883,1.71487 2.638865,2.47645 2.537255,2.06449 5.890478,2.91872 9.161088,2.97254 3.27061,0.0538 6.504204,-0.63066 9.695302,-1.34946 2.506322,-0.56456 5.014978,-1.15472 7.42544,-2.04356 3.702752,-1.36537 7.140748,-3.43167 10.11819,-6.02193 1.349968,-1.17442 2.617219,-2.46364 4.13251,-3.41525 1.340926,-0.84211 2.842622,-1.39796 4.206331,-2.20265 0.12193,-0.072 0.24321,-0.14621 0.35213,-0.23665 0.10893,-0.0905 0.20574,-0.1981 0.26892,-0.3248 0.10917,-0.21894 0.10937,-0.48123 0.0389,-0.71552 -0.0704,-0.23429 -0.20633,-0.44389 -0.36,-0.63425 -0.16999,-0.21058 -0.36336,-0.40158 -0.568951,-0.57756 -1.424379,-1.21921 -3.356756,-1.66245 -5.22581,-1.81067 -1.869053,-0.14822 -3.760672,-0.0434 -5.60996,-0.35238 -1.738647,-0.29048 -3.393268,-0.93881 -5.07175,-1.4773 -1.761942,-0.56527 -3.562776,-1.01251 -5.38903,-1.31044 -4.294756,-0.70063 -8.71732,-0.56641 -12.97748,0.32063 -4.057685,0.84488 -7.971287,2.37056 -11.53927,4.47962"
+ style="fill:#604405;filter:url(#filter15145-6)"
+ transform="translate(59.99984,-58.362183)" />
+ <path
+ id="path27476-4"
+ d="m 53.63941,152.15408 c -1.929391,1.2986 -3.666135,2.88291 -5.13602,4.68523 -0.840698,1.03083 -1.603727,2.15084 -2.02709,3.41185 -0.332996,0.99185 -0.446478,2.04153 -0.65633,3.06652 -0.07861,0.38398 -0.171386,0.76923 -0.169741,1.16118 8.22e-4,0.19597 0.02568,0.39281 0.08646,0.57912 0.06079,0.18631 0.15831,0.36204 0.294069,0.50337 0.224679,0.23391 0.540409,0.36101 0.858102,0.42632 0.317692,0.0653 0.643798,0.0751 0.966058,0.11177 1.454637,0.16535 2.794463,0.87199 4.000333,1.70216 1.205869,0.83017 2.317112,1.79543 3.554437,2.57795 2.733893,1.72899 5.994554,2.49829 9.226902,2.62285 3.232347,0.12456 6.457354,-0.36641 9.629488,-0.99977 2.520903,-0.50334 5.033924,-1.10072 7.42544,-2.04356 3.662411,-1.44389 6.963507,-3.66693 10.11819,-6.02193 1.43301,-1.06976 2.84598,-2.17318 4.13251,-3.41525 0.43668,-0.42159 0.859162,-0.85947 1.327567,-1.24551 0.468404,-0.38603 0.988159,-0.72177 1.565973,-0.90766 0.880766,-0.28336 1.835622,-0.20203 2.748192,-0.0495 0.68732,0.11488 1.376,0.26902 2.07229,0.24128 0.34815,-0.0139 0.69661,-0.0742 1.02006,-0.2037 0.32345,-0.12954 0.62155,-0.33028 0.8433,-0.59903 0.29139,-0.35317 0.43996,-0.81445 0.4416,-1.2723 0.002,-0.45786 -0.1387,-0.91095 -0.37105,-1.30548 -0.4647,-0.78905 -1.26825,-1.32311 -2.10504,-1.69503 -1.14614,-0.50941 -2.3863,-0.76136 -3.605512,-1.05573 -3.745289,-0.90427 -7.384752,-2.24056 -10.83577,-3.95385 -1.715597,-0.85173 -3.383551,-1.79555 -5.07175,-2.70037 -1.735567,-0.93021 -3.504569,-1.82415 -5.38903,-2.39536 -4.21332,-1.27713 -8.818528,-0.85829 -12.97748,0.58609 -4.619909,1.60447 -8.797447,4.46312 -11.96616,8.18832 v 2e-5"
+ style="fill:url(#linearGradient18824)"
+ transform="translate(59.99984,-58.362183)" />
+ <path
+ id="path28357-7"
+ d="m 83.23853,153.07989 c -0.226496,-0.28623 -0.551139,-0.48799 -0.901294,-0.59103 -0.350155,-0.10304 -0.724669,-0.1104 -1.084432,-0.0488 -0.719527,0.12322 -1.364496,0.51049 -1.965744,0.9245 -1.708552,1.17648 -3.218864,2.62822 -4.53731,4.22977 -1.745223,2.11996 -3.18499,4.57171 -3.66755,7.27489 -0.08131,0.45547 -0.135106,0.92132 -0.07821,1.38049 0.0569,0.45916 0.232792,0.91479 0.558708,1.24319 0.286171,0.28835 0.675727,0.46425 1.077847,0.52203 0.40212,0.0578 0.815901,0.002 1.200757,-0.12836 0.769713,-0.26019 1.408987,-0.79942 2.014436,-1.34126 3.335973,-2.98548 6.352522,-6.56776 7.55957,-10.87877 0.121128,-0.43261 0.224012,-0.87566 0.221233,-1.3249 -0.0028,-0.44924 -0.119237,-0.90947 -0.398013,-1.26176"
+ style="fill:#f6da4a;filter:url(#filter14963-7)"
+ transform="translate(59.99984,-58.362183)" />
+ <g
+ id="g681">
+ <path
+ style="opacity:0.8;fill:url(#radialGradient18826);filter:url(#filter15177-1)"
+ d="m 135.25114,88.527667 c 0.23129,0.7424 1.42778,0.61935 2.11906,0.97542 0.60659,0.31244 1.09447,0.99723 1.77651,1.01692 0.65093,0.0188 1.66398,-0.22542 1.74866,-0.87109 0.11187,-0.85303 -1.13379,-1.39511 -1.93536,-1.70762 -1.03148,-0.40216 -2.35301,-0.6062 -3.3206,-0.0682 -0.22173,0.12328 -0.46373,0.41238 -0.38827,0.65458 z"
+ id="path28396-7" />
+ <path
+ style="opacity:0.8;fill:url(#radialGradient18828);filter:url(#filter15173-0)"
+ d="m 123.82694,88.107827 c -0.88816,-0.28854 -2.35748,1.27746 -1.87806,2.07886 0.13167,0.22009 0.53491,0.49916 0.80641,0.34992 0.40925,-0.22497 0.74404,-1.02958 1.18746,-1.34496 0.29608,-0.21058 0.22974,-0.97156 -0.11581,-1.08382 z"
+ id="path28398-7" />
+ </g>
+ <path
+ transform="matrix(1.0956223,0,-0.17017853,1.5181314,-76.24447,-140.47964)"
+ style="fill:url(#linearGradient18830);filter:url(#filter28584-4)"
+ d="m 245.90496,158.28406 a 2.608083,2.328125 0 0 1 -2.60809,2.32812 2.608083,2.328125 0 0 1 -2.60808,-2.32812 2.608083,2.328125 0 0 1 2.60808,-2.32813 2.608083,2.328125 0 0 1 2.60809,2.32813 z"
+ id="path28570-8"
+ clip-path="url(#clipPath697)" />
+ </g>
+ </g>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89359px;line-height:1.2;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';font-variant-ligatures:discretionary-ligatures;font-variant-position:super;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0257845px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#001024;fill-rule:evenodd;stroke-width:1.84175;stroke-linejoin:round;stop-color:#000000"
+ x="23.260744"
+ y="84.724617"
+ id="text6005"><tspan
+ id="tspan6003"
+ x="23.260744"
+ y="84.724617"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89359px;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#001024;stroke-width:1.84175">Code Signing</tspan><tspan
+ x="23.24785"
+ y="91.796928"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89359px;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#001024;stroke-width:1.84175"
+ id="tspan6007">Providers</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89359px;line-height:1.2;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';font-variant-ligatures:discretionary-ligatures;font-variant-position:super;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0257845px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#001024;fill-rule:evenodd;stroke-width:1.84175;stroke-linejoin:round;stop-color:#000000"
+ x="121.53855"
+ y="84.724617"
+ id="text6253"><tspan
+ id="tspan6249"
+ x="121.53855"
+ y="84.724617"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89359px;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#001024;stroke-width:1.84175">Code Signing</tspan><tspan
+ x="121.52566"
+ y="91.796928"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.89359px;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab';fill:#001024;stroke-width:1.84175"
+ id="tspan6251">Consumers</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7367;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4140);stop-color:#000000"
+ d="M 88.288259,31.480739 110.14575,20.272964"
+ id="path4136" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7367;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker3475);stop-color:#000000"
+ d="M 88.288259,41.14663 H 110.14575"
+ id="path3461" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7367;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6797);stop-color:#000000"
+ d="M 88.288259,50.812528 110.14575,62.020303"
+ id="path6783" />
+ <g
+ id="g1356">
+ <path
+ id="path7194"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.6804px;line-height:1.25;font-family:'Font Awesome 5 Free';-inkscape-font-specification:'Font Awesome 5 Free, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0324629px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#9e1f63;fill-rule:evenodd;stroke:none;stroke-width:0.624264;stroke-linecap:round;stroke-linejoin:round"
+ d="m 24.794105,46.521553 c -2.002689,0.02064 -3.613072,1.631181 -3.613072,3.633867 0,0.412927 0.06187,0.784568 0.165092,1.156199 l -3.323931,3.323931 c -0.103234,0.103266 -0.144661,0.227111 -0.144661,0.350988 v 1.610422 c 0,0.28906 0.206596,0.495466 0.495643,0.495466 h 2.312211 c 0.268402,0 0.495646,-0.206406 0.495646,-0.495466 v -0.825833 h 0.825829 c 0.2684,0 0.49546,-0.206406 0.49546,-0.495455 v -0.825823 h 0.76399 c 0.144524,0 0.268364,-0.06202 0.371593,-0.165277 l 0.495461,-0.557488 c 0.206463,0.04124 0.433591,0.06202 0.681349,0.06202 2.002689,0 3.633685,-1.61039 3.633685,-3.613064 0,-2.023342 -1.630964,-3.654491 -3.654295,-3.654491 z m 1.011717,1.651842 c 0.536804,0 0.990922,0.454122 0.990922,0.990926 0,0.557446 -0.454118,0.991099 -0.990922,0.991099 -0.557447,0 -0.991107,-0.433653 -0.991107,-0.991099 0,-0.536804 0.43366,-0.990926 0.991107,-0.990926 z" />
+ <path
+ id="path7169"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.6804px;line-height:1.25;font-family:'Font Awesome 5 Free';-inkscape-font-specification:'Font Awesome 5 Free, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0324629px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#9e1f63;fill-rule:evenodd;stroke:none;stroke-width:0.794368;stroke-linecap:round;stroke-linejoin:round"
+ d="m 16.627258,44.655351 h 13.071184 c 1.300372,0 2.332397,1.032029 2.332397,2.3324 v 13.071186 c 0,1.300374 -1.032025,2.332393 -2.332397,2.332393 H 16.627258 c -1.300372,0 -2.3324,-1.032019 -2.3324,-2.332393 V 46.987751 c 0,-1.300371 1.032028,-2.3324 2.3324,-2.3324 z m 0,-0.937503 c -1.803386,0 -3.269903,1.46652 -3.269903,3.269903 v 13.071186 c 0,1.803379 1.466517,3.269667 3.269903,3.269667 h 13.071184 c 1.803384,0 3.269902,-1.466288 3.269902,-3.269667 V 46.987751 c 0,-1.803384 -1.466518,-3.269903 -3.269902,-3.269903 z" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;line-height:1.2;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab, Normal';font-variant-ligatures:discretionary-ligatures;font-variant-position:super;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0193383px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#9e1f63;fill-opacity:1;fill-rule:evenodd;stroke-width:0.552351;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stop-color:#000000"
+ x="23.130592"
+ y="61.258026"
+ id="text7208"><tspan
+ id="tspan7206"
+ x="23.12092"
+ y="61.258026"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab, Normal';font-variant-ligatures:discretionary-ligatures;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#9e1f63;fill-opacity:1;stroke-width:0.552351;stroke-miterlimit:4;stroke-dasharray:none">release</tspan></text>
+ </g>
+ <g
+ id="g1350">
+ <path
+ id="path7216"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.6804px;line-height:1.25;font-family:'Font Awesome 5 Free';-inkscape-font-specification:'Font Awesome 5 Free, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0324629px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#1f639e;fill-rule:evenodd;stroke:none;stroke-width:0.624264;stroke-linecap:round;stroke-linejoin:round"
+ d="m 24.794105,22.84941 c -2.002689,0.02064 -3.613072,1.631181 -3.613072,3.633867 0,0.412927 0.06187,0.784568 0.165092,1.156199 l -3.323931,3.323931 c -0.103234,0.103266 -0.144661,0.227111 -0.144661,0.350988 v 1.610422 c 0,0.28906 0.206596,0.495466 0.495643,0.495466 h 2.312211 c 0.268402,0 0.495646,-0.206406 0.495646,-0.495466 v -0.825833 h 0.825829 c 0.2684,0 0.49546,-0.206406 0.49546,-0.495455 v -0.825823 h 0.76399 c 0.144524,0 0.268364,-0.06202 0.371593,-0.165277 l 0.495461,-0.557488 c 0.206463,0.04124 0.433591,0.06202 0.681349,0.06202 2.002689,0 3.633685,-1.61039 3.633685,-3.613064 0,-2.023342 -1.630964,-3.654491 -3.654295,-3.654491 z m 1.011717,1.651842 c 0.536804,0 0.990922,0.454122 0.990922,0.990926 0,0.557446 -0.454118,0.991099 -0.990922,0.991099 -0.557447,0 -0.991107,-0.433653 -0.991107,-0.991099 0,-0.536804 0.43366,-0.990926 0.991107,-0.990926 z" />
+ <path
+ id="path7218"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.6804px;line-height:1.25;font-family:'Font Awesome 5 Free';-inkscape-font-specification:'Font Awesome 5 Free, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0324629px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#1f639e;fill-rule:evenodd;stroke:none;stroke-width:0.794368;stroke-linecap:round;stroke-linejoin:round"
+ d="m 16.627258,20.983208 h 13.071184 c 1.300372,0 2.332397,1.032029 2.332397,2.3324 v 13.071186 c 0,1.300374 -1.032025,2.332393 -2.332397,2.332393 H 16.627258 c -1.300372,0 -2.3324,-1.032019 -2.3324,-2.332393 V 23.315608 c 0,-1.300371 1.032028,-2.3324 2.3324,-2.3324 z m 0,-0.937503 c -1.803386,0 -3.269903,1.46652 -3.269903,3.269903 v 13.071186 c 0,1.803379 1.466517,3.269667 3.269903,3.269667 h 13.071184 c 1.803384,0 3.269902,-1.466288 3.269902,-3.269667 V 23.315608 c 0,-1.803384 -1.466518,-3.269903 -3.269902,-3.269903 z" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;line-height:1.2;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab, Normal';font-variant-ligatures:discretionary-ligatures;font-variant-position:super;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0193383px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#1f639e;fill-opacity:1;fill-rule:evenodd;stroke-width:0.552351;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stop-color:#000000"
+ x="23.130592"
+ y="37.585884"
+ id="text7222"><tspan
+ id="tspan7220"
+ x="23.12092"
+ y="37.585884"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab, Normal';font-variant-ligatures:discretionary-ligatures;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1f639e;fill-opacity:1;stroke-width:0.552351;stroke-miterlimit:4;stroke-dasharray:none">devel</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.736468;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5387);stop-color:#000000"
+ d="m 37.295996,29.679822 14.742818,7.095892"
+ id="path5121" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.736468;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7252);stop-color:#000000"
+ d="M 37.295996,53.455348 52.038814,46.359459"
+ id="path7238" />
+ <g
+ id="g1361">
+ <rect
+ style="fill:#929292;fill-opacity:0.998066;fill-rule:evenodd;stroke:none;stroke-width:0.600033;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
+ id="rect9273"
+ width="12.422863"
+ height="43.266964"
+ x="93.231277"
+ y="19.513153"
+ rx="0.95758843"
+ ry="0.95758843" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111px;line-height:1.2;font-family:'Roboto Slab';-inkscape-font-specification:'Roboto Slab, Normal';font-variant-ligatures:discretionary-ligatures;font-variant-position:super;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:-0.0411397px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#001024;fill-opacity:1;fill-rule:evenodd;stroke-width:1.17505;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stop-color:#000000;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;"
+ x="-41.135151"
+ y="102.22821"
+ id="text9271"
+ transform="rotate(-90)"><tspan
+ id="tspan9269"
+ x="-41.155727"
+ y="102.22821"
+ style="fill:#001024;stroke-width:1.17505;font-size:7.76111px;-inkscape-font-specification:'Roboto Slab, Normal';font-family:'Roboto Slab';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-variant-ligatures:discretionary-ligatures ;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;">PKCS#11</tspan></text>
+ </g>
+</svg>
diff --git a/doc/dev_create_new_pkg_templates.rst b/doc/dev_create_new_pkg_templates.rst
index d7c2927b6..3c47addee 100644
--- a/doc/dev_create_new_pkg_templates.rst
+++ b/doc/dev_create_new_pkg_templates.rst
@@ -73,5 +73,5 @@ The helper functions that are used in the example above are defined in
The template is a normal shell function. Arbitrary things can be done here
to create the new package. The helper functions are just the most
convenient way to crate simple templates. It is also possible to create
-more files. For examples, the builtin ``genimage`` template creates a extra
+more files. For examples, the builtin ``genimage`` template creates an extra
config file for the new package.
diff --git a/doc/dev_layers_in_ptxdist.rst b/doc/dev_layers_in_ptxdist.rst
index 27ca85832..6f932eae9 100644
--- a/doc/dev_layers_in_ptxdist.rst
+++ b/doc/dev_layers_in_ptxdist.rst
@@ -89,7 +89,7 @@ must be updated before they can be used. This can be done by using the
``oldconfig`` command. In this special case, PTXdist will iterate from the
bottom to the top layer and run ``oldconfig`` for each of them. It will
use the delta config applied to the full config of the layer below at each
-step. This means that it's possible to enable or disable a option in the
+step. This means that it's possible to enable or disable an option in the
bottom layer and ``oldconfig`` will propagate this change to all other
layers.
diff --git a/doc/dev_licenses.rst b/doc/dev_licenses.rst
new file mode 100644
index 000000000..6aed9daac
--- /dev/null
+++ b/doc/dev_licenses.rst
@@ -0,0 +1,245 @@
+.. _licensing_in_packages:
+
+Tracking licensing information in packages
+------------------------------------------
+
+PTXdist aims to track licensing information for every package.
+This includes the license(s) under which a package can be distributed,
+as well as the respective files in the package's source tree that state those terms.
+Sadly there is no widely adopted standard for machine-readable licensing
+information in source code (`yet <https://reuse.software>`_),
+so here are a few hints where to look.
+
+In that process, we aim to collect the baseline set of licenses
+which at least apply to a package.
+There may be other licenses which apply too, but the complete set often cannot
+be found without a time-consuming review.
+Still, the extracted license information in PTXdist can serve as a hint for
+the full license compliance process,
+and can help to exclude certain software under certain licenses from the build.
+
+There are many older package rules in PTXdist which don't specify licensing information.
+If you want to help complete the database,
+you can use ``grep -L _LICENSE_FILES rules/*.make`` (in the PTXdist tree) to find those rules.
+Note however that this cannot find wrong or incomplete licensing information.
+
+Finding licensing information
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You should first select and extract the package in question, and then have a
+look at in the extracted package sources (usually something like
+``platform-nnn/build-target/mypackage-1.0`` in your BSP, if in doubt see
+``ptxdist package-info mypackage``).
+
+* Check for files named ``COPYING``, ``COPYRIGHT``, or ``LICENSE``.
+ These often only contain the license text and, in case of GPL, no information
+ if the code is available under the *-only* or *-or-later* variant.
+ Sometimes these files are in a folder ``/doc`` or ``/legal``.
+
+* Check the ``README``, if there is any.
+ Often there is important information there, e.g. in case of GPL if the
+ software is *GPL-x.x-or-later* or *GPL-x.x-only*.
+
+* Check source files, like ``*.c`` for license headers.
+ Often additional information can be found here.
+
+* If you want to be extra sure, use a license compliance toolchain (e.g.
+ `FOSSology <https://www.fossology.org/>`__) on the project.
+
+Ideally you'll find two pieces of information:
+
+* A *license text* (e.g. a GNU General Public License v2.0 text)
+* A *license statement* that states that a certain license applies to (parts of) the project
+ (often also including copyright statements and a warranty disclaimer)
+
+Some licenses (e.g. BSD-style licenses) are also short enough so that both
+pieces are combined in a short comment header in a source file or a README.
+Strictly speaking, both the license text and the license statement must be
+present for a complete, unambiguous license, but see the next section about
+edge cases.
+
+On the other hand, there are some parts that can be ignored for our purposes:
+
+* Everything that is auto-generated, either by a script in the project source,
+ or by the build system previous to packaging.
+ The generator itself cannot hold copyright, although the authors of the
+ templates used for the generation or the authors of the generator can.
+
+* Most files belonging to the build system don't make it into the compiled code
+ and can therefore be ignored (e.g. configure scripts, Makefiles).
+ These cases sometimes can be hard to detect – if unsure, include the file in
+ your research.
+
+Some projects also include a COPYING.LIB containing an LGPL text, which is
+referenced nowhere in the project.
+In that case, ignore the COPYING.LIB – it probably comes from a boilerplate
+project skeleton and the maintainer forgot to delete it.
+
+Distillation into license identifiers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In PTXdist, we use `SPDX license expressions <https://spdx.org/licenses/>`_.
+
+Either the license identifier is clear, e.g. because the README says "GPL 2.0
+or later" (check the license text to be sure), or you can use tools like
+`FOSSology <https://www.fossology.org>`__,
+`licensecheck <https://wiki.debian.org/CopyrightReviewTools#Command-line_tools_in_Debian>`_,
+or `spdx-license-match <https://github.com/rohieb/spdx-license-match>`_
+to match texts to SPDX license identifiers.
+
+License texts don't have to match exactly, you should apply the
+`SPDX Matching Guidelines <https://spdx.org/spdx-license-list/matching-guidelines>`_
+accordingly.
+The important part here is that the project's license and the SPDX identifier
+describe the same licensing terms.
+"Rather close" or "mostly similar" statements are not enough for a match,
+but simple unimportant changes like replacing *"The Author"* with the project's
+maintainer's name, or a change in e-mail adresses, are usually okay.
+
+For software that is not open-source according to the `OSI definition
+<https://opensource.org/osd>`_, use the identifier ``proprietary``.
+
+.. important::
+
+ If no license identifier matches, or if anything is unclear about the
+ licensing situation, use the identifier ``custom`` (for licenses)
+ or ``custom-exception`` (for license exceptions, e.g.: ``GPL-2.0-only WITH
+ custom-exception``).
+
+If SPDX doesn't know about a license yet, and the project is considered open
+source or free software, you can `report its license to be added to the SPDX
+license list
+<https://github.com/spdx/license-list-XML/blob/master/CONTRIBUTING.md#request-a-new-license-or-exception-be-added-to-the-spdx-license-list>`_.
+
+Multiple licenses
+^^^^^^^^^^^^^^^^^
+
+Open-source software is re-used all the time, so it can happen that some files
+make their way into a different project.
+This is usually no problem.
+If you encounter multiple parts of the project under different licenses, combine
+their license expressions with ``AND``.
+For example, in a project that contains both a library and command line tools,
+the license expression could be ``GPL-2.0-or-later AND LGPL-2.1-or-later``.
+
+Sometimes files are licensed under multiple licenses, and only one license is to
+be selected.
+In that case, combine the license expressions with ``OR``.
+This is often the case with Device Trees in the Linux kernel, e.g.:
+``GPL-2.0-only OR BSD-2-Clause``.
+
+No operator precedence is defined, use brackets ``(…)`` to group sub-statements.
+
+Conflicting and ambiguous statements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Human interpretation is needed when statements inside the project conflict with
+each other.
+Some clues that can help you decide:
+
+Detailedness:
+ If the header in the COPYING file says *"GNU General Public License"*, but
+ the license text below that is in fact a BSD license, the correct license for
+ the license identifier is the BSD license.
+
+Author Intent:
+ If the README says *"this code is LGPL 2.1"*, but COPYING contains a GPL
+ boilerplate license text, the correct license identifier is probably *"LGPL 2.1"*
+ – the README written by the author prevails over the boilerplate text.
+
+Recency:
+ If README and COPYING are both clearly written by the author themselves, and
+ the README says *"don't do $thing*" and COPYING says *"do $thing*", the more
+ recent file prevails.
+
+Scope:
+ If no license statement can be found, but there is a COPYING file containing
+ a license text, infer that the whole project is licensed under that license.
+
+Err on the side of caution:
+ If all you can find is a GPL license text, this doesn't yet tell you whether
+ the project is licensed under the *-only* or the *-or-later* variant.
+ In that case, interpret the license restrictively and choose the *-only*
+ variant for the license identifier.
+
+Don't assume:
+ If anything is ambiguous or unclear, choose ``custom`` as a license identifier.
+
+.. note::
+
+ Any of these cases is considered a bug and should be reported to the upstream maintainers!
+
+"Public Domain" software
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+For `good reasons <https://wiki.spdx.org/view/Legal_Team/Decisions/Dealing_with_Public_Domain_within_SPDX_Files>`_,
+SPDX doesn't supply a license identifier for "Public Domain".
+Nevertheless, some PTXdist package rules specify ``public_domain`` as their
+respective license identifier.
+This is purely for historical reasons, and ``public_domain`` should normally
+*not* be used for new packages.
+Some of those "Public Domain" dedications in packages have since been accepted
+in SPDX, e.g. `libselinux <https://spdx.org/licenses/libselinux-1.0.html>`_ or
+`SQLite <https://spdx.org/licenses/blessing.html>`_.
+
+No license information at all
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+No license - no usage rights!
+
+Definitely report this bug to the upstream maintainer.
+Maybe even point them in the direction of `machine-readablity <https://reuse.software/>`_ :)
+
+Adding license files to PTXdist packages
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The SPDX license identifier of the package goes into the ``<PKG>_LICENSE``
+variable in the respective package rule file.
+All relevant files identified in the steps above are then added to the variable ``<PKG>_LICENSE_FILES``,
+including a checksum so that PTXdist complains when they change.
+
+Example:
+
+.. code-block:: make
+
+ DDRESCUE_LICENSE := GPL-2.0-or-later AND BSD-2-Clause
+ DDRESCUE_LICENSE_FILES := \
+ file://COPYING;md5=76d6e300ffd8fb9d18bd9b136a9bba13 \
+ file://main.cc;startline=1;endline=16;md5=a01d61d3293ce28b883d8ba0c497e968 \
+ file://arg_parser.cc;startline=1;endline=18;md5=41d1341d0d733a5d24b26dc3cbc1ac42
+
+See the section :ref:`package_specific_variables` for more information about
+the syntax of those two variables.
+
+The MD5 sum for a block of lines can be generated with sed's ``p`` (print)
+command applied to a range of lines.
+For the example above, lines 1 to 16 of main.cc would be::
+
+ $ sed -n 1,16p main.cc | md5sum -
+ a01d61d3293ce28b883d8ba0c497e968
+
+Always include the copyright statement ("Copyright YYYY (C) Some Person")
+for the calculation of the checksum, even if it means that the checksum changes
+on package updates when new years are added to the string.
+While it is not is needed for most licenses to be valid, some licenses require
+that it must not be removed (e.g. see GPLv2, section 1),
+and it is proper etiquette to give attribution to the maintainers in the
+license report document.
+
+If additional information is in the README or license headers in source files
+are used, also include these files (for source code: one of each is enough),
+but use md5sum only on the relevant lines, so changes in the rest of the file
+do not appear as license changes.
+
+For rather chaotic directories with lots of license files, definitely include at
+least one relevant source file with license headers (if there are any), as some
+developers tend to accumulate license files without adjusting it to license
+changes in their source.
+
+.. note::
+
+ For each single license identifier in the license expression, include at
+ least one file with checksum in the ``<PKG>_LICENSE_FILES`` variable.
+
+PTXdist will include all files (or their respective lines) that were referenced
+in ``<PKG>_LICENSE_FILES`` as verbatim sources in the license report.
diff --git a/doc/dev_manual.rst b/doc/dev_manual.rst
index c232cc914..fe4307a86 100644
--- a/doc/dev_manual.rst
+++ b/doc/dev_manual.rst
@@ -11,8 +11,11 @@ This chapter shows all (or most) of the details of how PTXdist works.
dev_dir_hierarchy
dev_add_new_pkgs
+ dev_advanced_rule_files
+ dev_patching
dev_add_bin_only_files
dev_create_new_pkg_templates
+ dev_licenses
dev_layers_in_ptxdist
dev_kconfig_diffs
dev_code_signing
diff --git a/doc/dev_patching.rst b/doc/dev_patching.rst
new file mode 100644
index 000000000..d2a261636
--- /dev/null
+++ b/doc/dev_patching.rst
@@ -0,0 +1,295 @@
+.. _patching_packages:
+
+*****************
+Patching Packages
+*****************
+
+There can be various reasons why a package must be patched:
+
+- Package is broken for cross compile environments
+
+- Package is broken within a specific feature
+
+- Package is vulnerable and needs some fixes
+
+- or anything else (this case is the most common one)
+
+Ideally, those problems should be addressed in the original project,
+so any patches you add to your BSP or to PTXdist should also be submitted upstream.
+The upstream project can often provide better feedback, they can integrate your
+patch into a new release, and also maintain your changes as part of the project.
+This way we make sure that all advantages of the open source idea work for us;
+and your patch can be removed again later when a new release of the project is
+integrated into your BSP or into PTXdist.
+
+PTXdist handles patching automatically.
+After extracting the archive of a package, PTXdist checks for the existence of
+a patch directory named like its ``<PKG>_PATCHES`` variable, or, if this variable
+is not set, like its ``<PKG>`` variable.
+The patch directory is then searched in all locations listed by the
+``PTXDIST_PATH_PATCHES`` variable, and the first one found is used.
+Take an exemplary package ``foo`` with version ``1.1.0``:
+The variable ``FOO`` will have the value ``foo-1.1.0``, so PTXdist will look for
+a patch directory named ``foo-1.1.0`` in the following locations:
+
+#. the current layer:
+
+ a. project (``./patches/foo-1.1.0``)
+ b. platform (``./configs/|ptxdistPlatformConfigDir|/patches/foo-1.1.0``)
+
+#. any :ref:`base layers <layers-in-ptxdist>`,
+ applying the same search order as above for each layer recursively
+
+#. ptxdist (``<ptxdist/installation/path>/patches/foo-1.1.0``)
+
+The patches from the first location found are used. Note: Due to this
+search order, a PTXdist project can replace global patches from the
+PTXdist installation. This can be useful if a project sticks to a
+specific PTXdist revision but fixes from a more recent revision of
+PTXdist should be used.
+
+PTXdist uses the utilities *git*, *patch* or *quilt* to work with
+patches or patch series. We recommend *git*, as it can manage patch
+series in a very easy way.
+
+Creating a Patch Series for a Package
+=====================================
+
+To create a patch series for the first time, we can run the following
+steps. We are still using our *foo-1.1.0* example package here:
+
+Using Quilt
+-----------
+
+We create a special directory for the patch series in the local project
+directory:
+
+.. code-block:: text
+
+ $ mkdir -p patches/foo-1.1.0
+
+PTXdist expects a ``series`` file in the patch directory and at least
+one patch. Otherwise it fails. Due to the fact that we do not have any
+patch content yet, we’ll start with a dummy entry in the ``series`` file
+and an empty ``patch`` file.
+
+.. code-block:: text
+
+ $ touch patches/foo-1.1.0/dummy
+ $ echo dummy > patches/foo-1.1.0/series
+
+Next is to extract the package (if already done, we must remove it
+first):
+
+.. code-block:: text
+
+ $ ptxdist extract foo
+
+This will extract the archive and create a symbolic link in the build
+directory pointing to our local patch directory. Working this way will
+ensure that we do not lose our created patches if we enter
+``ptxdist clean foo`` by accident. In our case the patches are still
+present in ``patches/foo-1.1.0`` and can be used the next time we
+extract the package again.
+
+All we have to do now is to do the modification we need to make the
+package work. We change into the build directory and use quilt_ to
+create new patches, add files to respective patches, modify these files
+and refresh the patches to save our changes.
+See the *quilt* documentation (``man 1 quilt``) for more information.
+
+.. note:: For patches that are intended for PTXdist upstream use the git
+ workflow described below to get proper patch headers.
+
+.. _quilt: http://savannah.nongnu.org/projects/quilt
+
+Using Git
+---------
+
+Create the patch directory like above for *quilt*,
+but only add an empty series file:
+
+.. code-block:: text
+
+ $ mkdir -p patches/foo-1.1.0
+ $ touch patches/foo-1.1.0/series
+
+Then extract the package with an additional command line switch:
+
+.. code-block:: text
+
+ $ ptxdist --git extract foo
+
+The empty series file makes PTXdist create a Git repository in the
+respective package build directory,
+and import the package source as the first commit.
+
+.. note:: Optionally, you can enable the setting *Developer Options →
+ use git to apply patches* in `ptxdist setup` to get this behaviour
+ as a default for every package.
+
+Then you can change into the package build directory
+(``platform-<name>/build-target/foo-1.1.0``),
+patch the required source files,
+and make Git commits on the way.
+The Git history should now look something like this:
+
+.. code-block:: text
+
+ $ git log --oneline --decorate
+ * df343e821851 (HEAD -> master) Makefile: don't build the tests
+ * 65a360c2bd60 strfry.c: frobnicate the excusator
+ * fdc315f6844c (tag: foobar-1.1.0, tag: base) initial commit
+
+Finally, call ``git ptx-patches`` to transform those Git commits into the patch
+series in the ``patches/foo-1.1.0`` folder.
+This way they don't get lost when cleaning the package.
+
+.. note:: PTXdist will only create a Git repository for packages with
+ patches. To use Git to generate the first patch, create an empty series
+ file ``patches/foobar-1.1.0/series`` before extracting the packages. This
+ will tell PTXdist to use Git anyways and ``git ptx-patches`` will put the
+ patches there.
+
+Both approaches (Git and quilt) are not suitable for modifying files
+that are autogenerated in autotools-based buildsystems.
+Refer to the section :ref:`configure_rebuild` on how PTXdist can
+handle this special task.
+
+Recovering from merge conflicts
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When updating packages, it can happen that older patches no longer apply.
+In this case, the *extract* stage will throw errors like this::
+
+ -----------------------------
+ target: ima-evm-utils.extract
+ -----------------------------
+
+ extract: pkg_src=/ptx/src/ima-evm-utils-1.3.2.tar.gz
+ extract: pkg_extract_dir=DistroKit/platform-v7a/build-target/ima-evm-utils-1.3.2
+ patchin: git: initializing repository
+ patchin: git: done
+
+ pkg_patch_dir: 'ptxdist/patches/ima-evm-utils-1.3.2'
+ pkg_patch_series: 'ptxdist/patches/ima-evm-utils-1.3.2/series'
+
+ patchin: git: apply 'ptxdist/patches/ima-evm-utils-1.3.2/series'
+ tagging -> base
+ 0001-INSTALL-remove-file-at-it-s-autogenerated-by-autotoo.patch
+ 0002-Makefile.am-rename-INCLUDES-AM_CPPFLAGS.patch
+ error: patch failed: src/Makefile.am:1
+ error: src/Makefile.am: patch does not apply
+ make: *** […/ptxdist/rules/post/ptxd_make_world_extract.make:41: …/DistroKit/platform-v7a/state/ima-evm-utils.extract] Error 4
+
+In the example above, the first patch was applied cleanly, but the second one
+was not because src/Makefile.am contained different lines than expected.
+If this happens, you have to clean up the merge conflict,
+and apply the remaining patches manually.
+
+First, change into the package's build directory, and abort the current patch::
+
+ …/distrokit/master (master) $ cd platform-v7a/build-target/ima-evm-utils-1.3.2/
+
+ …/build-target/ima-evm-utils-1.3.2 (master|AM/REBASE) $ git log --oneline --graph
+ * 6687ab46087c (HEAD -> master) INSTALL: remove file, as it's autogenerated by autotools
+ * 01a52624237f (tag: ima-evm-utils-1.3.2, tag: base) initial commit
+
+ …/build-target/ima-evm-utils-1.3.2 (master|AM/REBASE) $ git am --abort
+
+ …/build-target/ima-evm-utils-1.3.2 (master) $
+
+(Notice how the Git integration in the shell prompt still shows ``AM/REBASE``
+before the cleanup, signaling the ongoing conflict resolution.)
+
+The remaining patches are still available in the ``./patches`` directory
+relative to your current location.
+Try to apply each of them in turn using ``git am``.
+If a patch fails to apply, Git will not change any files, but will still
+remember the patch's author and commit message, and prompt you to resolve
+the conflicts::
+
+ …/build-target/ima-evm-utils-1.3.2 (master) $ git am patches/0005-evmctl-add-fallback-definitions-for-XATTR_NAME_IMA.patch
+
+ Applying: evmctl: add fallback definitions for XATTR_NAME_IMA
+ Patch failed at 0005 evmctl: add fallback definitions for XATTR_NAME_IMA
+ hint: Use 'git am --show-current-patch=diff' to see the failed patch
+ When you have resolved this problem, run "git am --continue".
+ If you prefer to skip this patch, run "git am --skip" instead.
+ To restore the original branch and stop patching, run "git am --abort".
+
+* If you find that the patch is no longer necessary (e.g. because it was
+ already merged upstream in the new package version), skip it with
+ ``git am --skip``.
+* Otherwise, apply the same patch again manually via ``patch --merge -p1 <
+ patches/filename.patch``, and resolve any resulting conflicts using your
+ favourite editor.
+* Finally, ``git am --continue`` commits your conflict resolution with the
+ patch's original author and log message.
+
+After porting all patches, update the package's patch queue with ``git ptx-patches``.
+
+Adding More Patches to a Package
+================================
+
+If we want to add more patches to an already patched package, we can use
+nearly the same way as creating patches for the first time. But if the
+patch series comes from the PTXdist main installation, we do not have
+write permissions to these directories (do NEVER work on the main
+installation directories, NEVER, NEVER, NEVER). Due to the search order
+in which PTXdist searches for patches for a specific package, we can
+copy the global patch series to our local project directory. Now we have
+the permissions to add more patches or modify the existing ones. Also
+*quilt* and *git* are our friends here to manage the patch series.
+
+If we think that our new patches are valuable also for others, or they
+fix an error, it could be a good idea to send these patches to PTXdist
+mainline, and to the upstream project too.
+
+
+.. _configure_rebuild:
+
+Modifying Autotoolized Packages
+===============================
+
+Autotoolized packages are very picky when automatically generated files
+get patched. The patch order is very important in this case and
+sometimes it even fails and nobody knows why.
+
+To improve a package’s autotools-based build system, PTXdist comes with
+its own project local autotools to regenerate the autotools template
+files, instead of patching them. With this feature, only the template
+files must be patched, the required ``configure`` script and the
+``Makefile.in`` files are regenerated in the final stages of the
+*prepare* step.
+
+This feature works like the regular patching mechanism. The only
+difference is the additional ``autogen.sh`` file in the patch directory.
+If it exists and has execution permissions, it will be called after the
+package was patched (while the *extract* stage is running).
+
+Its content depends on developer needs; for the most simple case the
+content can be:
+
+.. code-block:: bash
+
+ #!/bin/bash
+
+ aclocal $ACLOCAL_FLAGS
+
+ libtoolize \
+ --force \
+ --copy
+
+ autoreconf \
+ --force \
+ --install \
+ --warnings=cross \
+ --warnings=syntax \
+ --warnings=obsolete \
+ --warnings=unsupported
+
+.. note:: In this way not yet autotoolized package can be autotoolized. We
+ just have to add the common autotool template files (``configure.ac``
+ and ``Makefile.am`` for example) via a patch series to the package
+ source and the ``autogen.sh`` to the patch directory.
diff --git a/doc/environment.rst b/doc/environment.rst
index 18aecec4e..225e8016e 100644
--- a/doc/environment.rst
+++ b/doc/environment.rst
@@ -14,13 +14,31 @@ http://www.ptxdist.org. This website provides
all required packages and documentation (at least for software
components which are available to the public).
+.. only:: ptxdistonly
+
+ .. note::
+ The PTXdist documenation can be built for a specific BSP. That makes it
+ possible to add BSP specific chapters to the documentation, the BSP is
+ referenced by its name and the PTXdist and toolchain versions are
+ correctly specified for this BSP.
+
+ This instance of the documentation is built without a BSP. So
+ *|ptxdistBSPName|* is used as a placeholder for the BSP name. There is no
+ *|ptxdistBSPName|* BSP!
+
+ To start experimenting with PTXdist, `DistroKit <https://git.pengutronix.de/cgit/DistroKit/>`_
+ can be used.
+
In order to build |ptxdistBSPName|, the following source archives have to be available
on the development host:
- * ptxdist-|ptxdistVendorVersion|.tar.bz2
- * |ptxdistBSPName|.tar.bz2 (or a similar source)
- * ptxdist-|oselasTCNVendorptxdistversion|.tar.bz2
- * OSELAS.Toolchain-|oselasTCNVendorVersion|.tar.bz2
+ * `ptxdist-|ptxdistVendorVersion|.tar.bz2 <https://public.pengutronix.de/software/ptxdist/ptxdist-|ptxdistVendorVersion|.tar.bz2>`_
+ * |ptxdistBSPSource|
+
+Additionally, these source archives are needed to build the toolchain:
+
+ * `ptxdist-|oselasTCNVendorptxdistversion|.tar.bz2 <https://public.pengutronix.de/software/ptxdist/ptxdist-|oselasTCNVendorptxdistversion|.tar.bz2>`_
+ * `OSELAS.Toolchain-|oselasTCNVendorVersion|.tar.bz2 <https://public.pengutronix.de/oselas/toolchain/OSELAS.Toolchain-|oselasTCNVendorVersion|.tar.bz2>`_
Main Parts of PTXdist
~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/getting_help.rst b/doc/getting_help.rst
index a4ea4b3bb..2983618c3 100644
--- a/doc/getting_help.rst
+++ b/doc/getting_help.rst
@@ -31,16 +31,17 @@ online version can be read here:
http://www.kroah.com/lkn/
-Chat/IRC
---------
+Chat: IRC and Matrix
+--------------------
-About PTXdist in particular
+Some of the PTXdist development community is active on IRC.
+Create a connection to the server ``irc.libera.chat`` on port 6697 (TLS) or
+6667 (plain text) and enter the chatroom ``#ptxdist``.
-**irc.freenode.net:6667**
+The same room is also bridged to Matrix at ``#ptxdist:matrix.org``.
-Create a connection to the ``irc.freenode.net:6667`` server and enter
-the chatroom ``#ptxdist``. This is an English room to answer questions
-about PTXdist. Best time to meet somebody there is at European daytime.
+This is an English room to answer questions about PTXdist.
+Best time to meet somebody there is at European daytime.
Commercial Support
------------------
diff --git a/doc/including_bsp_doc.inc b/doc/including_bsp_doc.inc
index 775ad3397..ca6f7519e 100644
--- a/doc/including_bsp_doc.inc
+++ b/doc/including_bsp_doc.inc
@@ -103,3 +103,37 @@ external dependencies.
Refer the PTXdist file ``doc/conf.py`` for more information on variable
substitution. This PTXdist global file can be superseded by a local copy as well.
+
+Documentation structure for layered BSPs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you call ``ptxdist docs-html`` in a layer, PTXdist will assemble the
+``doc/`` directory from all lower layers in the usual layering fashion,
+and flatten it into a single directory.
+In the highest-level table of contents, PTXdist uses a wildcard match for
+``index-layer*`` files, which is the entry point to integrate documentation for
+your own layers by creating files with that pattern.
+It is advisable to number the index files accordingly so their ordering in the
+documentation reflects the layer order.
+PTXdist itself uses the file ``index-layer-0-ptxdist.rst`` to include the title
+page of the PTXdist manual first, and includes the rest of the PTXdist
+documentation after the layer-specific files.
+
+For example, see the following directory structure::
+
+ my-bsp/
+ ├── common/
+ │   └── doc/
+ │ └── index-layer-1-common.rst
+ └── product-layer
+ . ├── base/ -> ../common
+ .   └── doc
+ . └── index-layer-2-product.rst
+
+In this example, the contents of ``index-layer-1-common.rst`` and
+``index-layer-2-product.rst`` would describe some layer-specific content, or
+even have their own table of contents in the usual reStructuredTest fashion to
+include more sub-sections in separate files.
+The documentation built for the *product-layer* will therefore include a
+section each for the *common* layer documentation, then for the *product-layer*
+documentation, and finally the rest of the PTXdist documentation.
diff --git a/doc/index-layer-0-ptxdist.rst b/doc/index-layer-0-ptxdist.rst
new file mode 100644
index 000000000..4576503a3
--- /dev/null
+++ b/doc/index-layer-0-ptxdist.rst
@@ -0,0 +1 @@
+.. include:: welcome.rst
diff --git a/doc/index.rst b/doc/index.rst
index 6a01d6dd7..29c0dc9de 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -11,7 +11,7 @@ Welcome to the PTXdist Universe
:numbered: 2
:maxdepth: 3
- welcome
+ index-layer*
environment
user_manual_section
dev_manual
diff --git a/doc/multi_image_platforms.inc b/doc/multi_image_platforms.inc
index 2a8444391..726a42767 100644
--- a/doc/multi_image_platforms.inc
+++ b/doc/multi_image_platforms.inc
@@ -26,7 +26,7 @@ package rules manually. See :ref:`adding_new_packages` for more details one
how to create a new package.
.. note:: PTXdist looks in ``patches/$(<PKG>)`` for the patches. Symlinks
- can be uses to share the patch stack across multiple bootloader packages.
+ can be used to share the patch stack across multiple bootloader packages.
.. _multi_image_individual_root_filesystems:
@@ -46,7 +46,7 @@ There are two ways to mange the package list for the image:
Manually create the package list by listing package names or using **make**
macros to manipulate the default package list ``$(PTX_PACKAGES_INSTALL)``.
- To add a single custom package, extra packages can be uses. An extra package
+ To add a single custom package, extra packages can be used. An extra package
is not added to ``$(PTX_PACKAGES_INSTALL)``. It is created by modifying the
package rule like this:
@@ -93,8 +93,8 @@ The final steps are highly hardware dependent. In some cases a bootloader
image and a rootfs are all that is needed.
To boot from SD-Card a disk image including bootloader, partition table and
-rootfs is needed. The ``image-genimage`` template can be uses again to
+rootfs is needed. The ``image-genimage`` template can be used again to
create such an image for each variant.
-.. note:: The genimage config files in ``config/images/`` are good examles
+.. note:: The genimage config files in ``config/images/`` are good examples
when writing genimage for the new images.
diff --git a/doc/ref_code_signing_helpers.rst b/doc/ref_code_signing_helpers.rst
index f7928f52e..fd16ca763 100644
--- a/doc/ref_code_signing_helpers.rst
+++ b/doc/ref_code_signing_helpers.rst
@@ -215,6 +215,85 @@ Preconditions:
- when used with SoftHSM, certificates must have been imported before
(see :ref:`cs_import_cert_from_der`, :ref:`cs_import_cert_from_pem`)
+.. _cs_define_group:
+
+cs_define_group
+^^^^^^^^^^^^^^^
+
+Usage:
+
+.. code-block:: bash
+
+ cs_define_group <group>
+
+Define a new role group.
+
+See :ref:`cs_group_add_roles` for an example.
+
+.. _cs_group_add_roles:
+
+cs_group_add_roles
+^^^^^^^^^^^^^^^^^^
+
+Usage:
+
+.. code-block:: bash
+
+ cs_group_add_roles <group> <roles...>
+
+Add all given roles to a role group.
+
+Preconditions:
+
+- the group must have been defined (see :ref:`cs_define_group`)
+- the role(s) must have been defined (see :ref:`cs_define_role`)
+
+Example:
+
+.. code-block:: bash
+
+ # define two roles named imx-habv4-srk1 and imx-habv4-srk2
+ r="imx-habv4-srk1"
+ cs_define_role "${r}"
+ cs_set_uri "${r}" "pkcs11:object=SRK CA 0"
+ cs_append_ca_from_uri "${r}"
+ r="imx-habv4-srk2"
+ cs_define_role "${r}"
+ cs_set_uri "${r}" "pkcs11:object=SRK CA 1"
+ cs_append_ca_from_uri "${r}"
+
+ # define a group and add the roles
+ g="imx-habv4-srk"
+ cs_define_group "${g}"
+ cs_group_add_roles "${g}" "imx-habv4-srk1" "imx-habv4-srk2"
+
+.. _cs_group_get_roles:
+
+cs_group_get_roles
+^^^^^^^^^^^^^^^^^^
+
+Usage:
+
+.. code-block:: bash
+
+ cs_group_get_roles <group>
+
+Get a list of all roles that have been added to the role group.
+
+Example:
+
+.. code-block:: bash
+
+ # iterate over role names in a role group, and print their name and URI
+ for role in $(cs_group_get_roles "imx-habv4-srk"); do
+ echo "role '${role}' has URI '$(cs_get_uri "${role}")'"
+ done
+
+In the example given in :ref:`cs_group_add_roles` above, this would print::
+
+ role 'imx-habv4-srk1' has URI 'pkcs11:object=SRK CA 0'
+ role 'imx-habv4-srk2' has URI 'pkcs11:object=SRK CA 1'
+
Consumer Functions
~~~~~~~~~~~~~~~~~~
@@ -251,8 +330,24 @@ Usage:
Get path to the CA keyring in PEM format for role.
+If the provider does not set a CA for this role (see :ref:`cs_append_ca_from_pem`,
+:ref:`cs_append_ca_from_der`, :ref:`cs_append_ca_from_uri`), this function will print an empty
+string.
+
Preconditions:
-- a certificate must have been appended to the CA keyring
- (see :ref:`cs_append_ca_from_pem`, :ref:`cs_append_ca_from_der`,
- :ref:`cs_append_ca_from_uri`)
+- The role must have been defined by the provider (see :ref:`cs_define_role`).
+ Otherwise, this function will print ``ERROR_CA_NOT_YET_SET`` and return 1.
+ This can happen if the function is evaluated by a variable expansion in make
+ with ``:=`` instead of ``=`` before the code signing provider is set up.
+
+Example:
+
+.. code-block:: make
+
+ # set up kernel module signing, and add a trusted CA if the provider set one
+ KERNEL_SIGN_OPT =
+ CONFIG_MODULE_SIG_KEY='"$(shell cs_get_uri kernel-modules)"' \
+ CONFIG_MODULE_SIG_ALL=y \
+ $(if $(shell cs_get_ca kernel-trusted), \
+ CONFIG_SYSTEM_TRUSTED_KEYS=$(shell cs_get_ca kernel-trusted))
diff --git a/doc/ref_make_macros.rst b/doc/ref_make_macros.rst
index ae65cb940..fe300c457 100644
--- a/doc/ref_make_macros.rst
+++ b/doc/ref_make_macros.rst
@@ -148,6 +148,71 @@ For ``install`` the package directory is deleted.
When ``--verbose`` is used then the full command is logged. With
``--quiet`` both stdout and stderr are redirected to the logfile.
+ptx/image-install, ptx/image-install-link, world/image-clean
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Usage:
+
+.. code-block:: none
+
+ @$(call world/image-clean, <PKG>)
+ @$(call ptx/image-install, <PKG>, $(<PKG>_BUILD_DIR)/<source-image-name>[, <image-name>])
+ @$(call ptx/image-install-link, <PKG>, <link-target>, <link-name>)
+
+These macros are used to install files to ``|ptxdistPlatformDir|/images``.
+They are only allowed in the *targetinstall* stage. They are used by
+packages that produce files that are not part of a filesystem. Bootloaders
+are typical packages that do this.
+
+``world/image-clean`` will remove the files that were created by the other
+two macros in a previous run of the *targetinstall* stage. This also
+happens implicitly when the package is cleaned.
+
+``ptx/image-install`` copies a file. The source must be an absolute path.
+The destination must be relative to the image directory. If the destination
+file name is the source file without the path, then this argument can be
+omitted.
+
+``ptx/image-install-link`` creates a symlink in the image directory.
+
+.. _world_image_fit:
+
+world/image-fit
+~~~~~~~~~~~~~~~
+
+.. code-block:: none
+
+ @$(call world/image-fit, <PKG>)
+
+Build a FIT image containing a kernel, optionally an initial ramdisk, and one or
+multiple device trees. For each device tree, a configuration node is generated.
+
+.. note:: You can generate a template for a new FIT image recipe by
+ calling ``ptxdist newpackage image-fit``.
+
+The following variables are respected:
+
+``<PKG>_IMAGE``
+ The output file, usually something like ``$(IMAGEDIR)/pkg.fit``.
+
+``<PKG>_KERNEL``
+ The kernel image to package into the FIT image.
+
+``<PKG>_DTB``
+ One or more device trees that should be included in the FIT image.
+
+``<PKG>_INITRAMFS``
+ If the FIT image should contain an initial ramdisk, this variable determines
+ the initrd file name that is included. Otherwise it can be left empty.
+
+``<PKG>_SIGN_ROLE``
+ If the FIT image should be signed, this variable determines the role name
+ used for the signature. It is passed to :ref:`cs_get_uri`.
+
+``<PKG>_KEY_NAME_HINT``
+ If the FIT image should be signed, this variable determines the
+ *key-name-hint* property of the signature node.
+
.. _install_copy:
install_copy
@@ -259,7 +324,7 @@ Usage:
.. code-block:: make
- $(call install_tree, <package>, <UID>, <GID>, <source dir>, <destination dir>, <strip>])
+ $(call install_tree, <package>, <UID>, <GID>, <source dir>, <destination dir>[, <strip>])
Installs the whole directory tree with all files from the given directory into:
@@ -481,7 +546,7 @@ Usage:
.. code-block:: make
- $(call install_archive, <package>, <UID>, <GID>, <archive> , <base path>)
+ $(call install_archive, <package>, <UID>, <GID>, <archive> , <base path>[, <strip>])
Installs archives content into:
@@ -504,6 +569,8 @@ All parameters have fixed meanings:
**<base path>**
Base path component in the root filesystem the archive should be extracted
to. Can be just ``/`` for root.
+**<strip>**
+ same as for :ref:`install_copy`.
install_glob
~~~~~~~~~~~~
@@ -654,6 +721,24 @@ be installed with some other ``install_*`` command before
@$(call install_replace, timezone, /etc/timezone, @TIMEZONE@, \
$(PTXCONF_TIMEZONE_LOCALTIME))
+.. _ptx/cfghash:
+.. _ptx/cfghash-file:
+
+ptx/cfghash, ptx/cfghash-file
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Usage:
+
+.. code-block:: make
+
+ $(call ptx/cfghash, <PKG>, <string>)
+ $(call ptx/cfghash-file, <PKG>, <file>)
+
+Add an arbitrary **<string>** or the content of **<file>** to the config hash
+for **<PKG>**.
+This has the effect that the package will be rebuilt when the string or the
+content of the file changes.
+
.. _param_macros:
.. _ptxEndis:
.. _ptxDisen:
@@ -673,6 +758,7 @@ Usage:
$(call ptx/wow, VARIABLE)
$(call ptx/wwo, VARIABLE)
$(call ptx/yesno, VARIABLE)
+ $(call ptx/noyes, VARIABLE)
$(call ptx/truefalse, VARIABLE)
$(call ptx/falsetrue, VARIABLE)
$(call ptx/onoff, VARIABLE)
@@ -694,6 +780,8 @@ These are useful for ``<PKG>_CONF_OPT`` variables, and expand as follows:
+--------------------+-------------------------------+---------------------------------+---------------------+
| ptx/yesno | ``yes`` | ``no`` | autoconf cache vars |
+--------------------+-------------------------------+---------------------------------+---------------------+
+| ptx/noyes | ``no`` | ``yes`` | scons |
++--------------------+-------------------------------+---------------------------------+---------------------+
| ptx/truefalse | ``true`` | ``false`` | meson |
+--------------------+-------------------------------+---------------------------------+---------------------+
| ptx/falsetrue | ``false`` | ``true`` | meson |
@@ -757,10 +845,15 @@ whereas if the respective variable is unset, they would expand to the opposite:
ptx/get-alternative
~~~~~~~~~~~~~~~~~~~
+Usage:
+
+.. code-block:: make
+
+ $(call ptx/get-alternative, <prefix>, <file>)
+
This macro can be used to find files or directories in the BSP and PTXdist.
-There are two arguments, **prefix** and **file**. The search path is very
-similar to :ref:`install_alternative`. The first existing location of the
-following paths is returned:
+The search path is very similar to :ref:`install_alternative`.
+The first existing location of the following paths is returned:
* ``$(PTXDIST_WORKSPACE)/$(prefix)$(PTXDIST_PLATFORMSUFFIX)/$(file)``
* ``$(PTXDIST_WORKSPACE)/$(prefix)/$(file)$(PTXDIST_PLATFORMSUFFIX)``
@@ -775,9 +868,14 @@ following paths is returned:
ptx/in-path
~~~~~~~~~~~
+Usage:
+
+.. code-block:: make
+
+ $(call ptx/in-path, <path>, <file>)
+
This macro can be used to find files or directories in the BSP and PTXdist.
-There are two arguments, **path variable** and **file**. The **path
-variable** must be a variable name that is available in a shell called by
+The **path** must be a variable name that is available in a shell called by
**make**. The variable must contain a ``:`` separated list of directories.
The **file** will be searched in these directories and the first existing
path is returned. PTXdist defines several variables that can be used here.
@@ -801,8 +899,14 @@ directories for each of these variables.
ptx/in-platformconfigdir
~~~~~~~~~~~~~~~~~~~~~~~~
-This macro is only useful with multiple layers. It has one argument
-**file**. The **file** is searched for in the platform directory in
+Usage:
+
+.. code-block:: make
+
+ $(call ptx/in-platformconfigdir, <file>)
+
+This macro is only useful with multiple layers.
+The argument **file** is searched for in the platform directory in
all layers in the usual search order. It returns the first existing file.
If none exists it returns ``$(PTXDIST_PLATFORMCONFIGDIR)/$(file)``. This
avoids unexpected errors due to empty variables if a file is missing.
diff --git a/doc/ref_make_variables.rst b/doc/ref_make_variables.rst
index 674acdcea..775ff71be 100644
--- a/doc/ref_make_variables.rst
+++ b/doc/ref_make_variables.rst
@@ -35,18 +35,18 @@ Global Variables
project. All of the project’s packages built for the host to create data
for the target are searching in this directory tree for their
dependencies (executables, header and library files). Use
- ``$(PTXDIST_SYSROOT_CROSS)/bin`` to install executables,
- ``$(PTXDIST_SYSROOT_CROSS)/include`` for header files and
- ``$(PTXDIST_SYSROOT_CROSS)/lib`` for libraries.
+ ``$(PTXDIST_SYSROOT_CROSS)/usr/bin`` to install executables,
+ ``$(PTXDIST_SYSROOT_CROSS)/usr/include`` for header files and
+ ``$(PTXDIST_SYSROOT_CROSS)/usr/lib`` for libraries.
``PTXDIST_SYSROOT_HOST``
``PTXDIST_SYSROOT_HOST`` points to a directory tree all host relevant
executables, libraries and header files are installed to. All project’s
packages built for the host are searching in this directory tree for
their dependencies (executables, header and library files). Use
- ``$(PTXDIST_SYSROOT_HOST)/bin`` to install executables,
- ``$(PTXDIST_SYSROOT_HOST)/include`` for header files and
- ``$(PTXDIST_SYSROOT_HOST)/lib`` for libraries.
+ ``$(PTXDIST_SYSROOT_HOST)/usr/bin`` to install executables,
+ ``$(PTXDIST_SYSROOT_HOST)/usr/include`` for header files and
+ ``$(PTXDIST_SYSROOT_HOST)/usr/lib`` for libraries.
``PTXDIST_SYSROOT_TARGET``
``PTXDIST_SYSROOT_TARGET`` points to a directory tree all target
@@ -127,6 +127,8 @@ Other useful variables:
that are built and installed during the PTXdist build run.
There are analogous ``-y`` and ``-m`` variants of those variables too.
+.. _package_specific_variables:
+
Package Specific Variables
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -194,9 +196,14 @@ Package Definition
Git URLs must either start with 'git://' or end with '.git'. They have a
mandatory ``tag=<tagname>`` option.
- Svn URLs must start with 'svn://'. They have a mandatory
+ SVN URLs must start with 'svn://'. They have a mandatory
``rev=r<number>`` option.
+ SVN custom tunnel schemes (e.g. 'svn+ssh') are supported as
+ well. There is a special treatment for 'svn+https'. In this case
+ the URL is fixed and 'svn+' is removed from URL. This is useful to
+ work around firewalls that block 'svn' ports.
+
``<PKG>_SOURCE``
The location of the downloaded source archive. There should be no reason
to set this to anything other than
@@ -223,10 +230,19 @@ Package Definition
'gdbserver' for an example.
``<PKG>_LICENSE``
- The license of the package. The SPDX license identifiers should be used
- here. Use ``proprietary`` for proprietary packages and ``ignore`` for
- packages without their own license, e.g. meta packages or packages that
- only install files from ``projectroot/``.
+ The license of the package in the form of an `SPDX license expression
+ <https://spdx.org/licenses/>`_.
+ The following values have special meaning for PTXdist:
+
+ - ``custom`` and ``custom-exception``: for licenses or license exceptions
+ that are considered free software, but do not match any license or license
+ exception known to SPDX.
+ - ``proprietary``: for proprietary (non-free) packages
+ - ``ignore`` for packages without their own license, e.g. meta packages or
+ packages that only install files from ``projectroot/``
+ - ``unknown``: no licensing information was extracted yet
+
+ See the section :ref:`licensing_in_packages` for more information.
``<PKG>_LICENSE_FILES``
A space separated list of URLs of license text files. The URLs must be
@@ -238,6 +254,7 @@ Package Definition
used in case the specified file contains more than just the license text,
e.g. if the license is in the header of a source file. For non ASCII or
UTF-8 files the encoding can be specified with ``encoding=<enc>``.
+ See the section :ref:`licensing_in_packages` for more information.
For most packages the variables described above are undefined by default.
However, for cross and host packages these variables default to the value
@@ -296,7 +313,7 @@ Build Environment for all Stages
packages and ``PATH=$(HOST_CROSS_PATH)`` for cross packages. It must be
set by packages that use the variable locally in the make file or if more
directories are added, e.g. to
- ``PATH=$(PTXDIST_SYSROOT_CROSS)/bin/qt5:$(CROSS_PATH)`` for packages that
+ ``PATH=$(PTXDIST_SYSROOT_CROSS)/usr/bin/qt5:$(CROSS_PATH)`` for packages that
use qmake from Qt5.
``<PKG>_CFLAGS``, ``<PKG>_CPPFLAGS``, ``<PKG>_LDFLAGS``
@@ -325,9 +342,34 @@ Build Environment for all Stages
individual options by setting it to a space separated list of the
corresponding Kconfig symbols (without the ``PTXCONF_`` prefix).
+``<PKG>_WRAPPER_ACCEPT_PATHS``
+ By default, the toolchain wrapper scripts will drop any -I and -L paths
+ that point to directories outside the BSP for target packages. This
+ avoids problems with bad search paths due to broken package build
+ systems.
+
+ Sometimes search paths outside the BSP are needed. In this case
+ ``<PKG>_WRAPPER_ACCEPT_PATHS`` can be used. It accepts a space separated
+ list of directories. Those directories (with and without symlinks
+ resolved) will not be dropped when the wrapper filters the search paths.
+
+ For example, external kernel modules need the kernel source tree. If the
+ kernel is built :ref:`using an external source tree<kernel_local_src>`
+ then search paths to that source tree are needed. So external kernel
+ modules should set ``<PKG>_WRAPPER_ACCEPT_PATHS`` to ``$(KERNEL_DIR)``.
+
Prepare Stage
^^^^^^^^^^^^^
+``<PKG>_CFGHASH``
+ This variable contains the config hash for the package.
+ If it changes, PTXdist rebuilds the prepare stage of the package (and
+ successively, all following stages).
+
+ You should not need to touch this variable directly.
+ To add content to the config hash, you can use the macros :ref:`ptx/cfghash
+ and ptx/cfghash-file <ptx/cfghash>`.
+
``<PKG>_CONF_ENV``
The environment for the prepare stage. If undefined, PTXdist will use
``$(CROSS_ENV)`` for target packages, ``$(HOST_ENV)`` for host packages
@@ -436,7 +478,7 @@ different.
package then this package should be selected in the menu file.
``<PKG>_PKGS``
- This is another mechanism to add files to the image. It can be uses
+ This is another mechanism to add files to the image. It can be used
instead of or in addition to ``<PKG>_FILES``. It must be set to a list of
ptxdist packages (the lowercase name of the packages). PTXdist will add
the necessary dependencies.
@@ -444,9 +486,9 @@ different.
Note that this will not ensure that the packages are enabled or that all
all package dependencies are satisfied. ``$(PTX_PACKAGES_INSTALL)`` can
be used to specify all enabled packages. Or ``$(call ptx/collection,
- $(PTXDIST_WORKSPACE)/configs/<collection-file-name>)`` can be uses to to
+ $(PTXDIST_WORKSPACE)/configs/<collection-file-name>)`` can be used to
specify the packages enabled by this collection. In both cases ``=`` must
- be uses instead of ``:=`` due to the makefile include order.
+ be used instead of ``:=`` due to the makefile include order.
``<PKG>_CONFIG``
``genimage`` packages use this to specify the ``genimage`` configuration
diff --git a/doc/ref_parameter.rst b/doc/ref_parameter.rst
index a5b9bfe9e..dd71046bb 100644
--- a/doc/ref_parameter.rst
+++ b/doc/ref_parameter.rst
@@ -57,6 +57,10 @@ Setup and Project Actions
simply some network settings to permit PTXdist to download required
packages.
+``localsetup``
+ The same setting as `ptxdist setup`. Any changes are saved locally in the
+ BSP and overwrite the global settings.
+
``boardsetup``
PTXdist based projects can provide information to
setup and configure the target automatically. This action lets the user
@@ -229,6 +233,32 @@ Misc Actions
are shown as well, so this can be used to verify that the correct version
of these files are used.
+``fast-bsp-report``
+ create a yaml report that describes the BSP and all packages. The data is
+ similar to what ``bsp-info`` and ``package-info`` provide but combined
+ into a machine readable format.
+
+ To run this command, the BSP must be configured (e.g. the toolchain must
+ be available), but it works without building packages.
+
+ The expected format of the yaml file is described in schema
+ ``scripts/bsp-report-schema.yaml`` in the PTXdist source tree. There is
+ also a simple helper script ``scripts/validate-bsp-report-schema.py``
+ that can be used to validate the yaml file.
+
+ The result is found in ``<platform-dir>/release/fast-bsp-report.yaml``.
+
+``full-bsp-report``
+ create a yaml report much like ``fast-bsp-report``. It contains some
+ additional data, such as the list of ipkgs created by a package. The
+ license information is validated and expanded, so this can be used to
+ create a custom license report.
+
+ When the report is generated all packages will be built unless they are
+ already built.
+
+ The result is found in ``<platform-dir>/release/full-bsp-report.yaml``.
+
.. _command_print:
``print <var>``
diff --git a/doc/user_manual.inc b/doc/user_manual.inc
index 2adcd964c..6bd534f3d 100644
--- a/doc/user_manual.inc
+++ b/doc/user_manual.inc
@@ -125,6 +125,10 @@ download an archive currently not existing on the development host. But
there are ways to prevent PTXdist from doing so (refer to section
:ref:`source-arch-loc`).
+.. note:: PTXdist tries to prevent downloads outside of the *get* stage
+ by setting certain widespread proxy environment variables to an
+ inexistent host name.
+
First steps with PTXdist
------------------------