guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch master updated: website: Add draft post on the Full-Source Bootst


From: Jan Nieuwenhuizen
Subject: branch master updated: website: Add draft post on the Full-Source Bootstrap.
Date: Wed, 26 Apr 2023 03:34:38 -0400

This is an automated email from the git hooks/post-receive script.

janneke pushed a commit to branch master
in repository guix-artwork.

The following commit(s) were added to refs/heads/master by this push:
     new 10f5eb0  website: Add draft post on the Full-Source Bootstrap.
10f5eb0 is described below

commit 10f5eb039390e21c431192d76b0bd59d60f9c912
Author: Janneke Nieuwenhuizen <janneke@gnu.org>
AuthorDate: Wed Apr 26 08:57:54 2023 +0200

    website: Add draft post on the Full-Source Bootstrap.
    
    * website/drafts/full-source-bootstrap.md,
    website/static/blog/img/gcc-core-mesboot0-full-source-bootstrap-graph.svg:
    New files.
---
 website/drafts/full-source-bootstrap.md            | 243 +++++++++++
 ...c-core-mesboot0-full-source-bootstrap-graph.svg | 469 +++++++++++++++++++++
 2 files changed, 712 insertions(+)

diff --git a/website/drafts/full-source-bootstrap.md 
b/website/drafts/full-source-bootstrap.md
new file mode 100644
index 0000000..c6c5afb
--- /dev/null
+++ b/website/drafts/full-source-bootstrap.md
@@ -0,0 +1,243 @@
+title: Guix Full-Source Bootstrap
+date: 2023-04-30 12:00
+author: Janneke Nieuwenhuizen, Ludovic Courtès
+tags: Bootstrapping, Reproducible builds, Security
+---
+We are delighted and somewhat relieved to announce that the third
+reduction by about 50% of the Guix _bootstrap binaries_ has now been
+officially released!  Also known as: The Full-Source Bootstrap.
+
+The initial set of binaries from which packages are built now weighs
+in at 25~MiB, about a tenth of what it used to be.  If that doesn't
+sound exciting enough, then consider that the only traditional
+bootstrap binary that now remains is `guile-bootstrap`: the driver
+that Guix uses to build packages.
+
+### FIXME: how is guile-bootstrap unpacked, don't we also have tar,
+### xz, bash as bootstrap binaries or are bootar/gash used here too?
+
+To put it differently: With this release, the Guix package graph (for
+x86_64-linux) is now rooted in a 357-byte binary!
+
+In [two previous
+](https://guix.gnu.org/blog/2020/guix-further-reduces-bootstrap-seed-to-25/)
+[blog
+post](https://guix.gnu.org/blog/2019/guix-reduces-bootstrap-seed-by-50/)
+we elaborated on why this reduction and bootstrappability in general
+is so important.
+
+One reason is to properly address supply chain security concerns.  The
+Bitcoin community was one of the first to recognize its importance
+well enough to put the idea into practice.  At the [Breaking Bitcoin
+conference 2020](https://breaking-bitcoin.com), Carl Dong gave a [fun
+and remarkably gentle
+introduction](http://diyhpl.us/wiki/transcripts/breaking-bitcoin/2019/bitcoin-build-system).
+At the end of his talk, he states
+
+```
+The holy grail for bootstrappability will be connecting `hex0` to `mes`.  -- 
Carl Dong
+```
+
+Two years ago at [FOSDEM2021](https://fosdem.org/2021) I gave [a short
+talk ](https://fosdem.org/2021/schedule/event/gnumes/) about how we
+were planning to continue this quest.
+
+If you choose to believe that building from source is the proper way
+to do computing, then it follows that the [“trusting
+trust”](https://www.archive.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf)
+attack is only a symptom of an incomplete or missing bootstrap story.
+
+#### Full-Source Bootstrap
+
+Three years ago, the _bootstrap binaries_ were reduced to just [GNU
+Mes](https://www.gnu.org/software/mes) and
+[MesCC-Tools](https://savannah.nongnu.org/projects/mescc-tools) (and
+the driver to build Guix packages: a [static
+build](https://alpha.gnu.org/pub/gnu/guix/bootstrap/x86_64-linux/20131110/guile-2.0.9.tar.xz)
+of [GNU Guile](https://www.gnu.org/software/guile) 2.0.9).
+
+The new _Full-Source Bootstrap_, merged in Guix `master` this month,
+removes the binaries for Mes and MesCC-Tools and replaces them by 
[bootstrap-seeds](https://github.com/oriansj/bootstrap-seeds).  For x86-linux 
(which is also used by the x86_64-linux build), this means this program
+[hex0-seed](https://github.com/oriansj/bootstrap-seeds/blob/master/POSIX/x86/hex0-seed),
 with ASCII-equivalent
+[hex0_x86.hex0](https://github.com/oriansj/bootstrap-seeds/blob/master/POSIX/x86/hex0_x86.hex0).
  Hex0 is self-hosting and its source looks like this:
+
+```
+    ; Where the ELF Header is going to hit  
+    ; Simply jump to _start  
+    ; Our main function  
+    # :_start ; (0x8048054)  
+    58 # POP_EAX ; Get the number of arguments  
+```
+
+you can spot two types of line-comment: hex0 (`;`) and assembly (`#`).
+The only program-code in this snippet is `58`: two hexidecimal digits
+that are taken as two nibbles and compiled into the corresponding byte
+with binary value `58`.
+
+Starting from this 357-byte hex0-seed binary provided by the
+`bootstrap-seeds`, the [stage0-posix
+package](https://github.com/oriansj/stage0-posix) created by Jeremiah
+Orians first builds hex0 and then all the way up: hex1, catm, hex2,
+M0, cc_x86, M1, M2, get_machine (that's all of MesCC-Tools), and
+finally [M2-Planet](https://github.com/oriansj/m2-planet).
+
+The new [GNU Mes](https://gnu.org/s/mes) v0.24 release can be built
+with M2-Planet.  This time with only a [remarkably small change]
+(https://issues.guix.gnu.org/55227), the bottom of the package graph
+now looks like this (woohoo!):
+
+```
+                              gcc-mesboot (4.9.4)
+                                      ^
+                                      |
+                                    (...)
+                                      ^
+                                      |
+               binutils-mesboot (2.20.1a), glibc-mesboot (2.2.5),
+                          gcc-core-mesboot (2.95.3)
+                                      ^
+                                      |
+                             patch-mesboot (2.5.9)
+                                      ^
+                                      |
+                       bootstrappable-tcc (0.9.26+31 patches)
+                                      ^
+                                      |
+                            gnu-make-mesboot0 (3.80)
+                                      ^
+                                      |
+                              gzip-mesboot (1.2.4)
+                                      ^
+                                      |
+                               tcc-boot (0.9.27)
+                                      ^
+                                      |
+                                 mes-boot (0.24.2)
+                                      ^
+                                      |
+                         stage0-posix (hex0..M2-Planet)
+                                      ^
+                                      |
+                          gash-boot, gash-utils-boot
+                                      ^
+                                      |
+                                      *
+                     bootstrap-seeds (357-bytes for x86)
+                                     ~~~
+                   [bootstrap-guile-2.0.9 driver (~25 MiB)]
+```
+[full 
graph](/static/blog/img/gcc-core-mesboot0-full-source-bootstrap-graph.svg)
+
+We are excited that the [NLnet Foundation](https://nlnet.nl) has [been
+sponsoring this work](https://nlnet.nl/project/GNUMes-fullsource)!
+
+However, we aren't done yet; far from it.
+
+### Lost Paths
+
+The idea of reproducible builds and bootstrappable software [is not
+very
+new](https://lists.reproducible-builds.org/pipermail/rb-general/2017-January/000309.html).
+Much of that was implemented for the GNU tools in the early 1990s.
+Working to recreate it in present time shows us much of that practice
+was forgotten.
+
+Most bootstrap problems or loops are not so easy to solve and
+sometimes there are no obvious answers, for example:
+
+* In 2013, the year that [Reproducible
+  Builds](https://reproducible-builds.org) started to gain some
+  traction, the GNU Compiler Collection [released
+  gcc-4.8.0](http://gcc.gnu.org/gcc-4.8/changes.html),
+  making C++ a build requirement, and
+
+* Even more recently (2018), the GNU C Library [glibc-2.28 adds Python
+  as a build
+  
requirement](https://sourceware.org/git/?p=glibc.git;a=commit;h=c6982f7efc1c70fe2d6160a87ee44d871ac85ab0),
+
+and while these examples make for a delightful puzzle from a
+bootstrappability perspective, we would love to see the maintainers of
+GNU softwares to consider bootstrappability and start taking more
+responsibility for the bootstrap story of their packages.
+
+#### Towards a Universal, Full-Source Bootstrap
+
+We are most grateful and excited that the [Nlnet
+Foundation](https://nlnet.nl) has [decided to continue sponsoring this
+work](https://nlnet.nl/project/GNUMes-ARM_RISC-V)!
+
+While the reduced bootstrap currently only applies to the i686-linux
+and x86_64-linux architectures, we are thrilled that ARM and RISC-V
+will be joining soon.
+
+Some time ago, Wladimir van der Laan contributed initial RISC-V
+support for Mes but a major obstacle for the RISC-V bootstrap is that
+the “vintage” GCC-2.95.3 that was such a helpful stepping stone does
+not support RISC-V.  Worse, the RISC-V port of GCC was introduced only
+in GCC 7.5.0; a version that requires c++ to build and cannot be
+bootstrapped!  To this end, we have been working to make Mes support
+building GCC 4.6.5, while Ekaitz Zarraga has been working on
+[backporting RISC-V support to GCC
+4.6.5](https://nlnet.nl/project/GNUMes-RISCV/) and backporting RISC-V
+support from latest tcc to our bootstrappable-tcc.
+
+Another interesting joint development effort with Timothy Samplet
+addresses the dependency on guile-bootstrap of Gash and Gash-Utils.
+On the one hand, Mes is gaining a higher level of Guile-compatibility:
+hash table interface, record interface, variables and variable-lookup,
+and Guile (source) module loading support.  On the other hand, Gash
+and Gash-Utils are getting Mes compatibility for features that Mes is
+lacking (notably syntax-case macros).  If we pull this off, the
+guile-bootstrap dependency will be reduced to bootar and as the driver
+for Guix.
+
+Where a full-source bootstrap was once deemed (almost) impossible,
+there are still some dauting tasks ahead.  What about the Linux
+kernel?  The good news is that the bootstrappable community has grown
+a lot, from two people six years ago there are now around 100 people
+in the `#bootstrappable` IRC-channel.  Interesting times ahead!
+
+#### About Bootstrappable Builds and GNU Mes
+
+Software is bootstrappable when it does not depend on a binary seed
+that cannot be built from source.  Software that is not
+bootstrappable---even if it is free software---is a serious security
+risk (supply chain security)
+[for](https://www.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf)
+[a](https://manishearth.github.io/blog/2016/12/02/reflections-on-rusting-trust/)
+[variety](https://www.quora.com/What-is-a-coders-worst-nightmare/answer/Mick-Stute)
+[of](http://blog.regehr.org/archives/1241)
+[reasons](https://www.alchemistowl.org/pocorgtfo/pocorgtfo08.pdf).
+The [Bootstrappable Builds](https://bootstrappable.org/) project aims
+to reduce the number and size of binary seeds to a bare minimum.
+
+[GNU Mes](https://www.gnu.org/software/mes/) is closely related to the
+Bootstrappable Builds project.  Mes is used in the full-source
+bootstrap path for the Guix System.
+
+Currently, Mes consists of a mutual self-hosting scheme interpreter
+and C compiler.  It also implements a C library.  Mes, the scheme
+interpreter, is written in about 5,000 lines of code of simple C and
+can be built with [M2-Planet](https://github.com/oriansj/m2-planet).
+MesCC, the C compiler, is written in scheme.  Together, Mes and MesCC
+can compile [bootstrappable TinyCC](http://gitlab.com/janneke/tinycc)
+that is self-hosting.  Using this TinyCC and the Mes C library, the
+entire Guix System for i686-linux and x86_64-linux is bootstrapped.
+
+#### About GNU Guix
+
+[GNU Guix](https://guix.gnu.org) is a transactional package manager and
+an advanced distribution of the GNU system that [respects user
+freedom](https://www.gnu.org/distros/free-system-distribution-guidelines.html).
+Guix can be used on top of any system running the Hurd or the Linux
+kernel, or it can be used as a standalone operating system distribution
+for i686, x86_64, ARMv7, AArch64 and POWER9 machines.
+
+In addition to standard package management features, Guix supports
+transactional upgrades and roll-backs, unprivileged package management,
+per-user profiles, and garbage collection.  When used as a standalone
+GNU/Linux distribution, Guix offers a declarative, stateless approach to
+operating system configuration management.  Guix is highly customizable
+and hackable through [Guile](https://www.gnu.org/software/guile)
+programming interfaces and extensions to the
+[Scheme](http://schemers.org) language.
diff --git 
a/website/static/blog/img/gcc-core-mesboot0-full-source-bootstrap-graph.svg 
b/website/static/blog/img/gcc-core-mesboot0-full-source-bootstrap-graph.svg
new file mode 100644
index 0000000..5650143
--- /dev/null
+++ b/website/static/blog/img/gcc-core-mesboot0-full-source-bootstrap-graph.svg
@@ -0,0 +1,469 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
+<!-- Generated by graphviz version 2.49.0 (20210828.1703)
+ -->
+<!-- Title: Guix package Pages: 1 -->
+<svg width="396pt" height="347pt"
+ viewBox="0.00 0.00 395.63 347.46" xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink";>
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 
343.46)">
+<title>Guix package</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-343.46 
391.63,-343.46 391.63,4 -4,4"/>
+<!-- 139803511371136 -->
+<g id="node1" class="node">
+<title>139803511371136</title>
+<polygon fill="none" stroke="black" points="280.57,-338 137.57,-338 
137.57,-320 280.57,-320 280.57,-338"/>
+<text text-anchor="middle" x="209.07" y="-326.8" font-family="sans" 
font-size="9.00">gcc&#45;core&#45;mesboot0@2.95.3</text>
+</g>
+<!-- 139803511371312 -->
+<g id="node2" class="node">
+<title>139803511371312</title>
+<polygon fill="none" stroke="black" points="280.07,-308 138.07,-308 
138.07,-290 280.07,-290 280.07,-308"/>
+<text text-anchor="middle" x="209.07" y="-296.8" font-family="sans" 
font-size="9.00">binutils&#45;mesboot0@2.20.1a</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803511371312 -->
+<g id="edge1" class="edge">
+<title>139803511371136&#45;&gt;139803511371312</title>
+<path fill="none" stroke="red" d="M209.07,-319.75C209.07,-319.3 209.07,-318.84 
209.07,-318.37"/>
+<polygon fill="red" stroke="red" points="212.57,-318.29 209.07,-308.29 
205.57,-318.29 212.57,-318.29"/>
+</g>
+<!-- 139803511372016 -->
+<g id="node3" class="node">
+<title>139803511372016</title>
+<polygon fill="none" stroke="black" points="171.07,-248 61.07,-248 61.07,-230 
171.07,-230 171.07,-248"/>
+<text text-anchor="middle" x="116.07" y="-236.8" font-family="sans" 
font-size="9.00">gzip&#45;mesboot@1.2.4</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803511372016 -->
+<g id="edge2" class="edge">
+<title>139803511371136&#45;&gt;139803511372016</title>
+<path fill="none" stroke="red" d="M162.49,-319.96C153.57,-317.1 144.65,-313.24 
137.07,-308 123.47,-298.6 120.22,-293.71 115.07,-278 113.05,-271.81 
112.73,-264.74 113.11,-258.39"/>
+<polygon fill="red" stroke="red" points="116.63,-258.43 114.32,-248.09 
109.68,-257.61 116.63,-258.43"/>
+</g>
+<!-- 139803511371488 -->
+<g id="node4" class="node">
+<title>139803511371488</title>
+<polygon fill="none" stroke="black" points="239.07,-278 121.07,-278 
121.07,-260 239.07,-260 239.07,-278"/>
+<text text-anchor="middle" x="180.07" y="-266.8" font-family="sans" 
font-size="9.00">patch&#45;mesboot@2.5.9</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803511371488 -->
+<g id="edge3" class="edge">
+<title>139803511371136&#45;&gt;139803511371488</title>
+<path fill="none" stroke="red" d="M155.65,-319.9C149.99,-316.99 144.91,-313.12 
141.07,-308 136.28,-301.59 136.9,-296.83 141.07,-290 142.43,-287.78 
144.11,-285.8 146.02,-284.04"/>
+<polygon fill="red" stroke="red" points="148.09,-286.86 154.22,-278.22 
144.04,-281.15 148.09,-286.86"/>
+</g>
+<!-- 139803511371664 -->
+<g id="node5" class="node">
+<title>139803511371664</title>
+<polygon fill="none" stroke="black" points="376.57,-278 283.57,-278 
283.57,-260 376.57,-260 376.57,-278"/>
+<text text-anchor="middle" x="330.07" y="-266.8" font-family="sans" 
font-size="9.00">tcc&#45;boot@0.9.27</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803511371664 -->
+<g id="edge4" class="edge">
+<title>139803511371136&#45;&gt;139803511371664</title>
+<path fill="none" stroke="red" d="M250.92,-319.93C261.73,-316.98 
273.12,-313.08 283.07,-308 294.69,-302.07 306.1,-292.94 314.78,-285.12"/>
+<polygon fill="red" stroke="red" points="317.28,-287.57 322.17,-278.16 
312.48,-282.47 317.28,-287.57"/>
+</g>
+<!-- 139803511371840 -->
+<g id="node6" class="node">
+<title>139803511371840</title>
+<polygon fill="none" stroke="black" points="369.57,-248 250.57,-248 
250.57,-230 369.57,-230 369.57,-248"/>
+<text text-anchor="middle" x="310.07" y="-236.8" font-family="sans" 
font-size="9.00">make&#45;mesboot0@3.80</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803511371840 -->
+<g id="edge5" class="edge">
+<title>139803511371136&#45;&gt;139803511371840</title>
+<path fill="none" stroke="red" d="M259.84,-319.88C266.31,-317.01 
272.32,-313.16 277.07,-308 291.85,-291.98 276.05,-278.8 287.07,-260 
288.08,-258.29 289.28,-256.65 290.6,-255.1"/>
+<polygon fill="red" stroke="red" points="293.06,-257.6 297.84,-248.14 
288.21,-252.55 293.06,-257.6"/>
+</g>
+<!-- 139803507105792 -->
+<g id="node7" class="node">
+<title>139803507105792</title>
+<polygon fill="none" stroke="black" points="356.57,-93 261.57,-93 261.57,-75 
356.57,-75 356.57,-93"/>
+<text text-anchor="middle" x="309.07" y="-81.8" font-family="sans" 
font-size="9.00">gash&#45;boot@0.3.0</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803507105792 -->
+<g id="edge6" class="edge">
+<title>139803511371136&#45;&gt;139803507105792</title>
+<path fill="none" stroke="red" d="M280.63,-323.84C300.47,-320.9 321.61,-316.02 
340.07,-308 363.77,-297.7 384.07,-295.84 384.07,-270 384.07,-270 384.07,-270 
384.07,-208 384.07,-185.86 386.67,-126.47 373.07,-109 369.43,-104.32 
364.77,-100.55 359.63,-97.52"/>
+<polygon fill="red" stroke="red" points="361.14,-94.36 350.63,-93.08 
358.05,-100.64 361.14,-94.36"/>
+</g>
+<!-- 139803511373600 -->
+<g id="node8" class="node">
+<title>139803511373600</title>
+<polygon fill="none" stroke="black" points="363.07,-127 247.07,-127 
247.07,-109 363.07,-109 363.07,-127"/>
+<text text-anchor="middle" x="305.07" y="-115.8" font-family="sans" 
font-size="9.00">gash&#45;utils&#45;boot@0.2.0</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803511373600 -->
+<g id="edge7" class="edge">
+<title>139803511371136&#45;&gt;139803511373600</title>
+<path fill="none" stroke="red" d="M263.48,-319.95C312.88,-311.06 
378.07,-294.66 378.07,-270 378.07,-270 378.07,-270 378.07,-208 378.07,-175.51 
348.63,-148.39 327.14,-132.92"/>
+<polygon fill="red" stroke="red" points="329.03,-129.98 318.81,-127.21 
325.07,-135.75 329.03,-129.98"/>
+</g>
+<!-- 139803507105968 -->
+<g id="node9" class="node">
+<title>139803507105968</title>
+<polygon fill="none" stroke="black" points="128.57,-58 61.57,-58 61.57,-40 
128.57,-40 128.57,-58"/>
+<text text-anchor="middle" x="95.07" y="-46.8" font-family="sans" 
font-size="9.00">bootar@1b</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803507105968 -->
+<g id="edge8" class="edge">
+<title>139803511371136&#45;&gt;139803507105968</title>
+<path fill="none" stroke="red" d="M159.15,-319.99C111.55,-310.89 47.07,-294.12 
47.07,-270 47.07,-270 47.07,-270 47.07,-208 47.07,-177.46 44.93,-97.2 
61.07,-71.27 62.7,-68.67 64.77,-66.33 67.08,-64.24"/>
+<polygon fill="red" stroke="red" points="69.55,-66.78 75.62,-58.1 65.46,-61.1 
69.55,-66.78"/>
+</g>
+<!-- 139803749199472 -->
+<g id="node10" class="node">
+<title>139803749199472</title>
+<ellipse fill="none" stroke="black" cx="77.07" cy="-15" rx="77.15" ry="12.96"/>
+<text text-anchor="middle" x="77.07" y="-12.8" font-family="sans" 
font-size="9.00">guile&#45;bootstrap@2.0</text>
+</g>
+<!-- 139803511371136&#45;&gt;139803749199472 -->
+<g id="edge9" class="edge">
+<title>139803511371136&#45;&gt;139803749199472</title>
+<path fill="none" stroke="red" d="M137.29,-324.05C106.8,-321.19 75.45,-316.3 
63.07,-308 46.87,-297.13 41.07,-289.52 41.07,-270 41.07,-270 41.07,-270 
41.07,-83 41.07,-63.76 36.62,-56.75 46.07,-40 47.19,-38.03 48.54,-36.16 
50.04,-34.4"/>
+<polygon fill="red" stroke="red" points="52.53,-36.87 57.38,-27.45 
47.71,-31.79 52.53,-36.87"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803511372016 -->
+<g id="edge10" class="edge">
+<title>139803511371312&#45;&gt;139803511372016</title>
+<path fill="none" stroke="dimgrey" d="M153.5,-289.97C139.88,-286.94 
127.84,-282.99 123.07,-278 118.09,-272.78 116.06,-265.23 115.38,-258.24"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="118.88,-258.05 115.19,-248.11 
111.88,-258.18 118.88,-258.05"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803511371488 -->
+<g id="edge11" class="edge">
+<title>139803511371312&#45;&gt;139803511371488</title>
+<path fill="none" stroke="dimgrey" d="M200.53,-289.75C199.13,-288.4 
197.63,-286.95 196.12,-285.49"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="198.28,-282.72 188.66,-278.29 
193.42,-287.75 198.28,-282.72"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803511371664 -->
+<g id="edge12" class="edge">
+<title>139803511371312&#45;&gt;139803511371664</title>
+<path fill="none" stroke="dimgrey" d="M243.75,-289.98C256.79,-286.96 
271.79,-283.49 285.6,-280.29"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="286.44,-283.69 295.4,-278.02 
284.86,-276.87 286.44,-283.69"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803511371840 -->
+<g id="edge13" class="edge">
+<title>139803511371312&#45;&gt;139803511371840</title>
+<path fill="none" stroke="dimgrey" d="M225.99,-289.98C233.19,-286.45 
241.62,-282.17 249.07,-278 262.65,-270.4 277.47,-261.19 289.1,-253.74"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="291.16,-256.58 297.66,-248.21 
287.36,-250.7 291.16,-256.58"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803507105792 -->
+<g id="edge14" class="edge">
+<title>139803511371312&#45;&gt;139803507105792</title>
+<path fill="none" stroke="dimgrey" d="M226.34,-289.95C231.4,-286.85 
236.52,-282.86 240.07,-278 253.12,-260.16 241.73,-248.97 253.07,-230 
261.63,-215.7 355.48,-142.3 362.07,-127 365.24,-119.65 366.41,-115.72 
362.07,-109 359.21,-104.55 355.29,-100.92 350.88,-97.95"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="352.37,-94.78 341.92,-93.04 
349,-100.92 352.37,-94.78"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803511373600 -->
+<g id="edge15" class="edge">
+<title>139803511371312&#45;&gt;139803511373600</title>
+<path fill="none" stroke="dimgrey" d="M224.54,-289.96C229.22,-286.82 
233.94,-282.8 237.07,-278 248.98,-259.75 237.13,-249.39 247.07,-230 
250.37,-223.56 254.03,-224 258.07,-218 262.95,-210.76 285.01,-162.97 
297.1,-136.53"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="300.36,-137.82 301.32,-127.27 
293.99,-134.92 300.36,-137.82"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803507105968 -->
+<g id="edge16" class="edge">
+<title>139803511371312&#45;&gt;139803507105968</title>
+<path fill="none" stroke="dimgrey" d="M137.84,-293.59C108.09,-287.59 
76.82,-274.76 61.07,-248 51.1,-231.05 61.13,-88.78 70.07,-71.27 71.25,-68.96 
72.81,-66.8 74.56,-64.81"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="76.96,-67.36 81.95,-58.01 
72.22,-62.2 76.96,-67.36"/>
+</g>
+<!-- 139803511371312&#45;&gt;139803749199472 -->
+<g id="edge17" class="edge">
+<title>139803511371312&#45;&gt;139803749199472</title>
+<path fill="none" stroke="dimgrey" d="M138.04,-294.12C109.64,-291.28 
81.07,-286.4 70.07,-278 44.36,-258.36 44.07,-242.36 44.07,-210 44.07,-210 
44.07,-210 44.07,-83 44.07,-63.7 40.97,-57.01 50.07,-40 51.01,-38.26 
52.12,-36.58 53.35,-34.98"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="55.94,-37.33 60.25,-27.65 
50.85,-32.53 55.94,-37.33"/>
+</g>
+<!-- 139803511372016&#45;&gt;139803507105792 -->
+<g id="edge19" class="edge">
+<title>139803511372016&#45;&gt;139803507105792</title>
+<path fill="none" stroke="magenta" d="M86.74,-229.84C81.33,-226.98 
76.35,-223.14 73.07,-218 53.55,-187.39 91.69,-155.58 113.07,-139 145.73,-113.68 
161.29,-120.17 201.07,-109 219.56,-103.81 240.09,-99.01 258.23,-95.09"/>
+<polygon fill="magenta" stroke="magenta" points="258.99,-98.51 268.04,-93.01 
257.53,-91.67 258.99,-98.51"/>
+</g>
+<!-- 139803511372016&#45;&gt;139803511373600 -->
+<g id="edge20" class="edge">
+<title>139803511372016&#45;&gt;139803511373600</title>
+<path fill="none" stroke="magenta" d="M171.17,-236.36C203.67,-234.2 
240.63,-229.25 252.07,-218 277.45,-193.05 243.96,-167.64 265.07,-139 
266.85,-136.6 268.99,-134.47 271.35,-132.58"/>
+<polygon fill="magenta" stroke="magenta" points="273.45,-135.39 279.99,-127.06 
269.68,-129.49 273.45,-135.39"/>
+</g>
+<!-- 139803511372016&#45;&gt;139803507105968 -->
+<g id="edge21" class="edge">
+<title>139803511372016&#45;&gt;139803507105968</title>
+<path fill="none" stroke="magenta" d="M84.27,-229.98C78.66,-227.12 
73.51,-223.24 70.07,-218 65.07,-210.37 65.43,-88.55 73.07,-71.27 73.91,-69.38 
75.01,-67.57 76.26,-65.86"/>
+<polygon fill="magenta" stroke="magenta" points="79.1,-67.94 83.38,-58.25 
73.99,-63.16 79.1,-67.94"/>
+</g>
+<!-- 139803511372016&#45;&gt;139803749199472 -->
+<g id="edge22" class="edge">
+<title>139803511372016&#45;&gt;139803749199472</title>
+<path fill="none" stroke="magenta" d="M82.85,-229.93C76.82,-227.07 
71.16,-223.21 67.07,-218 54.84,-202.4 47.89,-58.47 55.07,-40 55.56,-38.76 
56.14,-37.54 56.8,-36.35"/>
+<polygon fill="magenta" stroke="magenta" points="59.87,-38.08 62.96,-27.95 
54.22,-33.95 59.87,-38.08"/>
+</g>
+<!-- 139803511372192 -->
+<g id="node11" class="node">
+<title>139803511372192</title>
+<polygon fill="none" stroke="black" points="251.57,-218 70.57,-218 70.57,-200 
251.57,-200 251.57,-218"/>
+<text text-anchor="middle" x="161.07" y="-206.8" font-family="sans" 
font-size="9.00">tcc&#45;boot0@0.9.26&#45;1136&#45;g5bba73cc</text>
+</g>
+<!-- 139803511372016&#45;&gt;139803511372192 -->
+<g id="edge18" class="edge">
+<title>139803511372016&#45;&gt;139803511372192</title>
+<path fill="none" stroke="magenta" d="M129.33,-229.75C132.47,-227.8 
135.9,-225.66 139.31,-223.54"/>
+<polygon fill="magenta" stroke="magenta" points="141.42,-226.35 148.07,-218.09 
137.73,-220.41 141.42,-226.35"/>
+</g>
+<!-- 139803511371488&#45;&gt;139803511371840 -->
+<g id="edge46" class="edge">
+<title>139803511371488&#45;&gt;139803511371840</title>
+<path fill="none" stroke="darkseagreen" d="M217.33,-259.98C231.47,-256.93 
247.77,-253.42 262.72,-250.2"/>
+<polygon fill="darkseagreen" stroke="darkseagreen" points="263.78,-253.55 
272.82,-248.02 262.3,-246.71 263.78,-253.55"/>
+</g>
+<!-- 139803511371488&#45;&gt;139803507105792 -->
+<g id="edge48" class="edge">
+<title>139803511371488&#45;&gt;139803507105792</title>
+<path fill="none" stroke="darkseagreen" d="M199.92,-259.87C216.44,-251.9 
238.85,-238.03 249.07,-218 267.46,-181.97 248.04,-167.44 247.07,-127 
246.88,-119 242.55,-115.6 247.07,-109 250.21,-104.42 254.36,-100.71 
259.03,-97.71"/>
+<polygon fill="darkseagreen" stroke="darkseagreen" points="260.68,-100.8 
267.9,-93.04 257.42,-94.61 260.68,-100.8"/>
+</g>
+<!-- 139803511371488&#45;&gt;139803511373600 -->
+<g id="edge49" class="edge">
+<title>139803511371488&#45;&gt;139803511373600</title>
+<path fill="none" stroke="darkseagreen" d="M213.23,-259.91C220.64,-257.02 
228.08,-253.14 234.07,-248 241.02,-242.04 238.72,-237.42 244.07,-230 
248.31,-224.13 251.79,-224.45 255.07,-218 271.33,-186.07 250.28,-168.17 
271.07,-139 272.61,-136.85 274.44,-134.9 276.47,-133.13"/>
+<polygon fill="darkseagreen" stroke="darkseagreen" points="278.73,-135.82 
284.89,-127.2 274.7,-130.1 278.73,-135.82"/>
+</g>
+<!-- 139803511371488&#45;&gt;139803507105968 -->
+<g id="edge50" class="edge">
+<title>139803511371488&#45;&gt;139803507105968</title>
+<path fill="none" stroke="darkseagreen" d="M120.99,-264.23C96.66,-261.41 
72.25,-256.51 64.07,-248 52.27,-235.72 59.07,-227.03 59.07,-210 59.07,-210 
59.07,-210 59.07,-147 59.07,-113.16 50.46,-100.76 67.07,-71.27 68.39,-68.95 
70.07,-66.79 71.95,-64.82"/>
+<polygon fill="darkseagreen" stroke="darkseagreen" points="74.49,-67.26 
79.89,-58.15 69.99,-61.9 74.49,-67.26"/>
+</g>
+<!-- 139803511371488&#45;&gt;139803749199472 -->
+<g id="edge51" class="edge">
+<title>139803511371488&#45;&gt;139803749199472</title>
+<path fill="none" stroke="darkseagreen" d="M120.91,-264.77C95.37,-262.06 
69.44,-257.1 61.07,-248 45.43,-230.97 44.22,-61.37 53.07,-40 53.74,-38.39 
54.57,-36.83 55.53,-35.34"/>
+<polygon fill="darkseagreen" stroke="darkseagreen" points="58.32,-37.45 
61.95,-27.5 52.9,-33.02 58.32,-37.45"/>
+</g>
+<!-- 139803511371488&#45;&gt;139803511372192 -->
+<g id="edge47" class="edge">
+<title>139803511371488&#45;&gt;139803511372192</title>
+<path fill="none" stroke="darkseagreen" d="M178.73,-259.98C177.3,-252.18 
174.73,-240.07 171.07,-230 170.81,-229.26 170.52,-228.51 170.21,-227.76"/>
+<polygon fill="darkseagreen" stroke="darkseagreen" points="173.22,-225.94 
165.8,-218.37 166.89,-228.91 173.22,-225.94"/>
+</g>
+<!-- 139803511371664&#45;&gt;139803511371840 -->
+<g id="edge57" class="edge">
+<title>139803511371664&#45;&gt;139803511371840</title>
+<path fill="none" stroke="#8b7765" d="M324.18,-259.75C323.46,-258.73 
322.7,-257.67 321.92,-256.58"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="324.65,-254.39 315.99,-248.29 
318.96,-258.46 324.65,-254.39"/>
+</g>
+<!-- 139803511371664&#45;&gt;139803507105792 -->
+<g id="edge59" class="edge">
+<title>139803511371664&#45;&gt;139803507105792</title>
+<path fill="none" stroke="#8b7765" d="M354.56,-259.85C360.1,-256.92 
365.41,-253.05 369.07,-248 379.1,-234.15 375.07,-227.1 375.07,-210 375.07,-210 
375.07,-210 375.07,-147 375.07,-129.97 380.56,-122.42 370.07,-109 
366.44,-104.35 361.77,-100.59 356.64,-97.57"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="358.18,-94.42 347.66,-93.13 
355.07,-100.7 358.18,-94.42"/>
+</g>
+<!-- 139803511371664&#45;&gt;139803511373600 -->
+<g id="edge60" class="edge">
+<title>139803511371664&#45;&gt;139803511373600</title>
+<path fill="none" stroke="#8b7765" d="M353.87,-259.97C359.11,-257.04 
364.01,-253.14 367.07,-248 371.17,-241.13 369.09,-237.74 367.07,-230 
357.53,-193.34 332.92,-155.95 317.73,-135.28"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="320.5,-133.14 311.69,-127.26 
314.91,-137.36 320.5,-133.14"/>
+</g>
+<!-- 139803511371664&#45;&gt;139803507105968 -->
+<g id="edge61" class="edge">
+<title>139803511371664&#45;&gt;139803507105968</title>
+<path fill="none" stroke="#8b7765" d="M357.29,-259.95C363.24,-257.04 
368.98,-253.16 373.07,-248 383.81,-234.49 381.07,-227.26 381.07,-210 
381.07,-210 381.07,-210 381.07,-117 381.07,-94.05 376.22,-83.93 357.07,-71.27 
339.36,-59.56 208.82,-53.63 138.94,-51.27"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="138.79,-47.76 128.68,-50.93 
138.57,-54.76 138.79,-47.76"/>
+</g>
+<!-- 139803511371664&#45;&gt;139803749199472 -->
+<g id="edge62" class="edge">
+<title>139803511371664&#45;&gt;139803749199472</title>
+<path fill="none" stroke="#8b7765" d="M361.31,-260C367.6,-257.12 
373.63,-253.23 378.07,-248 389.31,-234.77 387.07,-227.36 387.07,-210 
387.07,-210 387.07,-210 387.07,-83 387.07,-63.17 355.29,-41.98 351.07,-40 
318.85,-24.88 231.22,-19.23 163.65,-17.15"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="163.51,-13.65 153.41,-16.86 
163.31,-20.64 163.51,-13.65"/>
+</g>
+<!-- 139803511371664&#45;&gt;139803511372192 -->
+<g id="edge58" class="edge">
+<title>139803511371664&#45;&gt;139803511372192</title>
+<path fill="none" stroke="#8b7765" d="M292.68,-259.95C279.12,-256.69 
263.78,-252.61 250.07,-248 228.51,-240.75 204.85,-230.54 187.36,-222.52"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="188.37,-219.14 177.83,-218.1 
185.42,-225.49 188.37,-219.14"/>
+</g>
+<!-- 139803511371840&#45;&gt;139803507105792 -->
+<g id="edge53" class="edge">
+<title>139803511371840&#45;&gt;139803507105792</title>
+<path fill="none" stroke="blue" d="M318.83,-229.95C340.68,-208.9 393.9,-150.9 
366.07,-109 363.11,-104.53 359.13,-100.89 354.64,-97.93"/>
+<polygon fill="blue" stroke="blue" points="355.99,-94.68 345.53,-93.02 
352.67,-100.85 355.99,-94.68"/>
+</g>
+<!-- 139803511371840&#45;&gt;139803511373600 -->
+<g id="edge54" class="edge">
+<title>139803511371840&#45;&gt;139803511373600</title>
+<path fill="none" stroke="blue" d="M309.73,-229.82C308.94,-210.88 
306.95,-163.64 305.85,-137.37"/>
+<polygon fill="blue" stroke="blue" points="309.34,-137.08 305.42,-127.24 
302.34,-137.37 309.34,-137.08"/>
+</g>
+<!-- 139803511371840&#45;&gt;139803507105968 -->
+<g id="edge55" class="edge">
+<title>139803511371840&#45;&gt;139803507105968</title>
+<path fill="none" stroke="blue" d="M303.98,-229.93C291.13,-212.36 
261.46,-168.85 250.07,-127 243.57,-103.09 264.68,-89.67 248.07,-71.27 
233.86,-55.52 178.77,-51.12 138.76,-50.05"/>
+<polygon fill="blue" stroke="blue" points="138.76,-46.55 128.69,-49.84 
138.62,-53.54 138.76,-46.55"/>
+</g>
+<!-- 139803511371840&#45;&gt;139803749199472 -->
+<g id="edge56" class="edge">
+<title>139803511371840&#45;&gt;139803749199472</title>
+<path fill="none" stroke="blue" d="M323.28,-229.82C328.19,-226.47 
333.64,-222.35 338.07,-218 372.69,-184 384.07,-167.52 384.07,-119 384.07,-119 
384.07,-119 384.07,-83 384.07,-37.45 253.45,-22.82 162.61,-18.15"/>
+<polygon fill="blue" stroke="blue" points="162.73,-14.65 152.57,-17.66 
162.39,-21.64 162.73,-14.65"/>
+</g>
+<!-- 139803511371840&#45;&gt;139803511372192 -->
+<g id="edge52" class="edge">
+<title>139803511371840&#45;&gt;139803511372192</title>
+<path fill="none" stroke="blue" d="M267.38,-229.98C250.7,-226.84 231.4,-223.22 
213.87,-219.92"/>
+<polygon fill="blue" stroke="blue" points="214.25,-216.43 203.78,-218.02 
212.96,-223.31 214.25,-216.43"/>
+</g>
+<!-- 139803507105792&#45;&gt;139803507105968 -->
+<g id="edge41" class="edge">
+<title>139803507105792&#45;&gt;139803507105968</title>
+<path fill="none" stroke="darkviolet" d="M275.6,-74.98C269.46,-73.64 
263.09,-72.34 257.07,-71.27 217.26,-64.18 171.55,-58.39 138.85,-54.65"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="139.05,-51.15 
128.72,-53.51 138.27,-58.11 139.05,-51.15"/>
+</g>
+<!-- 139803507105792&#45;&gt;139803749199472 -->
+<g id="edge42" class="edge">
+<title>139803507105792&#45;&gt;139803749199472</title>
+<path fill="none" stroke="darkviolet" d="M302.44,-74.74C293.83,-64.68 
277.81,-48.03 260.07,-40 241.6,-31.63 196.67,-25.67 155.95,-21.79"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="156.26,-18.3 
145.98,-20.87 155.62,-25.27 156.26,-18.3"/>
+</g>
+<!-- 139803511373600&#45;&gt;139803507105792 -->
+<g id="edge44" class="edge">
+<title>139803511373600&#45;&gt;139803507105792</title>
+<path fill="none" stroke="red" d="M306.08,-108.93C306.29,-107.3 306.51,-105.52 
306.74,-103.7"/>
+<polygon fill="red" stroke="red" points="310.26,-103.76 308.02,-93.41 
303.31,-102.9 310.26,-103.76"/>
+</g>
+<!-- 139803511373600&#45;&gt;139803507105968 -->
+<g id="edge43" class="edge">
+<title>139803511373600&#45;&gt;139803507105968</title>
+<path fill="none" stroke="red" d="M278.75,-108.8C272.33,-105.81 265.92,-101.86 
261.07,-96.73 252.73,-87.89 260.63,-78.78 251.07,-71.27 234.12,-57.95 
178.82,-52.97 138.87,-51.11"/>
+<polygon fill="red" stroke="red" points="138.96,-47.61 128.82,-50.69 
138.67,-54.6 138.96,-47.61"/>
+</g>
+<!-- 139803511373600&#45;&gt;139803749199472 -->
+<g id="edge45" class="edge">
+<title>139803511373600&#45;&gt;139803749199472</title>
+<path fill="none" stroke="red" d="M339.42,-108.93C345.21,-106.03 
350.49,-102.09 354.07,-96.73 360.36,-87.32 360.45,-80.62 354.07,-71.27 
332.39,-39.51 233.26,-25.92 159.75,-20.16"/>
+<polygon fill="red" stroke="red" points="159.79,-16.65 149.56,-19.39 
159.27,-23.63 159.79,-16.65"/>
+</g>
+<!-- 139803507105968&#45;&gt;139803749199472 -->
+<g id="edge40" class="edge">
+<title>139803507105968&#45;&gt;139803749199472</title>
+<path fill="none" stroke="dimgrey" d="M90.53,-39.93C89.95,-38.88 89.33,-37.78 
88.69,-36.65"/>
+<polygon fill="dimgrey" stroke="dimgrey" points="91.61,-34.7 83.66,-27.7 
85.51,-38.13 91.61,-34.7"/>
+</g>
+<!-- 139803511372192&#45;&gt;139803507105792 -->
+<g id="edge25" class="edge">
+<title>139803511372192&#45;&gt;139803507105792</title>
+<path fill="none" stroke="magenta" d="M217.07,-199.96C228.45,-196.93 
240.01,-192.75 250.07,-187 275.73,-172.34 270.09,-153.06 296.07,-139 
321.53,-125.23 341.59,-149.27 360.07,-127 365.18,-120.84 364.36,-115.75 
360.07,-109 357.26,-104.57 353.39,-100.94 349.03,-97.98"/>
+<polygon fill="magenta" stroke="magenta" points="350.62,-94.85 340.18,-93.05 
347.21,-100.97 350.62,-94.85"/>
+</g>
+<!-- 139803511372192&#45;&gt;139803511373600 -->
+<g id="edge26" class="edge">
+<title>139803511372192&#45;&gt;139803511373600</title>
+<path fill="none" stroke="magenta" d="M226.95,-199.91C234.08,-196.77 
240.69,-192.58 246.07,-187 261.2,-171.31 242.13,-155.75 256.07,-139 
258.25,-136.39 260.82,-134.11 263.63,-132.13"/>
+<polygon fill="magenta" stroke="magenta" points="265.63,-135.02 272.59,-127.03 
262.17,-128.94 265.63,-135.02"/>
+</g>
+<!-- 139803511372192&#45;&gt;139803507105968 -->
+<g id="edge27" class="edge">
+<title>139803511372192&#45;&gt;139803507105968</title>
+<path fill="none" stroke="magenta" d="M151.72,-199.93C136.45,-186.31 
106.06,-157.27 88.07,-127 75.13,-105.22 67.04,-94.94 76.07,-71.27 76.79,-69.4 
77.75,-67.59 78.87,-65.86"/>
+<polygon fill="magenta" stroke="magenta" points="81.61,-68.04 85.28,-58.1 
76.21,-63.58 81.61,-68.04"/>
+</g>
+<!-- 139803511372192&#45;&gt;139803749199472 -->
+<g id="edge28" class="edge">
+<title>139803511372192&#45;&gt;139803749199472</title>
+<path fill="none" stroke="magenta" d="M141.33,-199.88C134.25,-196.46 
126.44,-192.1 120.07,-187 92.97,-165.32 87.37,-157.1 70.07,-127 50.68,-93.26 
47.68,-76.89 60.07,-40 60.43,-38.94 60.85,-37.88 61.33,-36.83"/>
+<polygon fill="magenta" stroke="magenta" points="64.5,-38.33 66.57,-27.94 
58.47,-34.78 64.5,-38.33"/>
+</g>
+<!-- 139803511372368 -->
+<g id="node12" class="node">
+<title>139803511372368</title>
+<polygon fill="none" stroke="black" points="249.57,-187 160.57,-187 
160.57,-169 249.57,-169 249.57,-187"/>
+<text text-anchor="middle" x="205.07" y="-175.8" font-family="sans" 
font-size="9.00">mes&#45;boot@0.24.2</text>
+</g>
+<!-- 139803511372192&#45;&gt;139803511372368 -->
+<g id="edge23" class="edge">
+<title>139803511372192&#45;&gt;139803511372368</title>
+<path fill="none" stroke="magenta" d="M173.57,-199.77C176.84,-197.61 
180.47,-195.21 184.07,-192.85"/>
+<polygon fill="magenta" stroke="magenta" points="186.28,-195.58 192.7,-187.15 
182.43,-189.73 186.28,-195.58"/>
+</g>
+<!-- 139803511372544 -->
+<g id="node13" class="node">
+<title>139803511372544</title>
+<polygon fill="none" stroke="black" points="211.07,-157 113.07,-157 
113.07,-139 211.07,-139 211.07,-157"/>
+<text text-anchor="middle" x="162.07" y="-145.8" font-family="sans" 
font-size="9.00">stage0&#45;posix@1.4</text>
+</g>
+<!-- 139803511372192&#45;&gt;139803511372544 -->
+<g id="edge24" class="edge">
+<title>139803511372192&#45;&gt;139803511372544</title>
+<path fill="none" stroke="magenta" d="M161.21,-199.8C161.36,-191.43 
161.58,-178.17 161.76,-167.3"/>
+<polygon fill="magenta" stroke="magenta" points="165.27,-167.19 161.94,-157.13 
158.27,-167.07 165.27,-167.19"/>
+</g>
+<!-- 139803511372368&#45;&gt;139803507105792 -->
+<g id="edge30" class="edge">
+<title>139803511372368&#45;&gt;139803507105792</title>
+<path fill="none" stroke="darkviolet" d="M221.4,-168.86C226.14,-165.76 
230.89,-161.79 234.07,-157 246.13,-138.85 229.85,-125.51 244.07,-109 
248.2,-104.22 253.36,-100.38 258.97,-97.32"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="260.46,-100.48 
268.06,-93.1 257.51,-94.13 260.46,-100.48"/>
+</g>
+<!-- 139803511372368&#45;&gt;139803511373600 -->
+<g id="edge31" class="edge">
+<title>139803511372368&#45;&gt;139803511373600</title>
+<path fill="none" stroke="darkviolet" d="M222.43,-168.98C228.39,-165.75 
234.87,-161.68 240.07,-157 247.41,-150.4 245.26,-145.02 253.07,-139 
256.99,-135.99 261.41,-133.38 265.98,-131.14"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="267.67,-134.22 
275.46,-127.03 264.89,-127.79 267.67,-134.22"/>
+</g>
+<!-- 139803511372368&#45;&gt;139803507105968 -->
+<g id="edge32" class="edge">
+<title>139803511372368&#45;&gt;139803507105968</title>
+<path fill="none" stroke="darkviolet" d="M207.92,-168.69C212.6,-155.52 
222.67,-129.25 235.07,-109 238.75,-103 242.72,-103.36 245.07,-96.73 
248.87,-86.07 252.49,-79.82 245.07,-71.27 231.54,-55.68 178.21,-51.21 
138.97,-50.09"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="138.9,-46.59 
128.83,-49.86 138.75,-53.58 138.9,-46.59"/>
+</g>
+<!-- 139803511372368&#45;&gt;139803749199472 -->
+<g id="edge33" class="edge">
+<title>139803511372368&#45;&gt;139803749199472</title>
+<path fill="none" stroke="darkviolet" d="M210.22,-168.96C212.44,-165.36 
214.99,-161.03 217.07,-157 227.75,-136.31 225.94,-128.88 238.07,-109 
241.74,-102.99 245.72,-103.36 248.07,-96.73 251.87,-86.07 254.73,-80.42 
248.07,-71.27 227.44,-42.92 191.98,-28.81 158.67,-21.9"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="158.9,-18.38 
148.42,-19.98 157.61,-25.26 158.9,-18.38"/>
+</g>
+<!-- 139803511372368&#45;&gt;139803511372544 -->
+<g id="edge29" class="edge">
+<title>139803511372368&#45;&gt;139803511372544</title>
+<path fill="none" stroke="darkviolet" d="M192.41,-168.75C189.49,-166.85 
186.32,-164.79 183.16,-162.73"/>
+<polygon fill="darkviolet" stroke="darkviolet" points="184.79,-159.62 
174.5,-157.09 180.97,-165.48 184.79,-159.62"/>
+</g>
+<!-- 139803511372544&#45;&gt;139803507105792 -->
+<g id="edge35" class="edge">
+<title>139803511372544&#45;&gt;139803507105792</title>
+<path fill="none" stroke="#8b7765" d="M177.58,-138.92C193.35,-130.85 
218.59,-118.34 241.07,-109 251.87,-104.51 263.84,-100.11 274.7,-96.32"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="275.96,-99.58 284.28,-93.03 
273.68,-92.96 275.96,-99.58"/>
+</g>
+<!-- 139803511372544&#45;&gt;139803511373600 -->
+<g id="edge36" class="edge">
+<title>139803511372544&#45;&gt;139803511373600</title>
+<path fill="none" stroke="#8b7765" d="M203.05,-138.98C218.91,-135.87 
237.23,-132.28 253.94,-129.01"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="254.95,-132.38 264.09,-127.02 
253.6,-125.51 254.95,-132.38"/>
+</g>
+<!-- 139803511372544&#45;&gt;139803507105968 -->
+<g id="edge37" class="edge">
+<title>139803511372544&#45;&gt;139803507105968</title>
+<path fill="none" stroke="#8b7765" d="M135.56,-138.85C116.1,-131.31 
91.07,-118.01 79.07,-96.73 73.52,-86.87 75.49,-82 79.07,-71.27 79.57,-69.79 
80.21,-68.33 80.95,-66.92"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="84.05,-68.59 86.8,-58.36 
78.27,-64.64 84.05,-68.59"/>
+</g>
+<!-- 139803511372544&#45;&gt;139803749199472 -->
+<g id="edge38" class="edge">
+<title>139803511372544&#45;&gt;139803749199472</title>
+<path fill="none" stroke="#8b7765" d="M112.79,-140.34C103.83,-137.37 
95.11,-133.1 88.07,-127 57.78,-100.72 54.22,-78.88 64.07,-40 64.34,-38.94 
64.67,-37.88 65.04,-36.83"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="68.22,-38.27 69.22,-27.73 
61.86,-35.35 68.22,-38.27"/>
+</g>
+<!-- 139803511373072 -->
+<g id="node14" class="node">
+<title>139803511373072</title>
+<ellipse fill="none" stroke="black" cx="162.07" cy="-84" rx="86.03" 
ry="12.96"/>
+<text text-anchor="middle" x="162.07" y="-81.8" font-family="sans" 
font-size="9.00">bootstrap&#45;seeds@1.0.0</text>
+</g>
+<!-- 139803511372544&#45;&gt;139803511373072 -->
+<g id="edge34" class="edge">
+<title>139803511372544&#45;&gt;139803511373072</title>
+<path fill="none" stroke="#8b7765" d="M162.07,-138.89C162.07,-130.92 
162.07,-118.37 162.07,-107.39"/>
+<polygon fill="#8b7765" stroke="#8b7765" points="165.57,-107.16 162.07,-97.16 
158.57,-107.16 165.57,-107.16"/>
+</g>
+<!-- 139803511373072&#45;&gt;139803507105968 -->
+<g id="edge39" class="edge">
+<title>139803511373072&#45;&gt;139803507105968</title>
+<path fill="none" stroke="#00cdcd" d="M139.02,-71.64C133.06,-68.71 
126.6,-65.53 120.53,-62.54"/>
+<polygon fill="#00cdcd" stroke="#00cdcd" points="121.93,-59.33 111.41,-58.05 
118.84,-65.6 121.93,-59.33"/>
+</g>
+</g>
+</svg>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]