Compare commits
2296 Commits
Author | SHA1 | Date | |
---|---|---|---|
5226d2b1de | |||
57bc9c3ee7 | |||
d4b23a0cc9 | |||
d6c1cf2499 | |||
63db9d6933 | |||
3db644320e | |||
e29fffbdb8 | |||
f5e6259199 | |||
0c2f002774 | |||
9815dcc159 | |||
87a46ffc30 | |||
19215ddaa2 | |||
e35bd54d99 | |||
6672d640f5 | |||
b8b84a4c95 | |||
9677b602e7 | |||
771e1e3a71 | |||
c12ea7a112 | |||
6047796c24 | |||
11a0a9ac47 | |||
5fbe5aa22d | |||
8a879a52ef | |||
c7669d4afe | |||
1f81206210 | |||
5a2a34b035 | |||
2ef7579b6c | |||
fed7cfef58 | |||
8b2ad77699 | |||
abcabc18ac | |||
4e0a3862a6 | |||
2eaf47d563 | |||
31f7b3782e | |||
d6169f92c1 | |||
7df72d36c4 | |||
5318cdac8f | |||
00434d5e6e | |||
ebf644ddef | |||
5e4fe9c67b | |||
1b65f9189e | |||
57d91c9da0 | |||
a6e6ec63f1 | |||
b8b1e57df4 | |||
969afe54c2 | |||
5a8d4dcbd7 | |||
685ef72288 | |||
521fd755ac | |||
74fe6163c6 | |||
6e592dba17 | |||
625a9fd932 | |||
5d37a0d108 | |||
68cb6aa1af | |||
9d0cb47367 | |||
569d0ccb4d | |||
ffe17566f1 | |||
293ad196f3 | |||
729e1159aa | |||
f9d354f711 | |||
f9849b515b | |||
fdc0276ed1 | |||
08569c81e9 | |||
3ba89f8363 | |||
9161dbc08e | |||
a1b2fa295a | |||
4f33eaa9dd | |||
3718bab078 | |||
dfc48705a4 | |||
f59115b503 | |||
cac467118e | |||
d0718075a7 | |||
ad55cc79b3 | |||
5111cc10ca | |||
a1736606dc | |||
bae659b9c7 | |||
c480c2225d | |||
52771c472e | |||
5ce21827c8 | |||
a2c4a70fbf | |||
d6e5f78834 | |||
74eb408460 | |||
a4c6576ba4 | |||
1fcc391a8d | |||
2970f960a4 | |||
d06bea7fb2 | |||
45a57e8513 | |||
3622e513aa | |||
c4e1faa853 | |||
905428bee6 | |||
9596e7772c | |||
5294fe6292 | |||
571cf53827 | |||
35ae76532a | |||
57dce86d5e | |||
797cb01bb8 | |||
9eded7a227 | |||
a8d32103d1 | |||
49d4925856 | |||
f5fad5b43d | |||
4c40f9dbc9 | |||
17db734783 | |||
6ce9f97254 | |||
1688dd6b5c | |||
07ffcab857 | |||
de6cf6b7e3 | |||
32cf04c77d | |||
96df4c772f | |||
640c2f88bd | |||
82f78a5610 | |||
cf8f8afbc6 | |||
e6bc92f6c9 | |||
eaa3e87eb0 | |||
9b3a1a99e5 | |||
76a68c26c9 | |||
ef64f00cbb | |||
acbe89a159 | |||
0f66e5e49b | |||
686aa3a150 | |||
d8bc828839 | |||
094c391cd7 | |||
c8491724b4 | |||
d5beb8a9e4 | |||
702f7cc51d | |||
b8cd0a1bc0 | |||
7f87ac4b65 | |||
306fbd8bd8 | |||
3e0b272a20 | |||
6c89226ccf | |||
f040987c9f | |||
2a42ddbcbf | |||
8bb68c4e6a | |||
4485b978c1 | |||
68bad56e7d | |||
ef55c15537 | |||
ce8d37984d | |||
c8166aed97 | |||
0bd41f98ed | |||
d8ead57fbb | |||
d9e7a5fcbe | |||
c965a110f2 | |||
8a879faac7 | |||
a2a9f1e331 | |||
15d7568038 | |||
8cbc450192 | |||
79199711b8 | |||
2c1b8fdd39 | |||
d9024db68d | |||
96dd044f8e | |||
e66b29943b | |||
100b9dd12a | |||
3415db9739 | |||
186bf7ae32 | |||
97ca6858b7 | |||
ee6b11d36d | |||
f58fef60fb | |||
a76eb64bbb | |||
8590326b50 | |||
b0271394cd | |||
c39633f968 | |||
1fef74b00c | |||
9f6a2e51b2 | |||
b150da837a | |||
ba9aaee7cd | |||
3aa67969f9 | |||
d4f336db40 | |||
d184d3a732 | |||
42da1ce4e2 | |||
d2ed921bc6 | |||
d32a072190 | |||
95c137158f | |||
7151b92239 | |||
716caeb17c | |||
f8e4bdd23d | |||
55dfd03007 | |||
854fc8d552 | |||
f2badf2c5d | |||
ea656b1a3f | |||
5b7bd24f0a | |||
2d7c7b0982 | |||
b958bf9086 | |||
43144cfe8b | |||
11d2d2eccd | |||
e22f89853f | |||
7ccc029f77 | |||
0eb78e461d | |||
3615209ce7 | |||
6bfe0fca1f | |||
bfa2535ea1 | |||
6ec918fabb | |||
cbf7c0080b | |||
a6196901de | |||
c09469fa3a | |||
3acd84d9c0 | |||
c902fd0303 | |||
955aaef2e6 | |||
e0a2bb9d86 | |||
3bc8d78801 | |||
b66c03667c | |||
6e04a646ba | |||
086e5da8d0 | |||
c1b06817a2 | |||
c3926e6af0 | |||
70322d1ff8 | |||
7c32640a9b | |||
5ad09afc15 | |||
5d8c1a303e | |||
24b254459b | |||
30089841f6 | |||
0bee05b849 | |||
afd9ae9999 | |||
5ab70c4e97 | |||
cab2232aba | |||
946e937549 | |||
0ca943f49b | |||
b2db0b97fc | |||
d565ec7968 | |||
36e3ccfc68 | |||
892ca196f1 | |||
59413b3124 | |||
e1643c91c4 | |||
3ce6248f8c | |||
006c39380a | |||
22f2247f46 | |||
852a2146ab | |||
99b42f210c | |||
ae3c9033c1 | |||
03f7f0d18c | |||
79d7090867 | |||
e7f63cd336 | |||
f108f483b7 | |||
d6cbb02c92 | |||
42af8b199f | |||
dbbd9663b2 | |||
f4846b6fe4 | |||
a28a34f61c | |||
96d47c51a1 | |||
f27c11ccd8 | |||
43e2301e2c | |||
7b05b3dbb3 | |||
c96b8c8d68 | |||
4fc767b3f6 | |||
cc96848b01 | |||
6009801c5f | |||
f116cdeed9 | |||
5f38fa379c | |||
e2fb9ac829 | |||
f83254d760 | |||
ee5cc733a1 | |||
18a17cfbbf | |||
a3a830e1ab | |||
4b1e9ada18 | |||
9026339d35 | |||
0be13a6295 | |||
fcc2874591 | |||
9246bee12b | |||
30a08f4282 | |||
e5c5f34f9a | |||
361eab1bf7 | |||
2fd2140f64 | |||
86faa3f995 | |||
81acd94153 | |||
48987bed67 | |||
4405e8a15b | |||
24cb4798bc | |||
986e9e268e | |||
71bf8c5f85 | |||
5a629ff387 | |||
148a58865e | |||
2523fa73cf | |||
6d76c34291 | |||
3faeb7fa79 | |||
bb00904fc8 | |||
73e3fc7c4f | |||
5903339c17 | |||
2688ae614c | |||
5670cafda4 | |||
4bc8fd3267 | |||
bb2fa9957a | |||
c6b108ef4f | |||
bb158a9b48 | |||
c2fdbde68f | |||
7e82450d7b | |||
188dbdb068 | |||
25866f3652 | |||
c7e2057d2d | |||
d84f367317 | |||
95d6586dd7 | |||
e8e13fdeeb | |||
816b2d7ff8 | |||
91cfa0aac9 | |||
4be646c695 | |||
a23c6177d5 | |||
cc6e1ea200 | |||
596d30661a | |||
b971eeca4b | |||
cfab36cb1d | |||
5835b3b8eb | |||
62eea636b0 | |||
b14e61ff79 | |||
59adc25c23 | |||
86ead6a65c | |||
fbfbafa3d4 | |||
1ddf90ed08 | |||
0fbd508c5f | |||
24a7b0ce74 | |||
68eafb3f30 | |||
2649f6bdd6 | |||
9807f47d4e | |||
63425bed10 | |||
02058ea699 | |||
91be35731c | |||
d1daeb44e6 | |||
efdfc5c327 | |||
9c00ad9ff2 | |||
151adab739 | |||
162b1bdef7 | |||
da425cc225 | |||
346213da4c | |||
8babecd890 | |||
2855c55ac1 | |||
bb9649e18d | |||
2f7d0e7884 | |||
dfc4d7cb50 | |||
b800642fa4 | |||
5b6c590057 | |||
66a0f54097 | |||
f8e64aad5b | |||
cd5ec8cd35 | |||
75fd13de5d | |||
807af8670e | |||
5bd05fba09 | |||
f7b6e777bf | |||
68353b7e57 | |||
8e81bc1b49 | |||
80a89b5e6d | |||
b64b54f48f | |||
20a52f153b | |||
d89271528e | |||
ccac35fc01 | |||
23e232b496 | |||
ddcf906a88 | |||
09e8124017 | |||
67d1e2903c | |||
a9c4cd6cbe | |||
180bc1784e | |||
f984feda42 | |||
56fc15f44d | |||
e0d9f7d1d4 | |||
87ba66b6d0 | |||
e420800aeb | |||
a684984f8b | |||
079682fbdc | |||
2491719f36 | |||
65de227520 | |||
29f3b198cf | |||
0ace79939b | |||
b3a75a60a4 | |||
5e8668799c | |||
8fa6935c9d | |||
a1fe6265fd | |||
67f636545a | |||
ec50c20400 | |||
18f146ace5 | |||
a91bf296d7 | |||
bb8985d76c | |||
7ff2a44a63 | |||
b5074d8577 | |||
5c1abaf43c | |||
dc3988eff8 | |||
24102a7435 | |||
9614d17024 | |||
8e3be6413e | |||
09e648f957 | |||
0c2bf022fa | |||
1c5d2a85cf | |||
8993b15248 | |||
8f91b5aab3 | |||
46391397b8 | |||
85c9a231c1 | |||
c312d4fba0 | |||
7203036e3e | |||
b9d8e3e55a | |||
08973f9f05 | |||
c6931dcb07 | |||
cea13e964c | |||
d207a34736 | |||
fba1af6ea9 | |||
b825d04597 | |||
3133ee2401 | |||
4d52f47f87 | |||
f54cfcdb8f | |||
57983980a7 | |||
33f4aaf3fd | |||
c138d692b1 | |||
fb12136975 | |||
efe260f12e | |||
b9b535c30f | |||
d085c8626f | |||
5e3697807c | |||
5416c114cf | |||
a0127e63c6 | |||
8b2327ed34 | |||
3938142535 | |||
66f76c8067 | |||
568475e2db | |||
9ea398416e | |||
50a17fc00b | |||
f9a9b7f610 | |||
a57f6b70da | |||
bae83ba2b6 | |||
385b4ce959 | |||
7b6e3a23be | |||
1cc8956f74 | |||
e6c8bfd008 | |||
2d67962c2f | |||
2e30926ac3 | |||
d2c66c40c6 | |||
a4d48df30a | |||
c52830980a | |||
e8e5ddc55d | |||
111942a47d | |||
bc88180058 | |||
3a616de47b | |||
9d65e6f183 | |||
328a6a866e | |||
5264fded00 | |||
83d5115a02 | |||
0559212df7 | |||
f131255066 | |||
59f3dc3b6b | |||
6454bfe754 | |||
7bb224f54a | |||
fa12a5f70b | |||
d2d78a073f | |||
6d403f2d85 | |||
8032141311 | |||
38491c8c4b | |||
627664b785 | |||
dfa1c7493c | |||
801337a422 | |||
4ec95043d7 | |||
b4dc1a7263 | |||
ef3aa2731c | |||
e738019c48 | |||
a5ef78f709 | |||
4156cea704 | |||
a587d05098 | |||
489dc657c6 | |||
029a2837e4 | |||
618ecfd1c6 | |||
83174b919c | |||
d952b38f93 | |||
1e2ab89b47 | |||
34a9619806 | |||
9ee65009cd | |||
85ccba366a | |||
579a02529d | |||
b04c8c1c1a | |||
243fa6cf63 | |||
30c0a7d069 | |||
71b4e765c8 | |||
73dd5aa2d1 | |||
96e209db49 | |||
0c14ca58c7 | |||
f3c0aa154a | |||
6efaaa9d7a | |||
08238e8307 | |||
e1b35f9847 | |||
e174af7838 | |||
be74801236 | |||
68acfd36d0 | |||
c9cea2152b | |||
e966c96644 | |||
73c31d873e | |||
a2a9d54985 | |||
ea2b26e5f5 | |||
d68e2c4d06 | |||
0cfa3d3de7 | |||
0d1f463f7f | |||
ff34bfebde | |||
e103789994 | |||
8a37b1e742 | |||
0cf4eb2ee4 | |||
5496f85dbc | |||
71ff269780 | |||
3879109e4c | |||
f901d71202 | |||
1738632822 | |||
bbd5dde66d | |||
43c0103e4c | |||
6eeca9c6f1 | |||
28d3af6f35 | |||
7f3072d53a | |||
90461245f9 | |||
1c91c1e880 | |||
53c7be32b6 | |||
397ea05aa7 | |||
dadcb632d8 | |||
2de2fbd5e3 | |||
14eca5aea6 | |||
27f38a3770 | |||
7a7abe692e | |||
f46a2cec3c | |||
8e5e48dd92 | |||
a2543e5a8d | |||
e9bdee3dc7 | |||
88033bccbb | |||
b4119c454a | |||
d398898c38 | |||
39fc677781 | |||
dc52b17c4d | |||
ddefc96433 | |||
955d0ab76f | |||
f1172617cc | |||
6ce115ec95 | |||
03d29a8311 | |||
35cc74ef25 | |||
35d6196384 | |||
01fe7c90a5 | |||
26b8747014 | |||
bedb05bdeb | |||
6829b8a6fb | |||
e462a7d1d5 | |||
4c515d0ef1 | |||
7d650eff8d | |||
0b2d4f32fa | |||
4f25013954 | |||
5c7735c40f | |||
e6438098e1 | |||
45b2c138e5 | |||
75d68edfe7 | |||
f80a5b8c34 | |||
1b1980ad49 | |||
3b9b9b1500 | |||
18feba2431 | |||
929a81e636 | |||
00809a67c0 | |||
d1b18a5060 | |||
3fb70b8d47 | |||
b38bf90de7 | |||
8319fa05d0 | |||
564c14a2c6 | |||
6996f45d54 | |||
b1c2c6009e | |||
934f69b660 | |||
84e911361a | |||
364583ea5c | |||
951e1f8b48 | |||
9232057e95 | |||
6c79f56c2c | |||
48eafcc74f | |||
dec9272813 | |||
eb3093d43e | |||
09abbd93b1 | |||
91920cc390 | |||
cc1cc7be94 | |||
2636418659 | |||
31e9074ae5 | |||
e2c316d2d0 | |||
74ee88d9bc | |||
f52c813fc2 | |||
badeb4d31a | |||
e59af8269e | |||
785c2574cd | |||
1a77f7ce3b | |||
6e7dccbbfb | |||
32bfced6a4 | |||
985f5c7351 | |||
621c67a8cb | |||
f2fd53e773 | |||
0fc3c7eee2 | |||
e81ba8e79f | |||
35461df92d | |||
a19ffb353d | |||
35ed432d1a | |||
8c29700402 | |||
171c0d5421 | |||
c01bc4afbd | |||
c404008743 | |||
193c9a08e0 | |||
5468be2ef9 | |||
6f58bdfcb1 | |||
9cf9de6044 | |||
a48dcb1421 | |||
51dad397ed | |||
27c0d30a07 | |||
6c33c3a5ba | |||
e6198debd6 | |||
298ba34c3c | |||
52b5edcb8f | |||
c73e8d9a82 | |||
842eaf90df | |||
24846b7b61 | |||
326a4282bb | |||
854c62e208 | |||
1759968c1e | |||
9e52d11ad0 | |||
d865f1f0c5 | |||
2747c9db23 | |||
bfc67e8680 | |||
d3068c3918 | |||
a931ad40c8 | |||
b4ed88e0f7 | |||
b7b71b31d3 | |||
83c1831a01 | |||
b85996494b | |||
26d31b68d7 | |||
8740bb42c0 | |||
ccb4e32ee0 | |||
2d351d3952 | |||
7ae5ff838b | |||
605b477e06 | |||
7e6e7e8406 | |||
e267dfacdd | |||
f4c5da3c72 | |||
a258e1e0b3 | |||
1fd84cb52b | |||
8dd24bc7d9 | |||
b7af5f08d6 | |||
781dfd9dc4 | |||
f6b48b0a67 | |||
ee099b0880 | |||
51ac05b3cf | |||
9267931ef6 | |||
60141e0c2c | |||
609d6cdf61 | |||
a3ccbe02d0 | |||
996c8cf2eb | |||
528d0b6af8 | |||
33052c1dd2 | |||
c1b401a04a | |||
78d5c1de9a | |||
2ee05f1234 | |||
20e800230f | |||
37a29b979f | |||
1afc527919 | |||
d89174ee82 | |||
f6255c2f9e | |||
ae41c88eb2 | |||
41067de5e4 | |||
dfca2b510b | |||
8bc9d8988f | |||
f7279804b4 | |||
47e1ea107b | |||
799d6aeb19 | |||
f8ccd90eeb | |||
169b772398 | |||
d2e28b0f7e | |||
88bb55ffd2 | |||
5508ac6272 | |||
2be03ca631 | |||
9803f167bd | |||
6a161c740d | |||
5d99853502 | |||
c2ebf466fd | |||
3313b2ff58 | |||
e210e76bd5 | |||
b75438ff32 | |||
82fea9ce73 | |||
79e32c92c1 | |||
322fcea6e5 | |||
5650231df3 | |||
78b2e4df9f | |||
bf9c815b9e | |||
798065fc71 | |||
578aa439be | |||
364781366a | |||
fa64a0b367 | |||
ba46bc4624 | |||
c6e4641781 | |||
9cde67086f | |||
f8b36f4658 | |||
753bd77b41 | |||
a9276700ea | |||
1960ea8ed7 | |||
1b775044f7 | |||
570b98c7bc | |||
81fb9e6a59 | |||
c2761a1259 | |||
0f7bf28617 | |||
60e8cf5a47 | |||
10cf728e11 | |||
eca56eb87d | |||
54d0168746 | |||
e58e48e919 | |||
1f345ce2d9 | |||
ed85aa43a4 | |||
33e34cbba9 | |||
4b0250192a | |||
dd66d16fdb | |||
de82e60c64 | |||
72d227ae91 | |||
4713cb8675 | |||
fdaee4ab17 | |||
32312f3c16 | |||
95d15dc720 | |||
2db83e1a21 | |||
cfbfcb5734 | |||
c28633a949 | |||
7cf90766a3 | |||
f2ee01ace3 | |||
9fbbb17c3b | |||
5e31565574 | |||
723f9a9b81 | |||
baf4e767e1 | |||
c5e5342325 | |||
6123d2f9e8 | |||
788296047a | |||
9dceb8ac74 | |||
ac2374e9a1 | |||
667f9e0d79 | |||
57916f8be6 | |||
e12c577b16 | |||
ba7efbb136 | |||
79987e788e | |||
4a071b06bd | |||
17f169f446 | |||
6662986169 | |||
1c86160e16 | |||
c34cc4918f | |||
4870a2cbac | |||
da7d94d0f0 | |||
cdef065cca | |||
e6676b4d4d | |||
896351e0e8 | |||
fb39bd45d7 | |||
5ef012b2c1 | |||
9c9754fa0f | |||
2e921437cd | |||
5617162cb6 | |||
0c3ff6b75c | |||
7f53737000 | |||
23ea8ae56b | |||
b5f7a4bff9 | |||
18653b825b | |||
aa3694cca8 | |||
844d231d74 | |||
d759a447be | |||
ffae4662bc | |||
a05d772aa9 | |||
cf3bbc09b6 | |||
d25576f8ef | |||
4b42fa2d75 | |||
c1c7e0ff08 | |||
1d503faa2c | |||
18c0f76f89 | |||
4d458a5e00 | |||
92ea11fca1 | |||
cf2bcee607 | |||
db7a3ac826 | |||
f792171ae9 | |||
81550e609b | |||
c28d0d7c34 | |||
6cb0790796 | |||
c2961617bd | |||
08e59b4a3c | |||
7ac4ce637f | |||
586e0a67ef | |||
5aab2866e1 | |||
a20f12865a | |||
0bf1a24bf5 | |||
f9f5bc2eb5 | |||
9fe8c98047 | |||
13fc518268 | |||
c06876eb3d | |||
f331f1d1e9 | |||
054deb809b | |||
865ddfc63f | |||
315940b6a9 | |||
211cae5811 | |||
2c6599c73b | |||
58139ce5ae | |||
8e888059d8 | |||
8d0236e3f1 | |||
774e9df2e5 | |||
faae122375 | |||
a6363e56b6 | |||
214c041bf7 | |||
ae7700296d | |||
f09183765c | |||
2f92b92a8a | |||
fee97236bf | |||
520f7c3e18 | |||
97752b4937 | |||
2c8c2029d8 | |||
4fbe36d9c6 | |||
4f4618441c | |||
e5a7d08966 | |||
11fc684f3c | |||
d50aef8404 | |||
5637f88aff | |||
f14bc0bb59 | |||
c50d2a6311 | |||
284273a73f | |||
4c5d0fc51f | |||
75a92d58cb | |||
db18611c86 | |||
bf199a2ebc | |||
db05864a69 | |||
f97d33e3a7 | |||
16e3ba86d5 | |||
cc05019bbb | |||
f57e48a209 | |||
7c964cf79f | |||
c9e58743e7 | |||
a09cf1470a | |||
57dc46fcfe | |||
06b445ac07 | |||
b4da83a3ab | |||
a964570b1a | |||
50bbe34b66 | |||
c10b2e6cc0 | |||
c4ed80d544 | |||
67d07254c2 | |||
74a648accb | |||
35365974bf | |||
355a40800d | |||
701d90a41d | |||
56f6ee84f1 | |||
e2a5ec9cd2 | |||
aea0326b82 | |||
93ad637c5c | |||
6be5e21aaf | |||
43795193c4 | |||
62429585ba | |||
e987d0094f | |||
093b5b5267 | |||
678a5aff83 | |||
03dc4a20a1 | |||
de3765ab70 | |||
5f079137e5 | |||
94f0c081a6 | |||
229836511d | |||
f2f041bb7c | |||
3562774f8b | |||
374b776a3e | |||
5763d63737 | |||
9d805dfc59 | |||
e6390b754f | |||
7babfd00c1 | |||
571dc4e387 | |||
3ed34b571c | |||
d7e4c8e3cf | |||
57e90948a8 | |||
26a20a7e62 | |||
b6a8268da3 | |||
61d7467ba8 | |||
7fa809c16d | |||
84f74807d4 | |||
4f59077318 | |||
3a9c03cc89 | |||
f055d2f0cc | |||
72fb52ec60 | |||
62c22c6cb1 | |||
dbd337c616 | |||
eeda7338cc | |||
261ea00efb | |||
02647c25a9 | |||
433b0808e4 | |||
529b163bd0 | |||
9c9991db1d | |||
aacead62c0 | |||
ae5a6a06bb | |||
60320e6b6e | |||
169ece8226 | |||
5020a4aa6b | |||
4c49566a89 | |||
ab60c578b9 | |||
050021cf77 | |||
8240d1fe0a | |||
fd6e7020eb | |||
261b869e27 | |||
d6d5b4429c | |||
67d7375ab9 | |||
020d34187c | |||
5486e4c364 | |||
33e2af341a | |||
cca08c3923 | |||
bb9f07183b | |||
22e807c212 | |||
a60a3efc1a | |||
558a362c46 | |||
19ae556857 | |||
5dd3a07a23 | |||
58a6c9a5f0 | |||
7053978861 | |||
3d44cffcda | |||
4b1de02bbb | |||
078a3aeccd | |||
abaccd6882 | |||
3fe54206aa | |||
debee350f8 | |||
890be36fd3 | |||
c9be9acd14 | |||
8eab673b1c | |||
e5806d07a6 | |||
11e6197a83 | |||
accd49f2e4 | |||
54cf9aaa1e | |||
8bbc8343ff | |||
a4e72ac037 | |||
1d0be265d9 | |||
d379786c90 | |||
ca9d4e34df | |||
6657312f44 | |||
2636a9c9f1 | |||
05ada97d00 | |||
4c54245969 | |||
5157bdd8ce | |||
8fa28f965c | |||
51b3451e20 | |||
fee5c6c057 | |||
9917ece826 | |||
8d94972d88 | |||
5cbd1190b2 | |||
1a71804ef2 | |||
1650519962 | |||
355564e486 | |||
1e3543e953 | |||
e83f6332bf | |||
0dbf7995b5 | |||
0d16db2d1b | |||
10565277d6 | |||
e0858cfe06 | |||
48d754220b | |||
958cbe688b | |||
783e8672e7 | |||
d93b552e8c | |||
365fe70f77 | |||
6c4e656795 | |||
86213d38fe | |||
b757294864 | |||
8b99e6dfbe | |||
0d4a2c5eb0 | |||
64f23ab26a | |||
31a276b628 | |||
742562fc2e | |||
ce65604154 | |||
75c0a268e0 | |||
badcb8b0e3 | |||
c48c9be913 | |||
92295dea4f | |||
76223f5ae7 | |||
ea015ccbe8 | |||
2f50d0e145 | |||
268beb3489 | |||
20d13f51a9 | |||
ffdf36c65b | |||
ff608992ee | |||
7e31a67d81 | |||
c0ec2ca27a | |||
a2595b44c6 | |||
180f415736 | |||
6541d9fbb0 | |||
de4f564780 | |||
14cb6353c0 | |||
9e680112e7 | |||
c90595cba1 | |||
de1636c792 | |||
e26f68fe62 | |||
39ba9cb489 | |||
08d4570ce5 | |||
084706c5ea | |||
d63518a835 | |||
b31d334ef4 | |||
5c4c562a2d | |||
f10438d530 | |||
7459eb15c3 | |||
c44e7ce184 | |||
bd19fe5909 | |||
82615c703b | |||
bc2141fbe0 | |||
f5964b4f3c | |||
d5ba90d375 | |||
167adff22c | |||
5f54573613 | |||
2b43b117dc | |||
1aec9e38fa | |||
c1880e3f3e | |||
c490a50c91 | |||
ee791e2e3e | |||
140d4ccf77 | |||
ceacc42126 | |||
a6479eb6e9 | |||
84c8a5bbec | |||
e1f4e8a84a | |||
8135279335 | |||
5dceeec1ca | |||
8f5a1535af | |||
92a5979558 | |||
8b64de0a3c | |||
9c30e98df6 | |||
c1d788880d | |||
385086359c | |||
176c7d8b13 | |||
a85604b2ba | |||
bf1ecc2441 | |||
92d2452f33 | |||
1853771930 | |||
772ee4b29d | |||
c62a4a1c13 | |||
008dcd71b9 | |||
ee4266bc59 | |||
294d531e0b | |||
e05f8faa74 | |||
fc4aa71193 | |||
0d7efe5176 | |||
b426dfb2c0 | |||
fd33b27af1 | |||
39f89e5a56 | |||
b881029de3 | |||
7682db4826 | |||
61fe1aa9cf | |||
468095ede2 | |||
9dc5da7dbd | |||
a18cd29411 | |||
b13c690f0c | |||
a7fd726872 | |||
6a082d2310 | |||
a317e9513f | |||
ee0c570d54 | |||
7607800d47 | |||
b35c022629 | |||
11cec8f24e | |||
df205f8752 | |||
affcb5ec43 | |||
bdda79343e | |||
1833db51a5 | |||
81c36699c4 | |||
d3052d094c | |||
4c4b7d39b8 | |||
e8d88f3237 | |||
cc8575dd96 | |||
f28782cb84 | |||
c58e7dd631 | |||
d9817c153a | |||
6057768fdc | |||
4a20c2aa1b | |||
e5f902369c | |||
1f9fde5f7b | |||
c3782082bc | |||
a452249bf3 | |||
3d3b03a123 | |||
719c03d33f | |||
609b18c2cd | |||
5279b83d34 | |||
05d2eec45c | |||
0cbc0dc79c | |||
9210f40c38 | |||
3237e897d7 | |||
f1110f2e85 | |||
5ffb6b874b | |||
c4a5442146 | |||
bd74e63702 | |||
f78b865cba | |||
7062fe4b47 | |||
b6da5a3f47 | |||
5fb2d7a98f | |||
ceaf4781b0 | |||
933e835838 | |||
94eb78d399 | |||
02ee2a601c | |||
b19d9a50d3 | |||
355640b5db | |||
dfa6238342 | |||
3b0d48e3b8 | |||
2b696ac8dc | |||
8362b408d9 | |||
62f6a78ccd | |||
f7e039e7ac | |||
61bd14c40a | |||
5dd85f1533 | |||
0d20bc5e14 | |||
a82754913f | |||
5840e3bbdf | |||
e8ab599bae | |||
85e5fbeb35 | |||
475f6fe666 | |||
9f354522a7 | |||
0c2a49391a | |||
e3a6c9234a | |||
6089c8030b | |||
643d0b0868 | |||
3cc5d8df7f | |||
34155fc36f | |||
f840eefcbf | |||
e1f3e33bfb | |||
36fcb4fbca | |||
22667d64d1 | |||
4786143524 | |||
f78baf80e4 | |||
33e7e23484 | |||
50214f059f | |||
57f778bcdb | |||
c3f07eb85a | |||
8adac30c05 | |||
5a5a6b3840 | |||
2803eb0d72 | |||
f41fb7d772 | |||
156399e8aa | |||
5745a54d4c | |||
3548d42a6c | |||
7dfb735db9 | |||
1609765740 | |||
2510f3d352 | |||
50ab34ad92 | |||
47535b9ff1 | |||
ffc748becb | |||
34ab25a88b | |||
8b9c3a2561 | |||
362a39a941 | |||
9f2119920c | |||
afb24d28ca | |||
0c62cf8980 | |||
f1d58f980b | |||
b1dfbf0ac4 | |||
12ad95eb5e | |||
7aaf5bc02c | |||
85f03b590d | |||
a29f0484dc | |||
8e6e72babd | |||
def71164f4 | |||
eda46d30bb | |||
d87910eb15 | |||
7257d2845d | |||
9744eb0ccd | |||
a273ddcd97 | |||
99a97b7008 | |||
3d098d2ed9 | |||
db768b4c3a | |||
4ac1213c9c | |||
a0f3208828 | |||
97db802be3 | |||
28f2c75137 | |||
81bb208a62 | |||
6979a17674 | |||
bd20c5e791 | |||
b4935ff4ed | |||
e1dd74f1bf | |||
e2ecacc141 | |||
6512aced21 | |||
615da845cd | |||
2c7f49c3e6 | |||
ba59741b60 | |||
52da207f83 | |||
ef8eff69e4 | |||
1abdeca4c1 | |||
6e82978931 | |||
4e827af392 | |||
f6b63a7dbc | |||
6bb22902cc | |||
881a6dc0f7 | |||
877e7a3893 | |||
bb80116605 | |||
0ffe7a9c8f | |||
9b8d59d2e9 | |||
f7bd7a41d2 | |||
3fc5009ef2 | |||
bde4ba04af | |||
f1ad69c84e | |||
97ea75a890 | |||
52f6da5cee | |||
aeaa0feb61 | |||
1207664bbb | |||
19d16e75c6 | |||
51cf559ce1 | |||
63d62c33c6 | |||
919c066e5a | |||
4125d01668 | |||
087c43b9ef | |||
c18ea3ccc9 | |||
564b590c89 | |||
d36ecb5c91 | |||
e2d6f01ad3 | |||
5034331131 | |||
faafee6b42 | |||
80f618f011 | |||
84f763d079 | |||
0dc0594aaa | |||
d651cb7a25 | |||
f18aa4e423 | |||
ab4f370e15 | |||
d6f824abc0 | |||
3450b9a44d | |||
afaf95cf53 | |||
8c371dd2fb | |||
bb558acdf0 | |||
159e518671 | |||
4798e7fa73 | |||
f4534ef12d | |||
8e0f41a790 | |||
b1203da82c | |||
e366fb6328 | |||
32de5e6e7a | |||
93ae98812b | |||
2c2de12e88 | |||
bd193535c9 | |||
d4d1e5e15b | |||
f7a670596f | |||
a8b82a0b68 | |||
bb25a06baa | |||
8b7cca986a | |||
626e16a177 | |||
814af378a7 | |||
a252acf539 | |||
01eb7600d9 | |||
52c2191545 | |||
25403e61ed | |||
f402b477b2 | |||
8df8f84701 | |||
ccee6241a6 | |||
4d13d3871d | |||
bb0c9d6145 | |||
8d105042ea | |||
84304cb0fc | |||
89fe297416 | |||
d853b20d7f | |||
b28407d98a | |||
4fa795b026 | |||
c298474e6f | |||
d925902b3f | |||
99eeb63f71 | |||
ff95f6dcfa | |||
8258532791 | |||
e73cbdda61 | |||
94f1132fb6 | |||
4ee212ae4c | |||
d5fb493aa4 | |||
88ea950652 | |||
e4519d6447 | |||
471bc73a23 | |||
75a2b74751 | |||
4e69408f54 | |||
38602d60b3 | |||
1fe1550a30 | |||
827f2b3a5c | |||
a948c9b7f9 | |||
1363841f32 | |||
4688f9821f | |||
0c90c889cd | |||
9f6c9c428b | |||
fd443d85c4 | |||
b4f0f4abcc | |||
d22848f9b1 | |||
79416381dc | |||
d791c70d90 | |||
802537564b | |||
1d0608200c | |||
cd14a940d8 | |||
58d4e32c97 | |||
1b6a200d6f | |||
08f6a2ea3e | |||
97d57d168b | |||
2b219228ce | |||
07d11be6ab | |||
7981431f09 | |||
a43922ccbf | |||
687818aad6 | |||
b7a5136136 | |||
0fde19239b | |||
771d1a78fd | |||
a8eb0409b7 | |||
b6151b5200 | |||
c68ebbb0a6 | |||
1b84092b94 | |||
b1d43ace14 | |||
6085109171 | |||
cd89f280b7 | |||
54f4d13350 | |||
799d3b1575 | |||
b3b782988c | |||
5e128f8cc2 | |||
c8c0815144 | |||
d59aae4849 | |||
342733be54 | |||
2da7601084 | |||
958c345f0c | |||
fe83c66686 | |||
5884469d11 | |||
9ee5f36068 | |||
c02373493b | |||
4090600717 | |||
8a4179da67 | |||
ed093f86f9 | |||
07a049aa59 | |||
7b77fbd525 | |||
e1e295e1b6 | |||
5b4ee36cfd | |||
784943ecab | |||
4f86c0b74a | |||
5b4f24eabd | |||
a2986d3b6b | |||
032d523737 | |||
238aa2133d | |||
eaf1b91148 | |||
4ae48b56f3 | |||
8c15214923 | |||
7a603d72bf | |||
5b51bb27b6 | |||
8231d2b672 | |||
6597c71e23 | |||
e30ca01999 | |||
12bb05c320 | |||
8aa7a851ca | |||
2a17e90b7b | |||
f154a53e5e | |||
7911895b67 | |||
d6aaab0b2c | |||
be9fa22db7 | |||
b72c5689c9 | |||
9dcf3347f5 | |||
72e9492ca6 | |||
572e942413 | |||
3ae9357a36 | |||
1dbb5c8647 | |||
06d8c06119 | |||
cc0e455a51 | |||
a01520e694 | |||
c524d62ce0 | |||
dd4640e1ed | |||
42c7d57fc0 | |||
efd09ecd37 | |||
14f6d5c82b | |||
c7710fdd24 | |||
b5aa03dd7c | |||
a81dd80d60 | |||
09ca92d416 | |||
56ed033233 | |||
e56efe237c | |||
3f0ff45de0 | |||
3709dc6558 | |||
6ec0318bae | |||
92e419f1c7 | |||
ccc0f2d956 | |||
80bb0158b7 | |||
f12592826f | |||
8d38777c1f | |||
832dfd4ab0 | |||
04d2db4dbb | |||
6f269e5a0e | |||
eb3991b9ba | |||
aee63f15c2 | |||
aced847735 | |||
e360e63b74 | |||
a6c4525998 | |||
77b196a226 | |||
b6b9c2cf56 | |||
59d900977d | |||
0f5acb86d3 | |||
911dee24c5 | |||
f03e066ec5 | |||
f7d3f55566 | |||
4298b1f595 | |||
870503ee36 | |||
4d14abbd04 | |||
5212b2716c | |||
97c0573c7d | |||
43cc9fcb1d | |||
47b5ba44e9 | |||
e95397e0a8 | |||
c7cdf8ba93 | |||
6ee734e1b4 | |||
3ab1b46ef7 | |||
22891b39d6 | |||
b6ce7ec782 | |||
a41c7451f1 | |||
6cb2040a1b | |||
937f9ad049 | |||
c2fc0f2418 | |||
9278201198 | |||
149a63100d | |||
d09afdbefe | |||
1d6bafbc77 | |||
01d2b4e952 | |||
05f3437601 | |||
f859243191 | |||
9ddc25283c | |||
388d4a8592 | |||
0b0b679120 | |||
3b752876ac | |||
9b8b7dbfd7 | |||
c209e14e40 | |||
6df1f6450f | |||
6d7cb23c61 | |||
bd7e269280 | |||
b05b42d74d | |||
af733a678a | |||
8a5045f05c | |||
4a336eb5ff | |||
b7e08052ae | |||
f6a4acfac3 | |||
68eff230f0 | |||
c78db6a94b | |||
294d9288d2 | |||
7dc5cc26a6 | |||
d7a2b790dc | |||
a7a10e12c7 | |||
8d243221f0 | |||
84368697af | |||
4a57cd3300 | |||
2214d2dbb5 | |||
50a991fdf9 | |||
4e093525c7 | |||
506b305959 | |||
e83efcfc80 | |||
4f1c881227 | |||
a642168369 | |||
8d296d0969 | |||
68b11c1c29 | |||
c209718a6f | |||
b8835312bb | |||
7796e87814 | |||
64c770275b | |||
855f7ff352 | |||
b59a99111c | |||
252257fe66 | |||
e2c9d87d91 | |||
9d34b80ed6 | |||
c63a38ae57 | |||
20da2604f8 | |||
33de2cad6d | |||
aef7bae60d | |||
54ac7ed1ea | |||
0180246680 | |||
dab7de7496 | |||
feaf29792f | |||
5f09aa36b3 | |||
d6c74f438a | |||
349ebec629 | |||
f4554be72c | |||
8537da19bb | |||
d1eff5d607 | |||
19e4f70244 | |||
a233a1c822 | |||
27bc0a22dd | |||
7ee8383e02 | |||
bab0f6be1e | |||
535df0026d | |||
3bd35dd7cc | |||
39d29fab82 | |||
fbfe1a59a6 | |||
77c79effc1 | |||
83540087c3 | |||
937816e67b | |||
c3a941086d | |||
1046c5e32c | |||
baac8d2590 | |||
610a02c518 | |||
444bd7a702 | |||
7afc61e0b9 | |||
d4d9bec2a9 | |||
d647a4ec57 | |||
536b4c1a25 | |||
547a7a345f | |||
26e380e53c | |||
8a12ed029c | |||
b41e8333b1 | |||
8f646e21d7 | |||
5608af0246 | |||
17b9ea3e3b | |||
88d4d1db7a | |||
cab4c88c71 | |||
4ec5a899f5 | |||
c2f74330ef | |||
2c8e0bcf87 | |||
4966ab528e | |||
5f81a67298 | |||
a0ccdccff1 | |||
735c7c9841 | |||
3a69459645 | |||
21cef2fe21 | |||
038c6ea0a7 | |||
81f4fd56c7 | |||
264a3d7dde | |||
43bf176fab | |||
baec17fdf4 | |||
186b514ebb | |||
2d42c1e33e | |||
9cef522eee | |||
a6302acfd5 | |||
ac72265c6b | |||
09da6b4b48 | |||
0d8f5379a0 | |||
02c7b89a8f | |||
90ae33c200 | |||
55c879ce2d | |||
1b5a332239 | |||
595017499e | |||
9b1471acae | |||
b766ac0899 | |||
e6b525a614 | |||
a07b17b9b5 | |||
9d2940d487 | |||
6969ece2dd | |||
48fc35884c | |||
0958905df8 | |||
c95cda51c9 | |||
3f54c0f1a6 | |||
4684faa5e8 | |||
111d0eb89b | |||
8b69998379 | |||
a21251dfea | |||
06cd7c1020 | |||
782846f295 | |||
19e131d710 | |||
9fd34cd985 | |||
adfb8ff2a1 | |||
83aa609540 | |||
1e1cb7c57c | |||
cdbd1b908a | |||
a12e7a2e33 | |||
25080f1a33 | |||
afa05acb32 | |||
d47caf2af8 | |||
a3a91ba222 | |||
751b54b60b | |||
488dd0e563 | |||
b58558ea4e | |||
6ad9dc18d8 | |||
027ebb6670 | |||
0ffd91df27 | |||
10d85f8366 | |||
7aad427511 | |||
bbd0455418 | |||
5174b3bc3f | |||
f88c72c41e | |||
9f678cc32a | |||
57036fbcc1 | |||
349e5001d6 | |||
94db9cd412 | |||
b505a0df22 | |||
acf096c5f7 | |||
e8583f5cfe | |||
5825b967d2 | |||
bf5bce50a4 | |||
77ea8b9b3e | |||
176cec6215 | |||
5ab4975c44 | |||
7e60ee39d9 | |||
3ea2933e2d | |||
fe87c05423 | |||
6b86f85916 | |||
04649de6a6 | |||
92d78451b1 | |||
0c87928132 | |||
db7e78bf99 | |||
adecd4cfdc | |||
40faaef9da | |||
9b54528c8e | |||
440d006ec1 | |||
6c49b10784 | |||
c858d1dbb3 | |||
741a0a8a4e | |||
16b6576839 | |||
6accf21229 | |||
d2b21ce8d0 | |||
b01990d480 | |||
d7fdfb7e21 | |||
19fe468dbc | |||
259a5130a8 | |||
0d27515d09 | |||
1c966aac25 | |||
d2b6c2e0ce | |||
7aecb87bce | |||
4a02914b30 | |||
7c12ecbe81 | |||
f093377805 | |||
5ac173d208 | |||
9f58318fc5 | |||
ebcdc06dc3 | |||
22315d88e7 | |||
0a36a78133 | |||
a25446f045 | |||
2860d2fe27 | |||
e4861f52e0 | |||
5698d48dc8 | |||
5b95685e12 | |||
4c90898f0b | |||
a191f3fd90 | |||
b2c776eabc | |||
2c8d6f87e6 | |||
08f6de0acd | |||
bd92f37553 | |||
2abbc89dcd | |||
8cad992170 | |||
41d0db078e | |||
8781aebe06 | |||
727c15ef8a | |||
e4926e4110 | |||
b50a3bae72 | |||
35ec7a5156 | |||
a383ea532f | |||
b1a678b2db | |||
e563a4dda3 | |||
dbe533385e | |||
f537482c86 | |||
aebd70ddce | |||
7d80cfb17a | |||
b8e7736af2 | |||
32b55e6703 | |||
0a949677f0 | |||
f777a1a74c | |||
d111223085 | |||
1ca7e9f67b | |||
bc8f435d45 | |||
5e221bf219 | |||
fc58b3e8c3 | |||
1033f52877 | |||
4771177f9d | |||
50c6b5d62d | |||
f9a2254688 | |||
49250f62aa | |||
22ef3c7c54 | |||
417e8d5064 | |||
1feb9bea21 | |||
563c42b829 | |||
841e5e326c | |||
281deae102 | |||
c5ba2e0883 | |||
eb4edd75e6 | |||
bb6bcd79c0 | |||
ef7022d638 | |||
2aac094f63 | |||
fc180f4cbf | |||
e26a0bf840 | |||
3557975c1f | |||
b4aebbd991 | |||
db13b52e6a | |||
f1f6537837 | |||
2ec5d2c7f5 | |||
42e5623e26 | |||
ab9f2adc69 | |||
f551b34725 | |||
55b8ff72d0 | |||
bf319ab06d | |||
12ef0c25b5 | |||
8620d0a3b2 | |||
933ae51fcc | |||
c1201e54fa | |||
3615445a12 | |||
091999a17e | |||
417066ad30 | |||
2abe051a1f | |||
65adce65fa | |||
0c8f187993 | |||
cbd2938035 | |||
0999225794 | |||
38b44f2496 | |||
c1953dca8f | |||
19ea5fe0c0 | |||
d7ed3b8024 | |||
a89589a1d5 | |||
41bda18046 | |||
0c832f4668 | |||
75b494d4a3 | |||
f0191a98ab | |||
76413cbfac | |||
0fa1af5d47 | |||
af1c70f032 | |||
278614fc7c | |||
baca35ef4d | |||
66552d7047 | |||
979df17328 | |||
6cec61dcfc | |||
a9b044f0ab | |||
fbea9d8621 | |||
44a572416d | |||
97c97db97e | |||
b8ae025f90 | |||
27221e28f6 | |||
9a52b01171 | |||
8cea650535 | |||
531679eeaf | |||
850f77ab3b | |||
4a10fd3272 | |||
9e2eb9e4f9 | |||
8120b57f17 | |||
f651c0922a | |||
8d2ec20201 | |||
dce1f80aac | |||
df1c473341 | |||
8a64e1ddc3 | |||
eb47538a82 | |||
861d6468ca | |||
d6737b8cc9 | |||
30592f2b12 | |||
1f950781c2 | |||
f20ba423ca | |||
c5e6ebb496 | |||
9e7f618cff | |||
74a06e4230 | |||
70f93cc126 | |||
3f8ff23125 | |||
29611fb61d | |||
407b1d3e6f | |||
206e62271b | |||
4e78354ab6 | |||
1561d9c8d4 | |||
0e1480b84e | |||
fd6047d1c5 | |||
b0467be393 | |||
1b0b095813 | |||
bd43724dfc | |||
11992946a4 | |||
0cc8a841ab | |||
23b6b85bf0 | |||
96b56fa6f7 | |||
405ca1bcb2 | |||
c6316bb24b | |||
b7f169e06e | |||
e4b466874c | |||
9911942dbd | |||
8acbb4ab2f | |||
a49f5378e2 | |||
f39e74f0d7 | |||
22b767308a | |||
36aa876833 | |||
06ba0b7279 | |||
a38e1a81ef | |||
da925142d1 | |||
5feeb257bb | |||
06c547094a | |||
a40c5cf185 | |||
deb83cdef6 | |||
20db335aed | |||
407db65336 | |||
9c5a3cd277 | |||
138a49e820 | |||
36c9e22e3d | |||
aa0f8538ed | |||
4177c56c51 | |||
425ac8d520 | |||
ada4d16c4c | |||
4069ef2e02 | |||
ace98bba08 | |||
e59b53dfa8 | |||
aacb38864c | |||
33d13a3aea | |||
1f0f947ed2 | |||
6854c64a09 | |||
4a32bc48d2 | |||
b430762a23 | |||
f8523db51d | |||
48b11d1841 | |||
3600a926df | |||
c228792967 | |||
7ea522e851 | |||
63503ad589 | |||
9800e09431 | |||
2e2b1881f5 | |||
61483c18ca | |||
a5279bb835 | |||
357554b209 | |||
41fbdc6e08 | |||
8bd1c57448 | |||
2562e48b9d | |||
46bb79df29 | |||
6bc0d2a0cb | |||
465cd45833 | |||
b4484b89c3 | |||
c029f069f0 | |||
fdb57bc5db | |||
e43a634944 | |||
2da7c7fbd3 | |||
5683282c94 | |||
44967abd1c | |||
8b41a5d725 | |||
07c183bb84 | |||
7fd879b417 | |||
dc5c6e7cf8 | |||
bd633d2b81 | |||
feeaad619a | |||
b44d8c394e | |||
0ff9c4cd8e | |||
9cafd1f85e | |||
7fe10ba060 | |||
cc48773b03 | |||
8fbf0e2d9f | |||
d86358eedc | |||
fe04fb4cd3 | |||
de3f7e9634 | |||
5e8fcdbe1d | |||
3ee7256c0c | |||
2a7a9fdf03 | |||
5bf87de136 | |||
97a136ea20 | |||
735dfab02e | |||
b5f65ce49c | |||
a283863694 | |||
25908feef9 | |||
b91ad6fd96 | |||
02abf422df | |||
3fe5f886d7 | |||
4c6a6d63bf | |||
589a9d3a72 | |||
bd884a56bf | |||
119467df59 | |||
ee68b9800e | |||
c6b4a3a706 | |||
b1ac8f933b | |||
9e3758983d | |||
34c0537e9b | |||
8628f33d0b | |||
ed05aeaef8 | |||
e1444a9b00 | |||
9514169bf6 | |||
fa8394f526 | |||
1cd8c1865e | |||
e3f895d7d4 | |||
8abf22f34b | |||
a016bc2736 | |||
470debef16 | |||
c147dc3028 | |||
bdd95b2286 | |||
efe676bc94 | |||
fc34687687 | |||
6042ccf496 | |||
f1197e1b1f | |||
8c1b9a0b67 | |||
0da9ac1a47 | |||
c1f316721a | |||
8e86014311 | |||
d807217be7 | |||
bc44516eb4 | |||
b78a13d42c | |||
0dcdc37fec | |||
dd1c3514a8 | |||
767efab941 | |||
288a3bdcd9 | |||
8019bff391 | |||
575a897ffc | |||
697228a484 | |||
ca907f37c3 | |||
439e7cc26a | |||
3217a1d70c | |||
6dbba86cc6 | |||
8cc863ea6c | |||
1d957b6b80 | |||
e56430c9fb | |||
e4d8ea11ac | |||
a4035a3c65 | |||
807c69d97c | |||
9259d342ac | |||
b4d4edb645 | |||
966b6999d1 | |||
73491e3ca1 | |||
d1d53c3fb6 | |||
a77e576cd9 | |||
9e14cde461 | |||
a2a7c86c0d | |||
38aeed02fc | |||
64d63966c7 | |||
38ae54b720 | |||
a18c0e34f4 | |||
be3a0b6b10 | |||
9f6496d38a | |||
1fa31c9410 | |||
2b5e757d57 | |||
0dbe5ee559 | |||
6926e89e86 | |||
ec0007217d | |||
91b23f8316 | |||
2fd8d57504 | |||
0595109f98 | |||
9f46b2a6ce | |||
a357d08524 | |||
177c9cc026 | |||
0c4cb76acf | |||
8676b5d40c | |||
efab896c9e | |||
97b9d57b62 | |||
487826a539 | |||
4acb764589 | |||
9de4c1dcd9 | |||
e8c4302d6d | |||
a9f73ea321 | |||
66c41b3e8c | |||
8435fbfa0b | |||
9a4c449135 | |||
ac6dbf8f04 | |||
b55927370b | |||
002fbc4d53 | |||
53deb7919c | |||
8e46c44f3e | |||
37c2fa1d8d | |||
fdaa939892 | |||
c9d63204eb | |||
cfab54511b | |||
492cc93850 | |||
fd9fd43e83 | |||
191483f4ee | |||
688f8a669a | |||
46eea85022 | |||
1c765124e7 | |||
194491ae96 | |||
2ae595294c | |||
ead947e710 | |||
82df267ec9 | |||
53275cc678 | |||
44835a91db | |||
ee42040e6b | |||
2b98a16ec6 | |||
aa4a7b0c73 | |||
8f50c3dd2e | |||
9c47ce30a7 | |||
3433b08b8c | |||
d26fd27bf9 | |||
5c98c1d306 | |||
51aacfe3ca | |||
82bd2df986 | |||
aa88c40a9e | |||
8ec5a47027 | |||
5bd3eb4557 | |||
e9cb4a12dc | |||
de5cad9211 | |||
e3365529de | |||
ce2ce76958 | |||
16f2fb5c09 | |||
d77c98530f | |||
fe40b75ac6 | |||
e7129757c9 | |||
3635a68129 | |||
70a16e91a5 | |||
41daf1ef0c | |||
ff77789718 | |||
a77775cb58 | |||
167e15a5ae | |||
dea663d509 | |||
9754e551cb | |||
40a4ac15f1 | |||
c56052ff16 | |||
482ef51502 | |||
e4ca3900ae | |||
3574469052 | |||
e15246746d | |||
ec5cca41bc | |||
bc1368ba3e | |||
c0a161afe8 | |||
d343c409e6 | |||
64e8a21d73 | |||
ce04d2bfc2 | |||
1c1d83bd56 | |||
028e111fbc | |||
9670788bf5 | |||
d2f9625878 | |||
182096dc1a | |||
2d284ba6db | |||
1de805e7cd | |||
d642125f68 | |||
b8aff218e2 | |||
045d4d5294 | |||
d67dd8ce1f | |||
4d6679906b | |||
4537f54532 | |||
39b40dfff8 | |||
c82f4a1b6d | |||
7a021dff05 | |||
348c2263ba | |||
b5324063f1 | |||
6ed071c4dd | |||
4404634b14 | |||
6a1de33138 | |||
c05c3e69ca | |||
534244b322 | |||
335dfdc4d5 | |||
a7ef409c2b | |||
14594217db | |||
c8a03c7b3d | |||
9fcd162412 | |||
441fed7a5b | |||
ff31ffbd54 | |||
0e26ee854b | |||
5340800cea | |||
13c2e50b38 | |||
dd39b2b056 | |||
65f89d6729 | |||
1eceb4831d | |||
50303c9ede | |||
ed6a438c51 | |||
2adb98a4a0 | |||
471465a5f4 | |||
942785b626 | |||
aa3c00231a | |||
d772a27936 | |||
0302f13b97 | |||
16b25d0874 | |||
c2dcbee6af | |||
1f71d05299 | |||
bfa1c025fd | |||
8611b40074 | |||
916844d399 | |||
4c9b7c9d2b | |||
9843c3a5cb | |||
f56955a17c | |||
9784bbf154 | |||
45642c4da1 | |||
8eac199e8b | |||
2e251ccc5c | |||
cf4bb70d80 | |||
57f8a15b96 | |||
cfe5afd34c | |||
94beb4b8c2 | |||
50207a30ef | |||
35e8f966e3 | |||
943cd0a24a | |||
0b892b2579 | |||
fb2eac20bb | |||
b37d2fde3d | |||
6b35e16676 | |||
6a9e0bc593 | |||
591fd72e0b | |||
2ed77b040a | |||
7ada8510c4 | |||
b8f6c17dee | |||
2f976ae460 | |||
36019cb1e3 | |||
99d2428041 | |||
c121498b5b | |||
eef2bdf690 | |||
190656967d | |||
90e73515ed | |||
1d7a758c97 | |||
e5b7aead12 | |||
578c2ad3ea | |||
de6838da78 | |||
604071c5d8 | |||
41a377013f | |||
52d453d06f | |||
58295b825d | |||
f6c7812fcc | |||
2f7561e4ee | |||
1cbd2372fc | |||
28f948aa7f | |||
c9ba9e4eb7 | |||
f877fb8c8f | |||
772ba41ede | |||
6374e69a69 | |||
ef0580bd3d | |||
1a77486f8e | |||
ead15d294e | |||
1acfcf3acf | |||
d15e248cdb | |||
f1e5edee14 | |||
7153abd483 | |||
90fb5d074d | |||
af82b0dce9 | |||
d4da2fbacd | |||
77efe95730 | |||
86e03a6d1b | |||
114e2989fa | |||
7024c73e9b | |||
6d418aa3f1 | |||
f079a78c5e | |||
6365c4c061 | |||
55cee5742f | |||
034eda4546 | |||
44ff25d044 | |||
a7e160e5c4 | |||
6283cc916d | |||
4b6aca6120 | |||
20b2be6e0b | |||
cbebc7a80c | |||
06eb2364f2 | |||
167890ca63 | |||
392a39dd54 | |||
7e1a7862db | |||
458ae3fdac | |||
431cc82032 | |||
18c6729d6c | |||
9476fe5ce3 | |||
788290ad82 | |||
6b5bcfaa58 | |||
4ed0cded9c | |||
035a364122 | |||
b114bc3674 | |||
bc74ee7117 | |||
b2ce5dc9f5 | |||
e920191de0 | |||
39e85a3e53 | |||
41156da4ca | |||
9271ba0039 | |||
b3e45fd6b7 | |||
7bfb60f82e | |||
359c50f1b3 | |||
fff1631a8b | |||
7d42ae30d9 | |||
87414de3e2 | |||
a0ffbf50a5 | |||
d40b66ff7b | |||
abd7f6b090 | |||
d8735df1de | |||
481853e1b1 | |||
778bcbce50 | |||
fd3f2cb910 | |||
915956b94b | |||
4576250342 | |||
2bef1b0433 | |||
628128b376 | |||
916017ca2c | |||
3204a00e73 | |||
1d327a5167 | |||
6e4f9cedf2 | |||
a79fbbafc9 | |||
1d54d29076 | |||
10b9a4806b | |||
0c1191c3ee | |||
18b386cd10 | |||
714b8c7fc8 | |||
216e9a61a0 | |||
0f498e6265 | |||
e8ad822111 | |||
65a82ebf50 | |||
727802684c | |||
e20a8329d3 | |||
88c2d0fad4 | |||
3bd921264a | |||
7501ed65e5 | |||
2eaa64c4e8 | |||
c9b86018c6 | |||
a4fb01b42b | |||
0d2574f8f0 | |||
796000e96f | |||
e2f00dc205 | |||
5e91f8f59d | |||
e2830f5b0e | |||
a2e3a92b01 | |||
23c696706b | |||
1393d26f63 | |||
1b68da7572 | |||
8542006259 | |||
426d06b89b | |||
06378d6db6 | |||
dccfe31e8c | |||
1dce5976cf | |||
340d01665c | |||
50f79e495e | |||
dd12db2f06 | |||
1afccb7351 | |||
bfc65e829e | |||
eb4515525d | |||
55f5f6a033 | |||
7ae421eaf6 | |||
e7da2c0931 | |||
133be2df51 | |||
06a93dcb43 | |||
ad7f04a245 | |||
0da6e1af14 | |||
576524f13b | |||
f567877d1d | |||
9881820444 | |||
ba8f49366d | |||
81fa69d347 | |||
abf2b300da | |||
a8254fd258 | |||
b15848de3b | |||
ab3c988146 | |||
575a0e318b | |||
a031b09190 | |||
df43e721e3 | |||
5f72650c7f | |||
5d0d467287 | |||
994515d0f2 | |||
1e949caa7f | |||
f2b727b534 | |||
f7680752e7 | |||
da4c37beec | |||
d486d2b8ce | |||
bba94c43b9 | |||
9cdffc7d64 | |||
5a86f2506d | |||
518227eac0 | |||
b8fd51e97d | |||
965c1e0000 | |||
a80176496d | |||
5719b8f251 | |||
1a2b131ceb | |||
349306ddf7 | |||
791ee411a5 | |||
f690c64375 | |||
427963f554 | |||
b0f2220ef6 | |||
908b48bf0e | |||
b49f8c0984 | |||
7609a007c6 | |||
674a49f8d7 | |||
d10bde656a | |||
401764ddb1 | |||
69eeb7cf08 | |||
55e3b7d380 | |||
d9e18a71ec | |||
2107e15bd3 | |||
4f3b22d04e | |||
2c78a93001 | |||
2621aeee82 | |||
8e400fc4bd | |||
29c2a63c8b | |||
736ada4e21 | |||
3df9b44d4c | |||
7225b89142 | |||
0cc0d3ab7a | |||
88d9618788 | |||
57038529e0 | |||
5c25eae631 | |||
b8b4d33f72 | |||
673a9417ef | |||
3fd9aada8b | |||
453fdb9e28 | |||
3f6a79b078 | |||
e9f80e5542 | |||
694d28acf8 | |||
88fdba5aca | |||
a19df7a36c | |||
9b50583641 | |||
71f9b44687 | |||
0139e5db21 | |||
586fb15c2c | |||
297328ff9a | |||
6b3384c205 | |||
3ef961fe37 | |||
a7b695c27a | |||
5bb75a5894 | |||
f3f416b7ba | |||
31b74bdf0b | |||
ed48d8323c | |||
f91627a230 | |||
f9c093022c | |||
7fe3c75c6b | |||
c8ed41167a | |||
5b2a82a951 | |||
441e76ebeb | |||
c2dfb9900e | |||
916458e132 | |||
ffb15578ce | |||
abcbbb925f | |||
059755fe59 | |||
ae12dc2c75 | |||
37b5c6afaa | |||
92ed7b36a2 | |||
379d2e6d95 | |||
7f75cc8906 | |||
1ab5098576 | |||
598f765960 | |||
aac626c2c2 | |||
3eec3cfac2 | |||
5eee9e62e5 | |||
a7d18125d3 | |||
8202310073 | |||
1e2ba110eb | |||
62c9b7d850 | |||
4f18fc836f | |||
950d8494ba | |||
cb528af4e2 | |||
ad27c30623 | |||
9add8d0afc | |||
af2e7ea285 | |||
675a78aaa1 | |||
408bdbce7a | |||
1a259d4a3f | |||
c5f8b4960c | |||
21f845ed39 | |||
7a369df9a7 | |||
f02ec31c68 | |||
d21fa4a177 | |||
bd0871cbe7 | |||
2604f8ac0a | |||
a7574f8657 | |||
73f250f03a | |||
bae0aadafa | |||
5524146ddf | |||
3b2adbc9df | |||
4e41c81bc7 | |||
c545e812d0 | |||
c2193a37ce | |||
fabba82173 | |||
c3ec5ad846 | |||
c4945cc04a | |||
e2e55f81d0 | |||
d862565b16 | |||
0cc3956693 | |||
4e5677f116 | |||
acba1d6f9e | |||
3e14af5033 | |||
6f56501034 | |||
0b7269b64e | |||
457a2d948b | |||
528bdf34fd | |||
697cd17b59 | |||
13fcfcb964 | |||
9c1fd55768 | |||
7f9a476660 | |||
b07290df81 | |||
4b599a95b3 | |||
64222cfff7 | |||
e81d434903 | |||
bf0dd158de | |||
18e398131d | |||
4a5837a286 | |||
656e2649a7 |
42
.appveyor.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
version: '{build}'
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
- /^v[0-9.]+\.[0-9.]+/
|
||||||
|
|
||||||
|
cache:
|
||||||
|
- '%USERPROFILE%\.cargo'
|
||||||
|
- '%APPVEYOR_BUILD_FOLDER%\target'
|
||||||
|
|
||||||
|
clone_folder: d:\projects\solana
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- bash ci/publish-tarball.sh
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
- provider: Slack
|
||||||
|
incoming_webhook:
|
||||||
|
secure: GJsBey+F5apAtUm86MHVJ68Uqa6WN1SImcuIc4TsTZrDhA8K1QWUNw9FFQPybUWDyOcS5dly3kubnUqlGt9ux6Ad2efsfRIQYWv0tOVXKeY=
|
||||||
|
channel: ci-status
|
||||||
|
on_build_success: false
|
||||||
|
on_build_failure: true
|
||||||
|
on_build_status_changed: true
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
- provider: S3
|
||||||
|
access_key_id:
|
||||||
|
secure: fTbJl6JpFebR40J7cOWZ2mXBa3kIvEiXgzxAj6L3N7A=
|
||||||
|
secret_access_key:
|
||||||
|
secure: vItsBXb2rEFLvkWtVn/Rcxu5a5+2EwC+b7GsA0waJy9hXh6XuBAD0lnHd9re3g/4
|
||||||
|
bucket: release.solana.com
|
||||||
|
region: us-west-1
|
||||||
|
set_public: true
|
||||||
|
|
||||||
|
- provider: GitHub
|
||||||
|
auth_token:
|
||||||
|
secure: 81fEmPZ0cV1wLtNuUrcmtgxKF6ROQF1+/ft5m+fHX21z6PoeCbaNo8cTyLioWBj7
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
|
on:
|
||||||
|
appveyor_repo_tag: true
|
1
.buildkite/env/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/secrets_unencrypted.ejson
|
17
.buildkite/env/secrets.ejson
vendored
@ -1,12 +1,15 @@
|
|||||||
{
|
{
|
||||||
"_public_key": "ae29f4f7ad2fc92de70d470e411c8426d5d48db8817c9e3dae574b122192335f",
|
"_public_key": "ae29f4f7ad2fc92de70d470e411c8426d5d48db8817c9e3dae574b122192335f",
|
||||||
"environment": {
|
"environment": {
|
||||||
"CODECOV_TOKEN": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:jA0WqO70coUtF0iokRdgtCR/lF/lETAI:d/Wl8Tdl6xVh/B39cTf1DaQkomR7I/2vMhvxd1msJ++BjI2l3p2dFoGsXqWT+/os8VgiPg==]",
|
"CODECOV_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:JnxhrIxh09AvqdJgrVSYmb7PxSrh19aE:07WzVExCHEd1lJ1m8QizRRthGri+WBNeZRKjjEvsy5eo4gv3HD7zVEm42tVTGkqITKkBNQ==]",
|
||||||
"CRATES_IO_TOKEN": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:2FaZ6k4RGH8luyNRaN6yeZUQDNAu2KwC:XeYe0tCAivYE0F9HEWM79mAI6kNbfYaqP7k7yY+SBDvs0341U9BdGZp7SErbHleS]",
|
"CRATES_IO_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:d0jJqC32/axwzq/N7kMRmpxKhnRrhtpt:zvcPHwkOzGnjhNkAQSejwdy1Jkr9wR1qXFFCnfIjyt/XQYubzB1tLkoly/qdmeb5]",
|
||||||
"GITHUB_TOKEN": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:9kh4DGPiGDcUU7ejSFWg3gTW8nrOM09Q:b+GE07Wu6/bEnkDZcUtf48vTKAFphrCSt3tNNER9h6A+wZ80k499edw4pbDdl9kEvxB30fFwrLQ=]",
|
"GEOLOCATION_API_KEY": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R4gfB6Ey4i50HyfLt4UZDLBqg3qHEUye:UfZCOgt8XI6Y2g+ivCRVoS1fjFycFs7/GSevvCqh1B50mG0+hzpEyzXQLuKG5OeI]",
|
||||||
"INFLUX_DATABASE": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:rCHsYi0rc7dmvr1V3wEgNoaNIyr+9ClM:omjVcOqM7vwt44kJ+As4BjJL]",
|
"GITHUB_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Vq2dkGTOzfEpRht0BAGHFp/hDogMvXJe:tFXHg1epVt2mq9hkuc5sRHe+KAnVREi/p8S+IZu67XRyzdiA/nGak1k860FXYuuzuaE0QWekaEc=]",
|
||||||
"INFLUX_PASSWORD": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:bP5Gw1Vy66viKFKO41o2Gho998XajH/5:khkCYz2LFvkJkk7R4xY1Hfz1yU3/NENjauiUkPhXA+dmg1qOIToxEagCgIkRwyeCiYaoCR6CZyw=]",
|
"INFLUX_DATABASE": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:5KI9WBkXx3R/W4m256mU5MJOE7N8aAT9:Cb8QFELZ9I60t5zhJ9h55Kcs]",
|
||||||
"INFLUX_USERNAME": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:ZamCvza2W9/bZRGSkqDu55xNN04XKKhp:5jlmCOdFbpL7EFez41zCbLfk3ZZlfmhI]",
|
"INFLUX_PASSWORD": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:hQRMpLCrav+OYkNphkeM4hagdVoZv5Iw:AUO76rr6+gF1OLJA8ZLSG8wHKXgYCPNk6gRCV8rBhZBJ4KwDaxpvOhMl7bxxXG6jol7v4aRa/Lk=]",
|
||||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:eSGdiZR0Qi0g7qnsI+qJ5H+/ik+H2qL3ned/cBdv/SY=:Oi2nsRxnvWnnBYsB6KwEDzLPcYgpYojU:ELbvjXkXKlgFCMES45R+fxG7Ex43WHWErjMbxZoqasxyr7GSH66hQzUWqiQSJyT4ukYrRhRC9YrsKKGkjACLU57X4EGIy9TuLgTnyBYhPnxLYStC3y/7o/MB5FCTt5wHJw3/A9p+me5+T4UmyZ7OeP21NhDUCGQcb0040VwYWS78klW2aQESJJ6wTI1xboE8/zC0vtnB/u50+LydbKEyb21r6y3OH9FYNEpSwIspWKcgpruJdQSCnDoKxP9YR1yzvk2rabss13LJNdV1Y6mQNIdP4OIFQhCs6dXT253RTl5qdZ0MruHwlp8wX4btOuYDcCoM5exr]"
|
"INFLUX_USERNAME": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R7BNmQjfeqoGDAFTJu9bYTGHol2NgnYN:Q2tOT/EBcFvhFk+DKLKmVU7tLCpVC3Ui]",
|
||||||
|
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Egc2dMrHDU0NcZ71LwGv/V66shUhwYUE:04VoIb8CKy7KYhQ5W4cEW9SDKZltxWBL5Hob106lMBbUOD/yUvKYcG3Ep8JfTMwO3K8zowW5HpU/IdGoilX0XWLiJJ6t+p05WWK0TA16nOEtwrEG+UK8wm3sN+xCO20i4jDhpNpgg3FYFHT5rKTHW8+zaBTNUX/SFxkN67Lm+92IM28CXYE43SU1WV6H99hGFFVpTK5JVM3JuYU1ex/dHRE+xCzTr4MYUB/F+nGoNFW8HUDV/y0e1jxT9to3x0SmnytEEuk+5RUzFuEt9cKNFeNml3fOCi4qL+sfj/Y5pjH9xDiUxsvH/8NL35jbLP244aFHgWcp]",
|
||||||
|
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_apple_darwin": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:NeOxSoWCvXB9AL4H6OK26l/7bmsKd/oz:Ijfoxtvk2CHlN1ZXHup3Gg/914kbbAkEGWJfvozA8UIe+aUzUObMyTrKkVOeNAH8Q8YH9tNzk7RRnrTcpnzeCCBLlWcVEeruMxHox3mPRzmSeDLxtbzCl9VePlRO3T7jg90K5hW+ZAkd5J/WJNzpAcmr93ts/of3MbvGHSujId/efCTzJEcP6JInnBb8Vrj7TlgKbzUlnqpq1+NjYPSXN3maKa9pKeo2JWxZlGBMoy6QWUUY5GbYEylw9smwh1LJcHZjlaZNMuOl4gNKtaSr38IXQkAXaRUJDPAmPras00YObKzXU8RkTrP4EoP/jx5LPR7f]",
|
||||||
|
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_pc_windows_msvc": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:7t+56twjW+jR7fpFNNeRFLPd7E4lbmyN:JuviDpkQrfVcNUGRGsa2e/UhvH6tTYyk1s4cHHE5xZH1NByL7Kpqx36VG/+o1AUGEeSQdsBnKgzYdMoFYbO8o50DoRPc86QIEVXCupD6J9avxLFtQgOWgJp+/mCdUVXlqXiFs/vQgS/L4psrcKdF6WHd77BeUr6ll8DjH+9m5FC9Rcai2pXno6VbPpunHQ0oUdYzhFR64+LiRacBaefQ9igZ+nSEWDLqbaZSyfm9viWkijoVFTq8gAgdXXEh7g0QdxVE5T6bPristJhT6jWBhWunPUCDNFFErWIsbRGctepl4pbCWqh2hNTw9btSgVfeY6uGCOsdy9E=]"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
CI_BUILD_START=$(date +%s)
|
CI_BUILD_START=$(date +%s)
|
||||||
export CI_BUILD_START
|
export CI_BUILD_START
|
||||||
|
|
||||||
|
source ci/env.sh
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kill any running docker containers, which are potentially left over from the
|
# Kill any running docker containers, which are potentially left over from the
|
||||||
# previous CI job
|
# previous CI job
|
||||||
@ -31,3 +33,10 @@ export CI_BUILD_START
|
|||||||
kill -9 "$victim" || true
|
kill -9 "$victim" || true
|
||||||
done
|
done
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# HACK: These are in our docker images, need to be removed from CARGO_HOME
|
||||||
|
# because we try to cache downloads across builds with CARGO_HOME
|
||||||
|
# cargo lacks a facility for "system" tooling, always tries CARGO_HOME first
|
||||||
|
cargo uninstall cargo-audit || true
|
||||||
|
cargo uninstall svgbob_cli || true
|
||||||
|
cargo uninstall mdbook || true
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
set -x
|
set -x
|
||||||
rsync -a --delete --link-dest="$PWD" target "$d"
|
rsync -a --delete --link-dest="$PWD" target "$d"
|
||||||
du -hs "$d"
|
du -hs "$d"
|
||||||
|
read -r cacheSizeInGB _ < <(du -s --block-size=1800000000 "$d")
|
||||||
|
echo "--- ${cacheSizeInGB}GB: $d"
|
||||||
)
|
)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -14,14 +14,18 @@ export PS4="++"
|
|||||||
(
|
(
|
||||||
set -x
|
set -x
|
||||||
d=$HOME/cargo-target-cache/"$BUILDKITE_LABEL"
|
d=$HOME/cargo-target-cache/"$BUILDKITE_LABEL"
|
||||||
|
MAX_CACHE_SIZE=18 # gigabytes
|
||||||
|
|
||||||
if [[ -d $d ]]; then
|
if [[ -d $d ]]; then
|
||||||
du -hs "$d"
|
du -hs "$d"
|
||||||
read -r cacheSizeInGB _ < <(du -s --block-size=1000000000 "$d")
|
read -r cacheSizeInGB _ < <(du -s --block-size=1800000000 "$d")
|
||||||
if [[ $cacheSizeInGB -gt 10 ]]; then
|
echo "--- ${cacheSizeInGB}GB: $d"
|
||||||
echo "$d has gotten too large, removing it"
|
if [[ $cacheSizeInGB -gt $MAX_CACHE_SIZE ]]; then
|
||||||
|
echo "--- $d is too large, removing it"
|
||||||
rm -rf "$d"
|
rm -rf "$d"
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "--- $d not present"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p "$d"/target
|
mkdir -p "$d"/target
|
||||||
|
@ -10,11 +10,22 @@
|
|||||||
set -e
|
set -e
|
||||||
cd "$(dirname "$0")"/..
|
cd "$(dirname "$0")"/..
|
||||||
|
|
||||||
buildkite-agent pipeline upload ci/buildkite.yml
|
if [[ -n $BUILDKITE_TAG ]]; then
|
||||||
|
buildkite-agent annotate --style info --context release-tag \
|
||||||
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
"https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG"
|
||||||
|
buildkite-agent pipeline upload ci/buildkite-release.yml
|
||||||
|
else
|
||||||
|
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
||||||
# Add helpful link back to the corresponding Github Pull Request
|
# Add helpful link back to the corresponding Github Pull Request
|
||||||
buildkite-agent annotate --style info --context pr-backlink \
|
buildkite-agent annotate --style info --context pr-backlink \
|
||||||
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $BUILDKITE_MESSAGE =~ GitBook: ]]; then
|
||||||
|
buildkite-agent annotate --style info --context gitbook-ci-skip \
|
||||||
|
"GitBook commit detected, CI skipped"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
buildkite-agent pipeline upload ci/buildkite.yml
|
||||||
|
fi
|
||||||
|
5
.gitbook.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
root: ./book/src
|
||||||
|
|
||||||
|
structure:
|
||||||
|
readme: introduction.md
|
||||||
|
summary: SUMMARY.md
|
24
.github/stale.yml
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
only: pulls
|
||||||
|
|
||||||
|
# Number of days of inactivity before a pull request becomes stale
|
||||||
|
daysUntilStale: 30
|
||||||
|
|
||||||
|
# Number of days of inactivity before a stale pull request is closed
|
||||||
|
daysUntilClose: 7
|
||||||
|
|
||||||
|
# Issues with these labels will never be considered stale
|
||||||
|
exemptLabels:
|
||||||
|
- security
|
||||||
|
|
||||||
|
# Label to use when marking a pull request as stale
|
||||||
|
staleLabel: stale
|
||||||
|
|
||||||
|
# Comment to post when marking a pull request as stale. Set to `false` to disable
|
||||||
|
markComment: >
|
||||||
|
This pull request has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs.
|
||||||
|
|
||||||
|
# Comment to post when closing a stale pull request. Set to `false` to disable
|
||||||
|
closeComment: >
|
||||||
|
This stale pull request has been automatically closed.
|
||||||
|
Thank you for your contributions.
|
13
.gitignore
vendored
@ -1,26 +1,23 @@
|
|||||||
/book/html/
|
/book/html/
|
||||||
/book/src/img/
|
|
||||||
/book/src/tests.ok
|
/book/src/tests.ok
|
||||||
/core/target/
|
|
||||||
/farf/
|
/farf/
|
||||||
/ledger-tool/target/
|
|
||||||
/solana-release/
|
/solana-release/
|
||||||
solana-release.tar.bz2
|
/solana-release.tar.bz2
|
||||||
|
/solana-metrics/
|
||||||
|
/solana-metrics.tar.bz2
|
||||||
/target/
|
/target/
|
||||||
/wallet/target/
|
|
||||||
|
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
.cargo
|
.cargo
|
||||||
|
|
||||||
# node config that is rsynced
|
|
||||||
/config/
|
/config/
|
||||||
# node config that remains local
|
|
||||||
/config-local/
|
|
||||||
|
|
||||||
# log files
|
# log files
|
||||||
*.log
|
*.log
|
||||||
log-*.txt
|
log-*.txt
|
||||||
|
log-*/
|
||||||
|
|
||||||
# intellij files
|
# intellij files
|
||||||
/.idea/
|
/.idea/
|
||||||
/solana.iml
|
/solana.iml
|
||||||
|
/.vscode/
|
||||||
|
45
.mergify.yml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# Validate your changes with:
|
||||||
|
#
|
||||||
|
# $ curl -F 'data=@.mergify.yml' https://gh.mergify.io/validate
|
||||||
|
#
|
||||||
|
# https://doc.mergify.io/
|
||||||
|
pull_request_rules:
|
||||||
|
- name: remove outdated reviews
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
actions:
|
||||||
|
dismiss_reviews:
|
||||||
|
changes_requested: true
|
||||||
|
- name: set automerge label on mergify backport PRs
|
||||||
|
conditions:
|
||||||
|
- author=mergify[bot]
|
||||||
|
- head~=^mergify/bp/
|
||||||
|
- "#status-failure=0"
|
||||||
|
actions:
|
||||||
|
label:
|
||||||
|
add:
|
||||||
|
- automerge
|
||||||
|
- name: v0.21 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.21
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.21
|
||||||
|
- name: v0.22 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.22
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.22
|
||||||
|
- name: v0.23 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.23
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.23
|
42
.travis.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
os:
|
||||||
|
- osx
|
||||||
|
|
||||||
|
language: rust
|
||||||
|
rust:
|
||||||
|
- stable
|
||||||
|
|
||||||
|
install:
|
||||||
|
- source ci/rust-version.sh
|
||||||
|
|
||||||
|
script:
|
||||||
|
- source ci/env.sh
|
||||||
|
- ci/publish-tarball.sh
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
- /^v\d+\.\d+/
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
on_success: change
|
||||||
|
secure: F4IjOE05MyaMOdPRL+r8qhs7jBvv4yDM3RmFKE1zNXnfUOqV4X38oQM1EI+YVsgpMQLj/pxnEB7wcTE4Bf86N6moLssEULCpvAuMVoXj4QbWdomLX+01WbFa6fLVeNQIg45NHrz2XzVBhoKOrMNnl+QI5mbR2AlS5oqsudHsXDnyLzZtd4Y5SDMdYG1zVWM01+oNNjgNfjcCGmOE/K0CnOMl6GPi3X9C34tJ19P2XT7MTDsz1/IfEF7fro2Q8DHEYL9dchJMoisXSkem5z7IDQkGzXsWdWT4NnndUvmd1MlTCE9qgoXDqRf95Qh8sB1Dz08HtvgfaosP2XjtNTfDI9BBYS15Ibw9y7PchAJE1luteNjF35EOy6OgmCLw/YpnweqfuNViBZz+yOPWXVC0kxnPIXKZ1wyH9ibeH6E4hr7a8o9SV/6SiWIlbYF+IR9jPXyTCLP/cc3sYljPWxDnhWFwFdRVIi3PbVAhVu7uWtVUO17Oc9gtGPgs/GrhOMkJfwQPXaudRJDpVZowxTX4x9kefNotlMAMRgq+Drbmgt4eEBiCNp0ITWgh17BiE1U09WS3myuduhoct85+FoVeaUkp1sxzHVtGsNQH0hcz7WcpZyOM+AwistJA/qzeEDQao5zi1eKWPbO2xAhi2rV1bDH6bPf/4lDBwLRqSiwvlWU=
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
- provider: s3
|
||||||
|
access_key_id: $AWS_ACCESS_KEY_ID
|
||||||
|
secret_access_key: $AWS_SECRET_ACCESS_KEY
|
||||||
|
bucket: release.solana.com
|
||||||
|
region: us-west-1
|
||||||
|
skip_cleanup: true
|
||||||
|
acl: public_read
|
||||||
|
local_dir: travis-s3-upload
|
||||||
|
on:
|
||||||
|
all_branches: true
|
||||||
|
- provider: releases
|
||||||
|
api_key: $GITHUB_TOKEN
|
||||||
|
skip_cleanup: true
|
||||||
|
file_glob: true
|
||||||
|
file: travis-release-upload/*
|
||||||
|
on:
|
||||||
|
tags: true
|
@ -103,7 +103,7 @@ Solana's architecture is described by a book generated from markdown files in
|
|||||||
the `book/src/` directory, maintained by an *editor* (currently @garious). To
|
the `book/src/` directory, maintained by an *editor* (currently @garious). To
|
||||||
add a design proposal, you'll need to at least propose a change the content
|
add a design proposal, you'll need to at least propose a change the content
|
||||||
under the [Accepted Design
|
under the [Accepted Design
|
||||||
Proposals](https://solana-labs.github.io/book-edge/proposals.html) chapter.
|
Proposals](https://docs.solana.com/book/v/master/proposals) chapter.
|
||||||
Here's the full process:
|
Here's the full process:
|
||||||
|
|
||||||
1. Propose a design by creating a PR that adds a markdown document to the
|
1. Propose a design by creating a PR that adds a markdown document to the
|
||||||
|
5138
Cargo.lock
generated
66
Cargo.toml
@ -1,41 +1,61 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
".",
|
|
||||||
"bench-exchange",
|
"bench-exchange",
|
||||||
"bench-streamer",
|
"bench-streamer",
|
||||||
"bench-tps",
|
"bench-tps",
|
||||||
|
"banking-bench",
|
||||||
|
"chacha-sys",
|
||||||
|
"client",
|
||||||
|
"core",
|
||||||
"drone",
|
"drone",
|
||||||
"fullnode",
|
"perf",
|
||||||
|
"validator",
|
||||||
"genesis",
|
"genesis",
|
||||||
|
"genesis-programs",
|
||||||
"gossip",
|
"gossip",
|
||||||
"install",
|
"install",
|
||||||
"keygen",
|
"keygen",
|
||||||
"kvstore",
|
"ledger",
|
||||||
"ledger-tool",
|
"ledger-tool",
|
||||||
|
"local-cluster",
|
||||||
"logger",
|
"logger",
|
||||||
|
"log-analyzer",
|
||||||
|
"merkle-tree",
|
||||||
|
"measure",
|
||||||
"metrics",
|
"metrics",
|
||||||
"programs/bpf",
|
"net-shaper",
|
||||||
"programs/bpf_loader",
|
"programs/bpf_loader",
|
||||||
"programs/budget_api",
|
"programs/budget",
|
||||||
"programs/budget_program",
|
"programs/btc_spv",
|
||||||
"programs/config_api",
|
"programs/btc_spv_bin",
|
||||||
"programs/config_program",
|
"programs/config",
|
||||||
"programs/exchange_api",
|
"programs/config_tests",
|
||||||
"programs/exchange_program",
|
"programs/exchange",
|
||||||
"programs/token_api",
|
"programs/failure",
|
||||||
"programs/token_program",
|
"programs/noop",
|
||||||
"programs/failure_program",
|
"programs/ownable_api",
|
||||||
"programs/noop_program",
|
"programs/stake",
|
||||||
"programs/stake_api",
|
"programs/stake_tests",
|
||||||
"programs/stake_program",
|
"programs/storage",
|
||||||
"programs/storage_api",
|
"programs/storage_tests",
|
||||||
"programs/storage_program",
|
"programs/vest",
|
||||||
"programs/vote_api",
|
"programs/vote",
|
||||||
"programs/vote_program",
|
"archiver",
|
||||||
"replicator",
|
"runtime",
|
||||||
"sdk",
|
"sdk",
|
||||||
|
"sdk-c",
|
||||||
|
"scripts",
|
||||||
"upload-perf",
|
"upload-perf",
|
||||||
|
"net-utils",
|
||||||
|
"fixed-buf",
|
||||||
"vote-signer",
|
"vote-signer",
|
||||||
"wallet",
|
"cli",
|
||||||
|
"rayon-threadlimit",
|
||||||
|
"watchtower",
|
||||||
|
]
|
||||||
|
|
||||||
|
exclude = [
|
||||||
|
"programs/bpf",
|
||||||
|
"programs/move_loader",
|
||||||
|
"programs/librapay_api",
|
||||||
]
|
]
|
||||||
exclude = ["programs/bpf/rust/noop"]
|
|
||||||
|
59
README.md
@ -1,5 +1,5 @@
|
|||||||
[](https://crates.io/crates/solana)
|
[](https://crates.io/crates/solana-core)
|
||||||
[](https://docs.rs/solana)
|
[](https://docs.rs/solana-core)
|
||||||
[](https://buildkite.com/solana-labs/solana/builds?branch=master)
|
[](https://buildkite.com/solana-labs/solana/builds?branch=master)
|
||||||
[](https://codecov.io/gh/solana-labs/solana)
|
[](https://codecov.io/gh/solana-labs/solana)
|
||||||
|
|
||||||
@ -26,9 +26,43 @@ Furthermore, and much to our surprise, it can be implemented using a mechanism t
|
|||||||
Architecture
|
Architecture
|
||||||
===
|
===
|
||||||
|
|
||||||
Before you jump into the code, review the online book [Solana: Blockchain Rebuilt for Scale](https://solana-labs.github.io/book/).
|
Before you jump into the code, review the online book [Solana: Blockchain Rebuilt for Scale](https://docs.solana.com/book/).
|
||||||
|
|
||||||
(The _latest_ development version of the online book is also [available here](https://solana-labs.github.io/book-edge/).)
|
(The _latest_ development version of the online book is also [available here](https://docs.solana.com/book/v/master/).)
|
||||||
|
|
||||||
|
Release Binaries
|
||||||
|
===
|
||||||
|
Official release binaries are available at [Github Releases](https://github.com/solana-labs/solana/releases).
|
||||||
|
|
||||||
|
Additionally we provide pre-release binaries for the latest code on the edge and
|
||||||
|
beta channels. Note that these pre-release binaries may be less stable than an
|
||||||
|
official release.
|
||||||
|
|
||||||
|
### Edge channel
|
||||||
|
#### Linux (x86_64-unknown-linux-gnu)
|
||||||
|
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-unknown-linux-gnu.tar.bz2)
|
||||||
|
* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable
|
||||||
|
#### mac OS (x86_64-apple-darwin)
|
||||||
|
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-apple-darwin.tar.bz2)
|
||||||
|
* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-apple-darwin) as a stand-alone executable
|
||||||
|
#### Windows (x86_64-pc-windows-msvc)
|
||||||
|
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-pc-windows-msvc.tar.bz2)
|
||||||
|
* [solana-install-init.exe](http://release.solana.com/edge/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable
|
||||||
|
#### All platforms
|
||||||
|
* [solana-metrics.tar.bz2](http://release.solana.com.s3.amazonaws.com/edge/solana-metrics.tar.bz2)
|
||||||
|
|
||||||
|
### Beta channel
|
||||||
|
#### Linux (x86_64-unknown-linux-gnu)
|
||||||
|
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-unknown-linux-gnu.tar.bz2)
|
||||||
|
* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable
|
||||||
|
#### mac OS (x86_64-apple-darwin)
|
||||||
|
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-apple-darwin.tar.bz2)
|
||||||
|
* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-apple-darwin) as a stand-alone executable
|
||||||
|
#### Windows (x86_64-pc-windows-msvc)
|
||||||
|
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-pc-windows-msvc.tar.bz2)
|
||||||
|
* [solana-install-init.exe](http://release.solana.com/beta/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable
|
||||||
|
#### All platforms
|
||||||
|
* [solana-metrics.tar.bz2](http://release.solana.com.s3.amazonaws.com/beta/solana-metrics.tar.bz2)
|
||||||
|
|
||||||
Developing
|
Developing
|
||||||
===
|
===
|
||||||
@ -41,10 +75,10 @@ Install rustc, cargo and rustfmt:
|
|||||||
```bash
|
```bash
|
||||||
$ curl https://sh.rustup.rs -sSf | sh
|
$ curl https://sh.rustup.rs -sSf | sh
|
||||||
$ source $HOME/.cargo/env
|
$ source $HOME/.cargo/env
|
||||||
$ rustup component add rustfmt-preview
|
$ rustup component add rustfmt
|
||||||
```
|
```
|
||||||
|
|
||||||
If your rustc version is lower than 1.34.0, please update it:
|
If your rustc version is lower than 1.39.0, please update it:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ rustup update
|
$ rustup update
|
||||||
@ -66,7 +100,7 @@ $ cd solana
|
|||||||
Build
|
Build
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ cargo build --all
|
$ cargo build
|
||||||
```
|
```
|
||||||
|
|
||||||
Then to run a minimal local cluster
|
Then to run a minimal local cluster
|
||||||
@ -80,25 +114,22 @@ Testing
|
|||||||
Run the test suite:
|
Run the test suite:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ cargo test --all
|
$ cargo test
|
||||||
```
|
```
|
||||||
|
|
||||||
Local Testnet
|
Local Testnet
|
||||||
---
|
---
|
||||||
|
|
||||||
Start your own testnet locally, instructions are in the book [Solana: Blockchain Rebuild for Scale: Getting Started](https://solana-labs.github.io/book/getting-started.html).
|
Start your own testnet locally, instructions are in the book [Solana: Blockchain Rebuild for Scale: Getting Started](https://docs.solana.com/book/getting-started).
|
||||||
|
|
||||||
Remote Testnets
|
Remote Testnets
|
||||||
---
|
---
|
||||||
|
|
||||||
We maintain several testnets:
|
We maintain several testnets:
|
||||||
|
|
||||||
* `testnet` - public stable testnet accessible via testnet.solana.com, with an https proxy for web apps at api.testnet.solana.com. Runs 24/7
|
* `testnet` - public stable testnet accessible via testnet.solana.com. Runs 24/7
|
||||||
* `testnet-beta` - public beta channel testnet accessible via beta.testnet.solana.com. Runs 24/7
|
* `testnet-beta` - public beta channel testnet accessible via beta.testnet.solana.com. Runs 24/7
|
||||||
* `testnet-edge` - public edge channel testnet accessible via edge.testnet.solana.com. Runs 24/7
|
* `testnet-edge` - public edge channel testnet accessible via edge.testnet.solana.com. Runs 24/7
|
||||||
* `testnet-perf` - permissioned stable testnet running a 24/7 soak test
|
|
||||||
* `testnet-beta-perf` - permissioned beta channel testnet running a multi-hour soak test weekday mornings
|
|
||||||
* `testnet-edge-perf` - permissioned edge channel testnet running a multi-hour soak test weekday mornings
|
|
||||||
|
|
||||||
## Deploy process
|
## Deploy process
|
||||||
|
|
||||||
@ -209,5 +240,3 @@ problem is solved by this code?" On the other hand, if a test does fail and you
|
|||||||
better way to solve the same problem, a Pull Request with your solution would most certainly be
|
better way to solve the same problem, a Pull Request with your solution would most certainly be
|
||||||
welcome! Likewise, if rewriting a test can better communicate what code it's protecting, please
|
welcome! Likewise, if rewriting a test can better communicate what code it's protecting, please
|
||||||
send us that patch!
|
send us that patch!
|
||||||
|
|
||||||
|
|
||||||
|
171
RELEASE.md
@ -59,53 +59,146 @@ There are three release channels that map to branches as follows:
|
|||||||
* beta - tracks the largest (and latest) `vX.Y` stabilization branch, more stable.
|
* beta - tracks the largest (and latest) `vX.Y` stabilization branch, more stable.
|
||||||
* stable - tracks the second largest `vX.Y` stabilization branch, most stable.
|
* stable - tracks the second largest `vX.Y` stabilization branch, most stable.
|
||||||
|
|
||||||
## Release Steps
|
## Steps to Create a Branch
|
||||||
|
|
||||||
### Changing channels
|
### Create the new branch
|
||||||
|
1. Check out the latest commit on `master` branch:
|
||||||
#### Create the new branch
|
```
|
||||||
1. Pick your branch point for release on master.
|
git fetch --all
|
||||||
1. Create the branch. The name should be "v" + the first 2 "version" fields
|
git checkout upstream/master
|
||||||
|
```
|
||||||
|
1. Determine the new branch name. The name should be "v" + the first 2 version fields
|
||||||
from Cargo.toml. For example, a Cargo.toml with version = "0.9.0" implies
|
from Cargo.toml. For example, a Cargo.toml with version = "0.9.0" implies
|
||||||
the next branch name is "v0.9".
|
the next branch name is "v0.9".
|
||||||
1. Note the Cargo.toml in the repo root directory does not contain a version. Look at any other Cargo.toml file.
|
1. Create the new branch and push this branch to the `solana` repository:
|
||||||
1. Create a new branch and push this branch to the solana repository.
|
```
|
||||||
1. `git checkout -b <branchname>`
|
git checkout -b <branchname>
|
||||||
1. `git push -u origin <branchname>`
|
git push -u origin <branchname>
|
||||||
|
```
|
||||||
|
|
||||||
#### Update master with the next version
|
### Update master branch with the next version
|
||||||
|
|
||||||
1. After the new branch has been created and pushed, update Cargo.toml on **master** to the next semantic version (e.g. 0.9.0 -> 0.10.0)
|
1. After the new branch has been created and pushed, update the Cargo.toml files on **master** to the next semantic version (e.g. 0.9.0 -> 0.10.0) with:
|
||||||
by running `./scripts/increment-cargo-version.sh`, then rebuild with
|
```
|
||||||
`cargo build` to cause a refresh of `Cargo.lock`.
|
scripts/increment-cargo-version.sh minor
|
||||||
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
```
|
||||||
master branch
|
1. Rebuild to get an updated version of `Cargo.lock`:
|
||||||
|
```
|
||||||
|
cargo build
|
||||||
|
```
|
||||||
|
1. Push all the changed Cargo.toml and Cargo.lock files to the `master` branch with something like:
|
||||||
|
```
|
||||||
|
git co -b version_update
|
||||||
|
git ls-files -m | xargs git add
|
||||||
|
git commit -m 'Update Cargo.toml versions from X.Y to X.Y+1'
|
||||||
|
git push -u origin version_update
|
||||||
|
```
|
||||||
|
1. Confirm that your freshly cut release branch is shown as `BETA_CHANNEL` and the previous release branch as `STABLE_CHANNEL`:
|
||||||
|
```
|
||||||
|
ci/channel_info.sh
|
||||||
|
```
|
||||||
|
|
||||||
At this point, `ci/channel-info.sh` should show your freshly cut release branch as
|
## Steps to Create a Release
|
||||||
"BETA_CHANNEL" and the previous release branch as "STABLE_CHANNEL".
|
|
||||||
|
|
||||||
### Updating channels (i.e. "making a release")
|
### Create the Release Tag on GitHub
|
||||||
|
|
||||||
We use [github's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
1. Go to [GitHub's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
||||||
|
|
||||||
1. Go [there ;)](https://github.com/solana-labs/solana/releases).
|
|
||||||
1. Click "Draft new release". The release tag must exactly match the `version`
|
1. Click "Draft new release". The release tag must exactly match the `version`
|
||||||
field in `/Cargo.toml` prefixed by `v` (ie, `<branchname>.X`).
|
field in `/Cargo.toml` prefixed by `v`.
|
||||||
1. If the Cargo.toml verion field is **0.12.3**, then the release tag must be **v0.12.3**
|
1. If the Cargo.toml verion field is **0.12.3**, then the release tag must be **v0.12.3**
|
||||||
|
1. Make sure the Target Branch field matches the branch you want to make a release on.
|
||||||
|
1. If you want to release v0.12.0, the target branch must be v0.12
|
||||||
1. If this is the first release on the branch (e.g. v0.13.**0**), paste in [this
|
1. If this is the first release on the branch (e.g. v0.13.**0**), paste in [this
|
||||||
template](https://raw.githubusercontent.com/solana-labs/solana/master/.github/RELEASE_TEMPLATE.md)
|
template](https://raw.githubusercontent.com/solana-labs/solana/master/.github/RELEASE_TEMPLATE.md). Engineering Lead can provide summary contents for release notes if needed.
|
||||||
and fill it in.
|
1. Click "Save Draft", then confirm the release notes look good and the tag name and branch are correct. Go back into edit the release and click "Publish release" when ready.
|
||||||
1. Test the release by generating a tag using semver's rules. First try at a
|
|
||||||
release should be `<branchname>.X-rc.0`.
|
### Update release branch with the next patch version
|
||||||
1. Verify release automation:
|
|
||||||
1. [Crates.io](https://crates.io/crates/solana) should have an updated Solana version.
|
1. After the new release has been tagged, update the Cargo.toml files on **release branch** to the next semantic version (e.g. 0.9.0 -> 0.9.1) with:
|
||||||
1. ...
|
```
|
||||||
1. After testnet deployment, verify that testnets are running correct software.
|
scripts/increment-cargo-version.sh patch
|
||||||
http://metrics.solana.com should show testnet running on a hash from your
|
```
|
||||||
newly created branch.
|
1. Rebuild to get an updated version of `Cargo.lock`:
|
||||||
1. Once the release has been made, update Cargo.toml on the release branch to the next
|
```
|
||||||
semantic version (e.g. 0.9.0 -> 0.9.1) by running
|
cargo build
|
||||||
`./scripts/increment-cargo-version.sh patch`, then rebuild with `cargo
|
```
|
||||||
build` to cause a refresh of `Cargo.lock`.
|
1. Push all the changed Cargo.toml and Cargo.lock files to the **release branch** with something like:
|
||||||
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
```
|
||||||
release branch.
|
git co -b version_update
|
||||||
|
git ls-files -m | xargs git add
|
||||||
|
git commit -m 'Update Cargo.toml versions from X.Y.Z to X.Y.Z+1'
|
||||||
|
git push -u origin version_update
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verify release automation success
|
||||||
|
1. Go to [Solana Releases](https://github.com/solana-labs/solana/releases) and click on the latest release that you just published. Verify that all of the build artifacts are present. This can take up to 90 minutes after creating the tag.
|
||||||
|
1. The `solana-secondary` Buildkite pipeline handles creating the binary tarballs and updated crates. Look for a job under the tag name of the release: https://buildkite.com/solana-labs/solana-secondary
|
||||||
|
1. [Crates.io](https://crates.io/crates/solana) should have an updated Solana version.
|
||||||
|
|
||||||
|
### Update documentation
|
||||||
|
TODO: Documentation update procedure is WIP as we move to gitbook
|
||||||
|
|
||||||
|
Document the new recommended version by updating `book/src/running-archiver.md` and `book/src/validator-testnet.md` on the release (beta) branch to point at the `solana-install` for the upcoming release version.
|
||||||
|
|
||||||
|
#### Publish updated Book
|
||||||
|
We maintain three copies of the "book" as official documentation:
|
||||||
|
|
||||||
|
1) "Book" is the documentation for the latest official release. This should get manually updated whenever a new release is made. It is published here:
|
||||||
|
https://solana-labs.github.io/book/
|
||||||
|
|
||||||
|
2) "Book-edge" tracks the tip of the master branch and updates automatically.
|
||||||
|
https://solana-labs.github.io/book-edge/
|
||||||
|
|
||||||
|
3) "Book-beta" tracks the tip of the beta branch and updates automatically.
|
||||||
|
https://solana-labs.github.io/book-beta/
|
||||||
|
|
||||||
|
To manually trigger an update of the "Book", create a new job of the manual-update-book pipeline.
|
||||||
|
Set the tag of the latest release as the PUBLISH_BOOK_TAG environment variable.
|
||||||
|
```bash
|
||||||
|
PUBLISH_BOOK_TAG=v0.16.6
|
||||||
|
```
|
||||||
|
https://buildkite.com/solana-labs/manual-update-book
|
||||||
|
|
||||||
|
### Update software on testnet.solana.com
|
||||||
|
|
||||||
|
The testnet running on testnet.solana.com is set to use a fixed release tag
|
||||||
|
which is set in the Buildkite testnet-management pipeline.
|
||||||
|
This tag needs to be updated and the testnet restarted after a new release
|
||||||
|
tag is created.
|
||||||
|
|
||||||
|
#### Update testnet schedules
|
||||||
|
|
||||||
|
Go to https://buildkite.com/solana-labs and click through: Pipelines ->
|
||||||
|
testnet-management -> Pipeline Settings -> Schedules
|
||||||
|
Or just click here:
|
||||||
|
https://buildkite.com/solana-labs/testnet-management/settings/schedules
|
||||||
|
|
||||||
|
There are two scheduled jobs for testnet: a daily restart and an hourly sanity-or-restart. \
|
||||||
|
https://buildkite.com/solana-labs/testnet-management/settings/schedules/0efd7856-7143-4713-8817-47e6bdb05387
|
||||||
|
https://buildkite.com/solana-labs/testnet-management/settings/schedules/2a926646-d972-42b5-aeb9-bb6759592a53
|
||||||
|
|
||||||
|
On each schedule:
|
||||||
|
1. Set TESTNET_TAG environment variable to the desired release tag.
|
||||||
|
1. Example, TESTNET_TAG=v0.13.2
|
||||||
|
1. Set the Build Branch to the branch that TESTNET_TAG is from.
|
||||||
|
1. Example: v0.13
|
||||||
|
|
||||||
|
#### Restart the testnet
|
||||||
|
|
||||||
|
Trigger a TESTNET_OP=create-and-start to refresh the cluster with the new version
|
||||||
|
|
||||||
|
1. Go to https://buildkite.com/solana-labs/testnet-management
|
||||||
|
2. Click "New Build" and use the following settings, then click "Create Build"
|
||||||
|
1. Commit: HEAD
|
||||||
|
1. Branch: [channel branch as set in the schedules]
|
||||||
|
1. Environment Variables:
|
||||||
|
```
|
||||||
|
TESTNET=testnet
|
||||||
|
TESTNET_TAG=[same value as used in TESTNET_TAG in the schedules]
|
||||||
|
TESTNET_OP=create-and-start
|
||||||
|
```
|
||||||
|
|
||||||
|
### Alert the community
|
||||||
|
|
||||||
|
Notify Discord users on #validator-support that a new release for
|
||||||
|
testnet.solana.com is available
|
||||||
|
2
archiver/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/target/
|
||||||
|
/farf/
|
19
archiver/Cargo.toml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
name = "solana-archiver"
|
||||||
|
version = "0.21.7"
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = "2.33.0"
|
||||||
|
console = "0.9.1"
|
||||||
|
solana-clap-utils = { path = "../clap-utils", version = "0.21.7" }
|
||||||
|
solana-core = { path = "../core", version = "0.21.7" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.21.7" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.21.7" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "0.21.7" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.21.7" }
|
||||||
|
|
147
archiver/src/main.rs
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
use clap::{crate_description, crate_name, App, Arg};
|
||||||
|
use console::style;
|
||||||
|
use solana_clap_utils::{
|
||||||
|
input_validators::is_keypair,
|
||||||
|
keypair::{
|
||||||
|
self, keypair_input, KeypairWithSource, ASK_SEED_PHRASE_ARG,
|
||||||
|
SKIP_SEED_PHRASE_VALIDATION_ARG,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
use solana_core::{
|
||||||
|
archiver::Archiver,
|
||||||
|
cluster_info::{Node, VALIDATOR_PORT_RANGE},
|
||||||
|
contact_info::ContactInfo,
|
||||||
|
};
|
||||||
|
use solana_sdk::{commitment_config::CommitmentConfig, signature::KeypairUtil};
|
||||||
|
use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
solana_logger::setup();
|
||||||
|
|
||||||
|
let matches = App::new(crate_name!())
|
||||||
|
.about(crate_description!())
|
||||||
|
.version(solana_clap_utils::version!())
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("identity_keypair")
|
||||||
|
.short("i")
|
||||||
|
.long("identity-keypair")
|
||||||
|
.value_name("PATH")
|
||||||
|
.takes_value(true)
|
||||||
|
.validator(is_keypair)
|
||||||
|
.help("File containing an identity (keypair)"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("entrypoint")
|
||||||
|
.short("n")
|
||||||
|
.long("entrypoint")
|
||||||
|
.value_name("HOST:PORT")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(true)
|
||||||
|
.validator(solana_net_utils::is_host_port)
|
||||||
|
.help("Rendezvous with the cluster at this entry point"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("ledger")
|
||||||
|
.short("l")
|
||||||
|
.long("ledger")
|
||||||
|
.value_name("DIR")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(true)
|
||||||
|
.help("use DIR as persistent ledger location"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("storage_keypair")
|
||||||
|
.short("s")
|
||||||
|
.long("storage-keypair")
|
||||||
|
.value_name("PATH")
|
||||||
|
.takes_value(true)
|
||||||
|
.validator(is_keypair)
|
||||||
|
.help("File containing the storage account keypair"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name(ASK_SEED_PHRASE_ARG.name)
|
||||||
|
.long(ASK_SEED_PHRASE_ARG.long)
|
||||||
|
.value_name("KEYPAIR NAME")
|
||||||
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
|
.possible_values(&["identity-keypair", "storage-keypair"])
|
||||||
|
.help(ASK_SEED_PHRASE_ARG.help),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name)
|
||||||
|
.long(SKIP_SEED_PHRASE_VALIDATION_ARG.long)
|
||||||
|
.requires(ASK_SEED_PHRASE_ARG.name)
|
||||||
|
.help(SKIP_SEED_PHRASE_VALIDATION_ARG.help),
|
||||||
|
)
|
||||||
|
.get_matches();
|
||||||
|
|
||||||
|
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
||||||
|
|
||||||
|
let identity_keypair = keypair_input(&matches, "identity_keypair")
|
||||||
|
.unwrap_or_else(|err| {
|
||||||
|
eprintln!("Identity keypair input failed: {}", err);
|
||||||
|
exit(1);
|
||||||
|
})
|
||||||
|
.keypair;
|
||||||
|
let KeypairWithSource {
|
||||||
|
keypair: storage_keypair,
|
||||||
|
source: storage_keypair_source,
|
||||||
|
} = keypair_input(&matches, "storage_keypair").unwrap_or_else(|err| {
|
||||||
|
eprintln!("Storage keypair input failed: {}", err);
|
||||||
|
exit(1);
|
||||||
|
});
|
||||||
|
if storage_keypair_source == keypair::Source::Generated {
|
||||||
|
clap::Error::with_description(
|
||||||
|
"The `storage-keypair` argument was not found",
|
||||||
|
clap::ErrorKind::ArgumentNotFound,
|
||||||
|
)
|
||||||
|
.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
let entrypoint_addr = matches
|
||||||
|
.value_of("entrypoint")
|
||||||
|
.map(|entrypoint| {
|
||||||
|
solana_net_utils::parse_host_port(entrypoint)
|
||||||
|
.expect("failed to parse entrypoint address")
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let gossip_addr = {
|
||||||
|
let ip = solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap();
|
||||||
|
let mut addr = SocketAddr::new(ip, 0);
|
||||||
|
addr.set_ip(solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap());
|
||||||
|
addr
|
||||||
|
};
|
||||||
|
let node = Node::new_archiver_with_external_ip(
|
||||||
|
&identity_keypair.pubkey(),
|
||||||
|
&gossip_addr,
|
||||||
|
VALIDATOR_PORT_RANGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"{} version {} (branch={}, commit={})",
|
||||||
|
style(crate_name!()).bold(),
|
||||||
|
solana_clap_utils::version!(),
|
||||||
|
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
||||||
|
option_env!("CI_COMMIT").unwrap_or("unknown")
|
||||||
|
);
|
||||||
|
solana_metrics::set_host_id(identity_keypair.pubkey().to_string());
|
||||||
|
println!(
|
||||||
|
"replicating the data with identity_keypair={:?} gossip_addr={:?}",
|
||||||
|
identity_keypair.pubkey(),
|
||||||
|
gossip_addr
|
||||||
|
);
|
||||||
|
|
||||||
|
let entrypoint_info = ContactInfo::new_gossip_entry_point(&entrypoint_addr);
|
||||||
|
let archiver = Archiver::new(
|
||||||
|
&ledger_path,
|
||||||
|
node,
|
||||||
|
entrypoint_info,
|
||||||
|
Arc::new(identity_keypair),
|
||||||
|
Arc::new(storage_keypair),
|
||||||
|
CommitmentConfig::recent(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
archiver.join();
|
||||||
|
}
|
2
banking-bench/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/target/
|
||||||
|
/farf/
|
20
banking-bench/Cargo.toml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
name = "solana-banking-bench"
|
||||||
|
version = "0.21.7"
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log = "0.4.6"
|
||||||
|
rayon = "1.2.0"
|
||||||
|
solana-core = { path = "../core", version = "0.21.7" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "0.21.7" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.21.7" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.21.7" }
|
||||||
|
solana-measure = { path = "../measure", version = "0.21.7" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.21.7" }
|
||||||
|
rand = "0.6.5"
|
||||||
|
crossbeam-channel = "0.3"
|
305
banking-bench/src/main.rs
Normal file
@ -0,0 +1,305 @@
|
|||||||
|
use crossbeam_channel::unbounded;
|
||||||
|
use log::*;
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
|
use rayon::prelude::*;
|
||||||
|
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
||||||
|
use solana_core::cluster_info::ClusterInfo;
|
||||||
|
use solana_core::cluster_info::Node;
|
||||||
|
use solana_core::genesis_utils::{create_genesis_config, GenesisConfigInfo};
|
||||||
|
use solana_core::packet::to_packets_chunked;
|
||||||
|
use solana_core::poh_recorder::PohRecorder;
|
||||||
|
use solana_core::poh_recorder::WorkingBankEntry;
|
||||||
|
use solana_ledger::bank_forks::BankForks;
|
||||||
|
use solana_ledger::{blocktree::Blocktree, get_tmp_ledger_path};
|
||||||
|
use solana_measure::measure::Measure;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_sdk::hash::Hash;
|
||||||
|
use solana_sdk::pubkey::Pubkey;
|
||||||
|
use solana_sdk::signature::Keypair;
|
||||||
|
use solana_sdk::signature::Signature;
|
||||||
|
use solana_sdk::system_transaction;
|
||||||
|
use solana_sdk::timing::{duration_as_us, timestamp};
|
||||||
|
use solana_sdk::transaction::Transaction;
|
||||||
|
use std::sync::atomic::Ordering;
|
||||||
|
use std::sync::mpsc::Receiver;
|
||||||
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
|
use std::thread::sleep;
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
|
fn check_txs(
|
||||||
|
receiver: &Arc<Receiver<WorkingBankEntry>>,
|
||||||
|
ref_tx_count: usize,
|
||||||
|
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
||||||
|
) -> bool {
|
||||||
|
let mut total = 0;
|
||||||
|
let now = Instant::now();
|
||||||
|
let mut no_bank = false;
|
||||||
|
loop {
|
||||||
|
if let Ok((_bank, (entry, _tick_height))) = receiver.recv_timeout(Duration::from_millis(10))
|
||||||
|
{
|
||||||
|
total += entry.transactions.len();
|
||||||
|
}
|
||||||
|
if total >= ref_tx_count {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if now.elapsed().as_secs() > 60 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if poh_recorder.lock().unwrap().bank().is_none() {
|
||||||
|
trace!("no bank");
|
||||||
|
no_bank = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !no_bank {
|
||||||
|
assert!(total >= ref_tx_count);
|
||||||
|
}
|
||||||
|
no_bank
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_accounts_txs(txes: usize, mint_keypair: &Keypair, hash: Hash) -> Vec<Transaction> {
|
||||||
|
let to_pubkey = Pubkey::new_rand();
|
||||||
|
let dummy = system_transaction::transfer(mint_keypair, &to_pubkey, 1, hash);
|
||||||
|
(0..txes)
|
||||||
|
.into_par_iter()
|
||||||
|
.map(|_| {
|
||||||
|
let mut new = dummy.clone();
|
||||||
|
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
||||||
|
new.message.account_keys[0] = Pubkey::new_rand();
|
||||||
|
new.message.account_keys[1] = Pubkey::new_rand();
|
||||||
|
new.signatures = vec![Signature::new(&sig[0..64])];
|
||||||
|
new
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Config {
|
||||||
|
packets_per_batch: usize,
|
||||||
|
chunk_len: usize,
|
||||||
|
num_threads: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
fn get_transactions_index(&self, chunk_index: usize) -> usize {
|
||||||
|
chunk_index * (self.chunk_len / self.num_threads) * self.packets_per_batch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bytes_as_usize(bytes: &[u8]) -> usize {
|
||||||
|
bytes[0] as usize | (bytes[1] as usize) << 8
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
solana_logger::setup();
|
||||||
|
let num_threads = BankingStage::num_threads() as usize;
|
||||||
|
// a multiple of packet chunk duplicates to avoid races
|
||||||
|
const CHUNKS: usize = 8 * 2;
|
||||||
|
const PACKETS_PER_BATCH: usize = 192;
|
||||||
|
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
||||||
|
let mint_total = 1_000_000_000_000;
|
||||||
|
let GenesisConfigInfo {
|
||||||
|
genesis_config,
|
||||||
|
mint_keypair,
|
||||||
|
..
|
||||||
|
} = create_genesis_config(mint_total);
|
||||||
|
|
||||||
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
|
let (vote_sender, vote_receiver) = unbounded();
|
||||||
|
let bank0 = Bank::new(&genesis_config);
|
||||||
|
let mut bank_forks = BankForks::new(0, bank0);
|
||||||
|
let mut bank = bank_forks.working_bank();
|
||||||
|
|
||||||
|
info!("threads: {} txs: {}", num_threads, txes);
|
||||||
|
|
||||||
|
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_config.hash());
|
||||||
|
|
||||||
|
// fund all the accounts
|
||||||
|
transactions.iter().for_each(|tx| {
|
||||||
|
let fund = system_transaction::transfer(
|
||||||
|
&mint_keypair,
|
||||||
|
&tx.message.account_keys[0],
|
||||||
|
mint_total / txes as u64,
|
||||||
|
genesis_config.hash(),
|
||||||
|
);
|
||||||
|
let x = bank.process_transaction(&fund);
|
||||||
|
x.unwrap();
|
||||||
|
});
|
||||||
|
//sanity check, make sure all the transactions can execute sequentially
|
||||||
|
transactions.iter().for_each(|tx| {
|
||||||
|
let res = bank.process_transaction(&tx);
|
||||||
|
assert!(res.is_ok(), "sanity test transactions");
|
||||||
|
});
|
||||||
|
bank.clear_signatures();
|
||||||
|
//sanity check, make sure all the transactions can execute in parallel
|
||||||
|
let res = bank.process_transactions(&transactions);
|
||||||
|
for r in res {
|
||||||
|
assert!(r.is_ok(), "sanity parallel execution");
|
||||||
|
}
|
||||||
|
bank.clear_signatures();
|
||||||
|
let mut verified: Vec<_> = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
||||||
|
let ledger_path = get_tmp_ledger_path!();
|
||||||
|
{
|
||||||
|
let blocktree = Arc::new(
|
||||||
|
Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
||||||
|
);
|
||||||
|
let (exit, poh_recorder, poh_service, signal_receiver) =
|
||||||
|
create_test_recorder(&bank, &blocktree, None);
|
||||||
|
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
||||||
|
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
||||||
|
let banking_stage = BankingStage::new(
|
||||||
|
&cluster_info,
|
||||||
|
&poh_recorder,
|
||||||
|
verified_receiver,
|
||||||
|
vote_receiver,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
poh_recorder.lock().unwrap().set_bank(&bank);
|
||||||
|
|
||||||
|
let chunk_len = verified.len() / CHUNKS;
|
||||||
|
let mut start = 0;
|
||||||
|
|
||||||
|
// This is so that the signal_receiver does not go out of scope after the closure.
|
||||||
|
// If it is dropped before poh_service, then poh_service will error when
|
||||||
|
// calling send() on the channel.
|
||||||
|
let signal_receiver = Arc::new(signal_receiver);
|
||||||
|
let signal_receiver2 = signal_receiver.clone();
|
||||||
|
let mut total = 0;
|
||||||
|
let mut tx_total = 0;
|
||||||
|
let mut txs_processed = 0;
|
||||||
|
let mut root = 1;
|
||||||
|
let collector = Pubkey::new_rand();
|
||||||
|
const ITERS: usize = 1_000;
|
||||||
|
let config = Config {
|
||||||
|
packets_per_batch: PACKETS_PER_BATCH,
|
||||||
|
chunk_len,
|
||||||
|
num_threads,
|
||||||
|
};
|
||||||
|
for _ in 0..ITERS {
|
||||||
|
let now = Instant::now();
|
||||||
|
let mut sent = 0;
|
||||||
|
|
||||||
|
for (i, v) in verified[start..start + chunk_len]
|
||||||
|
.chunks(chunk_len / num_threads)
|
||||||
|
.enumerate()
|
||||||
|
{
|
||||||
|
let mut byte = 0;
|
||||||
|
let index = config.get_transactions_index(start + i);
|
||||||
|
if index < transactions.len() {
|
||||||
|
byte = bytes_as_usize(transactions[index].signatures[0].as_ref());
|
||||||
|
}
|
||||||
|
trace!(
|
||||||
|
"sending... {}..{} {} v.len: {} sig: {} transactions.len: {} index: {}",
|
||||||
|
start + i,
|
||||||
|
start + chunk_len,
|
||||||
|
timestamp(),
|
||||||
|
v.len(),
|
||||||
|
byte,
|
||||||
|
transactions.len(),
|
||||||
|
index,
|
||||||
|
);
|
||||||
|
for xv in v {
|
||||||
|
sent += xv.packets.len();
|
||||||
|
}
|
||||||
|
verified_sender.send(v.to_vec()).unwrap();
|
||||||
|
}
|
||||||
|
let start_tx_index = config.get_transactions_index(start);
|
||||||
|
let end_tx_index = config.get_transactions_index(start + chunk_len);
|
||||||
|
for tx in &transactions[start_tx_index..end_tx_index] {
|
||||||
|
loop {
|
||||||
|
if bank.get_signature_status(&tx.signatures[0]).is_some() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if poh_recorder.lock().unwrap().bank().is_none() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep(Duration::from_millis(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if check_txs(&signal_receiver2, txes / CHUNKS, &poh_recorder) {
|
||||||
|
debug!(
|
||||||
|
"resetting bank {} tx count: {} txs_proc: {}",
|
||||||
|
bank.slot(),
|
||||||
|
bank.transaction_count(),
|
||||||
|
txs_processed
|
||||||
|
);
|
||||||
|
assert!(txs_processed < bank.transaction_count());
|
||||||
|
txs_processed = bank.transaction_count();
|
||||||
|
tx_total += duration_as_us(&now.elapsed());
|
||||||
|
|
||||||
|
let mut poh_time = Measure::start("poh_time");
|
||||||
|
poh_recorder.lock().unwrap().reset(
|
||||||
|
bank.last_blockhash(),
|
||||||
|
bank.slot(),
|
||||||
|
Some((bank.slot(), bank.slot() + 1)),
|
||||||
|
);
|
||||||
|
poh_time.stop();
|
||||||
|
|
||||||
|
let mut new_bank_time = Measure::start("new_bank");
|
||||||
|
let new_bank = Bank::new_from_parent(&bank, &collector, bank.slot() + 1);
|
||||||
|
new_bank_time.stop();
|
||||||
|
|
||||||
|
let mut insert_time = Measure::start("insert_time");
|
||||||
|
bank_forks.insert(new_bank);
|
||||||
|
bank = bank_forks.working_bank();
|
||||||
|
insert_time.stop();
|
||||||
|
|
||||||
|
poh_recorder.lock().unwrap().set_bank(&bank);
|
||||||
|
assert!(poh_recorder.lock().unwrap().bank().is_some());
|
||||||
|
if bank.slot() > 32 {
|
||||||
|
bank_forks.set_root(root, &None);
|
||||||
|
root += 1;
|
||||||
|
}
|
||||||
|
debug!(
|
||||||
|
"new_bank_time: {}us insert_time: {}us poh_time: {}us",
|
||||||
|
new_bank_time.as_us(),
|
||||||
|
insert_time.as_us(),
|
||||||
|
poh_time.as_us(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
tx_total += duration_as_us(&now.elapsed());
|
||||||
|
}
|
||||||
|
|
||||||
|
// This signature clear may not actually clear the signatures
|
||||||
|
// in this chunk, but since we rotate between CHUNKS then
|
||||||
|
// we should clear them by the time we come around again to re-use that chunk.
|
||||||
|
bank.clear_signatures();
|
||||||
|
total += duration_as_us(&now.elapsed());
|
||||||
|
debug!(
|
||||||
|
"time: {} us checked: {} sent: {}",
|
||||||
|
duration_as_us(&now.elapsed()),
|
||||||
|
txes / CHUNKS,
|
||||||
|
sent,
|
||||||
|
);
|
||||||
|
|
||||||
|
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
||||||
|
for tx in transactions.iter_mut() {
|
||||||
|
tx.message.recent_blockhash = bank.last_blockhash();
|
||||||
|
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
||||||
|
tx.signatures[0] = Signature::new(&sig[0..64]);
|
||||||
|
}
|
||||||
|
verified = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
start += chunk_len;
|
||||||
|
start %= verified.len();
|
||||||
|
}
|
||||||
|
eprintln!(
|
||||||
|
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
||||||
|
total / ITERS as u64,
|
||||||
|
);
|
||||||
|
eprintln!(
|
||||||
|
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
||||||
|
tx_total / ITERS as u64,
|
||||||
|
);
|
||||||
|
|
||||||
|
drop(verified_sender);
|
||||||
|
drop(vote_sender);
|
||||||
|
exit.store(true, Ordering::Relaxed);
|
||||||
|
banking_stage.join().unwrap();
|
||||||
|
debug!("waited for banking_stage");
|
||||||
|
poh_service.join().unwrap();
|
||||||
|
sleep(Duration::from_secs(1));
|
||||||
|
debug!("waited for poh_service");
|
||||||
|
}
|
||||||
|
let _unused = Blocktree::destroy(&ledger_path);
|
||||||
|
}
|
1
bench-exchange/.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
/target/
|
/target/
|
||||||
/config/
|
/config/
|
||||||
/config-local/
|
/config-local/
|
||||||
|
/farf/
|
||||||
|
@ -2,38 +2,40 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-exchange"
|
name = "solana-bench-exchange"
|
||||||
version = "0.14.0"
|
version = "0.21.7"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
publish = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bs58 = "0.2.0"
|
bincode = "1.2.0"
|
||||||
|
bs58 = "0.3.0"
|
||||||
clap = "2.32.0"
|
clap = "2.32.0"
|
||||||
bincode = "1.1.2"
|
env_logger = "0.7.1"
|
||||||
env_logger = "0.6.0"
|
itertools = "0.8.2"
|
||||||
itertools = "0.8.0"
|
log = "0.4.8"
|
||||||
log = "0.4.6"
|
num-derive = "0.3"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
num-derive = "0.2"
|
rand = "0.6.5"
|
||||||
rayon = "1.0.3"
|
rayon = "1.2.0"
|
||||||
serde = "1.0.87"
|
serde = "1.0.102"
|
||||||
serde_derive = "1.0.87"
|
serde_derive = "1.0.102"
|
||||||
serde_json = "1.0.38"
|
serde_json = "1.0.41"
|
||||||
# solana-runtime = { path = "../solana/runtime"}
|
serde_yaml = "0.8.11"
|
||||||
solana = { path = "../core", version = "0.14.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "0.21.7" }
|
||||||
solana-client = { path = "../client", version = "0.14.0" }
|
solana-core = { path = "../core", version = "0.21.7" }
|
||||||
solana-drone = { path = "../drone", version = "0.14.0" }
|
solana-genesis = { path = "../genesis", version = "0.21.7" }
|
||||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.14.0" }
|
solana-client = { path = "../client", version = "0.21.7" }
|
||||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.14.0" }
|
solana-drone = { path = "../drone", version = "0.21.7" }
|
||||||
solana-logger = { path = "../logger", version = "0.14.0" }
|
solana-exchange-program = { path = "../programs/exchange", version = "0.21.7" }
|
||||||
solana-metrics = { path = "../metrics", version = "0.14.0" }
|
solana-logger = { path = "../logger", version = "0.21.7" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.14.0" }
|
solana-metrics = { path = "../metrics", version = "0.21.7" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.14.0" }
|
solana-net-utils = { path = "../net-utils", version = "0.21.7" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.14.0" }
|
solana-runtime = { path = "../runtime", version = "0.21.7" }
|
||||||
ws = "0.8.0"
|
solana-sdk = { path = "../sdk", version = "0.21.7" }
|
||||||
untrusted = "0.6.2"
|
untrusted = "0.7.0"
|
||||||
|
ws = "0.9.1"
|
||||||
|
|
||||||
[features]
|
[dev-dependencies]
|
||||||
cuda = ["solana/cuda"]
|
solana-local-cluster = { path = "../local-cluster", version = "0.21.7" }
|
||||||
erasure = []
|
|
||||||
|
@ -6,10 +6,10 @@ learn how to start and interact with the exchange.
|
|||||||
|
|
||||||
### Table of Contents
|
### Table of Contents
|
||||||
[Overview](#Overview)<br>
|
[Overview](#Overview)<br>
|
||||||
[Premiss](#Premiss)<br>
|
[Premise](#Premise)<br>
|
||||||
[Exchange startup](#Exchange-startup)<br>
|
[Exchange startup](#Exchange-startup)<br>
|
||||||
[Trade requests](#Trade-requests)<br>
|
[Order Requests](#Trade-requests)<br>
|
||||||
[Trade cancellations](#Trade-cancellations)<br>
|
[Order Cancellations](#Trade-cancellations)<br>
|
||||||
[Trade swap](#Trade-swap)<br>
|
[Trade swap](#Trade-swap)<br>
|
||||||
[Exchange program operations](#Exchange-program-operations)<br>
|
[Exchange program operations](#Exchange-program-operations)<br>
|
||||||
[Quotes and OHLCV](#Quotes-and-OHLCV)<br>
|
[Quotes and OHLCV](#Quotes-and-OHLCV)<br>
|
||||||
@ -22,9 +22,9 @@ An exchange is a marketplace where one asset can be traded for another. This
|
|||||||
demo demonstrates one way to host an exchange on the Solana blockchain by
|
demo demonstrates one way to host an exchange on the Solana blockchain by
|
||||||
emulating a currency exchange.
|
emulating a currency exchange.
|
||||||
|
|
||||||
The assets are virtual tokens held by investors who may post trade requests to
|
The assets are virtual tokens held by investors who may post order requests to
|
||||||
the exchange. A broker monitors the exchange and posts swap requests for
|
the exchange. A Matcher monitors the exchange and posts swap requests for
|
||||||
matching trade orders. All the transactions can execute concurrently.
|
matching orders. All the transactions can execute concurrently.
|
||||||
|
|
||||||
## Premise
|
## Premise
|
||||||
|
|
||||||
@ -42,92 +42,91 @@ matching trade orders. All the transactions can execute concurrently.
|
|||||||
- A request to create a token account
|
- A request to create a token account
|
||||||
- Token request
|
- Token request
|
||||||
- A request to deposit tokens of a particular type into a token account.
|
- A request to deposit tokens of a particular type into a token account.
|
||||||
- Token pair
|
- Asset pair
|
||||||
- A unique ordered list of two tokens. For the four types of tokens used in
|
- A struct with fields Base and Quote, representing the two assets which make up a
|
||||||
this demo, the valid pairs are AB, AC, AD, BC, BD, CD.
|
trading pair, which themselves are Tokens. The Base or 'primary' asset is the
|
||||||
- Direction of trade
|
numerator and the Quote is the denominator for pricing purposes.
|
||||||
- Describes which token in the pair the investor wants to sell and buy and can
|
- Order side
|
||||||
be either "To" or "From". For example, if an investor issues a "To" trade
|
- Describes which side of the market an investor wants to place a trade on. Options
|
||||||
for "AB" then they which to exchange A tokens to B tokens. A "From" order
|
are "Bid" or "Ask", where a bid represents an offer to purchase the Base asset of
|
||||||
would read the other way, A tokens from B tokens.
|
the AssetPair for a sum of the Quote Asset and an Ask is an offer to sell Base asset
|
||||||
|
for the Quote asset.
|
||||||
- Price ratio
|
- Price ratio
|
||||||
- An expression of the relative prices of two tokens. They consist of the
|
- An expression of the relative prices of two tokens. Calculated with the Base
|
||||||
price of the primary token and the price of the secondary token. For
|
Asset as the numerator and the Quote Asset as the denominator. Ratios are
|
||||||
simplicity sake, the primary token's price is always 1, which forces the
|
represented as fixed point numbers. The fixed point scaler is defined in
|
||||||
secondary to be the common denominator. For example, if token A was worth
|
|
||||||
2 and token B was worth 6, the price ratio would be 1:3 or just 3. Price
|
|
||||||
ratios are represented as fixed point numbers. The fixed point scaler is
|
|
||||||
defined in
|
|
||||||
[exchange_state.rs](https://github.com/solana-labs/solana/blob/c2fdd1362a029dcf89c8907c562d2079d977df11/programs/exchange_api/src/exchange_state.rs#L7)
|
[exchange_state.rs](https://github.com/solana-labs/solana/blob/c2fdd1362a029dcf89c8907c562d2079d977df11/programs/exchange_api/src/exchange_state.rs#L7)
|
||||||
- Trade request
|
- Order request
|
||||||
- A Solana transaction executed by the exchange requesting the trade of one
|
- A Solana transaction sent by a trader to the exchange to submit an order.
|
||||||
type of token for another. Trade requests are made up of the token pair,
|
Order requests are made up of the token pair, the order side (bid or ask),
|
||||||
the direction of the trade, quantity of the primary token, the price ratio,
|
quantity of the primary token, the price ratio, and the two token accounts
|
||||||
and the two token accounts to be credited/deducted. An example trade
|
to be credited/deducted. An example trade request looks like "T AB 5 2"
|
||||||
request looks like "T AB 5 2" which reads "Exchange 5 A tokens to B tokens
|
which reads "Exchange 5 A tokens to B tokens at a price ratio of 1:2" A fulfilled trade would result in 5 A tokens
|
||||||
at a price ratio of 1:2" A fulfilled trade would result in 5 A tokens
|
|
||||||
deducted and 10 B tokens credited to the trade initiator's token accounts.
|
deducted and 10 B tokens credited to the trade initiator's token accounts.
|
||||||
Successful trade requests result in a trade order.
|
Successful order requests result in an order.
|
||||||
- Trade order
|
- Order
|
||||||
- The result of a successful trade request. Trade orders are stored in
|
- The result of a successful order request. orders are stored in
|
||||||
accounts owned by the submitter of the trade request. They can only be
|
accounts owned by the submitter of the order request. They can only be
|
||||||
canceled by their owner but can be used by anyone in a trade swap. They
|
canceled by their owner but can be used by anyone in a trade swap. They
|
||||||
contain the same information as the trade request.
|
contain the same information as the order request.
|
||||||
- Price spread
|
- Price spread
|
||||||
- The difference between the two matching trade orders. The spread is the
|
- The difference between the two matching orders. The spread is the
|
||||||
profit of the broker initiating the swap request.
|
profit of the Matcher initiating the swap request.
|
||||||
- Swap requirements
|
- Match requirements
|
||||||
- Policies that result in a successful trade swap.
|
- Policies that result in a successful trade swap.
|
||||||
- Swap request
|
- Match request
|
||||||
- A request to exchange tokens between to trade orders
|
- A request to fill two complementary orders (bid/ask), resulting if successful,
|
||||||
- Trade swap
|
in a trade being created.
|
||||||
- A successful trade. A swap consists of two matching trade orders that meet
|
- Trade
|
||||||
swap requirements. A trade swap may not wholly satisfy one or both of the
|
- A successful trade is created from two matching orders that meet
|
||||||
trade orders in which case the trade orders are adjusted appropriately. As
|
swap requirements which are submitted in a Match Request by a Matcher and
|
||||||
long as the swap requirements are met there will be an exchange of tokens
|
executed by the exchange. A trade may not wholly satisfy one or both of the
|
||||||
between accounts. Any price spread is deposited into the broker's profit
|
orders in which case the orders are adjusted appropriately. Upon execution,
|
||||||
account. All trade swaps are recorded in a new account for posterity.
|
tokens are distributed to the traders' accounts and any overlap or
|
||||||
|
"negative spread" between orders is deposited into the Matcher's profit
|
||||||
|
account. All successful trades are recorded in the data of a new solana
|
||||||
|
account for posterity.
|
||||||
- Investor
|
- Investor
|
||||||
- Individual investors who hold a number of tokens and wish to trade them on
|
- Individual investors who hold a number of tokens and wish to trade them on
|
||||||
the exchange. Investors operate as Solana thin clients who own a set of
|
the exchange. Investors operate as Solana thin clients who own a set of
|
||||||
accounts containing tokens and/or trade requests. Investors post
|
accounts containing tokens and/or order requests. Investors post
|
||||||
transactions to the exchange in order to request tokens and post or cancel
|
transactions to the exchange in order to request tokens and post or cancel
|
||||||
trade requests.
|
order requests.
|
||||||
- Broker
|
- Matcher
|
||||||
- An agent who facilitates trading between investors. Brokers operate as
|
- An agent who facilitates trading between investors. Matchers operate as
|
||||||
Solana thin clients who monitor all the trade orders looking for a trade
|
Solana thin clients who monitor all the orders looking for a trade
|
||||||
match. Once found, the broker issues a swap request to the exchange.
|
match. Once found, the Matcher issues a swap request to the exchange.
|
||||||
Brokers are the engine of the exchange and are rewarded for their efforts by
|
Matchers are the engine of the exchange and are rewarded for their efforts by
|
||||||
accumulating the price spreads of the swaps they initiate. Brokers also
|
accumulating the price spreads of the swaps they initiate. Matchers also
|
||||||
provide current bid/ask price and OHLCV (Open, High, Low, Close, Volume)
|
provide current bid/ask price and OHLCV (Open, High, Low, Close, Volume)
|
||||||
information on demand via a public network port.
|
information on demand via a public network port.
|
||||||
- Transaction fees
|
- Transaction fees
|
||||||
- Solana transaction fees are paid for by the transaction submitters who are
|
- Solana transaction fees are paid for by the transaction submitters who are
|
||||||
the Investors and Brokers.
|
the Investors and Matchers.
|
||||||
|
|
||||||
## Exchange startup
|
## Exchange startup
|
||||||
|
|
||||||
The exchange is up and running when it reaches a state where it can take
|
The exchange is up and running when it reaches a state where it can take
|
||||||
investor's trades and broker's swap requests. To achieve this state the
|
investors' trades and Matchers' match requests. To achieve this state the
|
||||||
following must occur in order:
|
following must occur in order:
|
||||||
|
|
||||||
- Start the Solana blockchain
|
- Start the Solana blockchain
|
||||||
- Start the broker thin-client
|
- Start the thin-client
|
||||||
- The broker subscribes to change notifications for all the accounts owned by
|
- The Matcher subscribes to change notifications for all the accounts owned by
|
||||||
the exchange program id. The subscription is managed via Solana's JSON RPC
|
the exchange program id. The subscription is managed via Solana's JSON RPC
|
||||||
interface.
|
interface.
|
||||||
- The broker starts responding to queries for bid/ask price and OHLCV
|
- The Matcher starts responding to queries for bid/ask price and OHLCV
|
||||||
|
|
||||||
The broker responding successfully to price and OHLCV requests is the signal to
|
The Matcher responding successfully to price and OHLCV requests is the signal to
|
||||||
the investors that trades submitted after that point will be analyzed. <!--This
|
the investors that trades submitted after that point will be analyzed. <!--This
|
||||||
is not ideal, and instead investors should be able to submit trades at any time,
|
is not ideal, and instead investors should be able to submit trades at any time,
|
||||||
and the broker could come and go without missing a trade. One way to achieve
|
and the Matcher could come and go without missing a trade. One way to achieve
|
||||||
this is for the broker to read the current state of all accounts looking for all
|
this is for the Matcher to read the current state of all accounts looking for all
|
||||||
open trade orders.-->
|
open orders.-->
|
||||||
|
|
||||||
Investors will initially query the exchange to discover their current balance
|
Investors will initially query the exchange to discover their current balance
|
||||||
for each type of token. If the investor does not already have an account for
|
for each type of token. If the investor does not already have an account for
|
||||||
each type of token, they will submit account requests. Brokers as well will
|
each type of token, they will submit account requests. Matcher as well will
|
||||||
request accounts to hold the tokens they earn by initiating trade swaps.
|
request accounts to hold the tokens they earn by initiating trade swaps.
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
@ -165,7 +164,7 @@ pub struct TokenAccountInfo {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
For this demo investors or brokers can request more tokens from the exchange at
|
For this demo investors or Matcher can request more tokens from the exchange at
|
||||||
any time by submitting token requests. In non-demos, an exchange of this type
|
any time by submitting token requests. In non-demos, an exchange of this type
|
||||||
would provide another way to exchange a 3rd party asset into tokens.
|
would provide another way to exchange a 3rd party asset into tokens.
|
||||||
|
|
||||||
@ -181,19 +180,19 @@ pub enum ExchangeInstruction {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Trade requests
|
## Order Requests
|
||||||
|
|
||||||
When an investor decides to exchange a token of one type for another, they
|
When an investor decides to exchange a token of one type for another, they
|
||||||
submit a transaction to the Solana Blockchain containing a trade request, which,
|
submit a transaction to the Solana Blockchain containing an order request, which,
|
||||||
if successful, is turned into a trade order. Trade orders do not expire but are
|
if successful, is turned into an order. orders do not expire but are
|
||||||
cancellable. <!-- Trade orders should have a timestamp to enable trade
|
cancellable. <!-- orders should have a timestamp to enable trade
|
||||||
expiration --> When a trade order is created, tokens are deducted from a token
|
expiration --> When an order is created, tokens are deducted from a token
|
||||||
account and the trade order acts as an escrow. The tokens are held until the
|
account and the order acts as an escrow. The tokens are held until the
|
||||||
trade order is fulfilled or canceled. If the direction is `To`, then the number
|
order is fulfilled or canceled. If the direction is `To`, then the number
|
||||||
of `tokens` are deducted from the primary account, if `From` then `tokens`
|
of `tokens` are deducted from the primary account, if `From` then `tokens`
|
||||||
multiplied by `price` are deducted from the secondary account. Trade orders are
|
multiplied by `price` are deducted from the secondary account. orders are
|
||||||
no longer valid when the number of `tokens` goes to zero, at which point they
|
no longer valid when the number of `tokens` goes to zero, at which point they
|
||||||
can no longer be used. <!-- Could support refilling trade orders, so trade order
|
can no longer be used. <!-- Could support refilling orders, so order
|
||||||
accounts are refilled rather than accumulating -->
|
accounts are refilled rather than accumulating -->
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
@ -205,7 +204,7 @@ pub enum Direction {
|
|||||||
From,
|
From,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TradeRequestInfo {
|
pub struct OrderRequestInfo {
|
||||||
/// Direction of trade
|
/// Direction of trade
|
||||||
pub direction: Direction,
|
pub direction: Direction,
|
||||||
|
|
||||||
@ -224,7 +223,7 @@ pub struct TradeRequestInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub enum ExchangeInstruction {
|
pub enum ExchangeInstruction {
|
||||||
/// Trade request
|
/// order request
|
||||||
/// key 0 - Signer
|
/// key 0 - Signer
|
||||||
/// key 1 - Account in which to record the swap
|
/// key 1 - Account in which to record the swap
|
||||||
/// key 2 - Token account associated with this trade
|
/// key 2 - Token account associated with this trade
|
||||||
@ -233,7 +232,7 @@ pub enum ExchangeInstruction {
|
|||||||
|
|
||||||
/// Trade accounts are populated with this structure
|
/// Trade accounts are populated with this structure
|
||||||
pub struct TradeOrderInfo {
|
pub struct TradeOrderInfo {
|
||||||
/// Owner of the trade order
|
/// Owner of the order
|
||||||
pub owner: Pubkey,
|
pub owner: Pubkey,
|
||||||
/// Direction of the exchange
|
/// Direction of the exchange
|
||||||
pub direction: Direction,
|
pub direction: Direction,
|
||||||
@ -252,7 +251,7 @@ pub struct TradeOrderInfo {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Trade cancellations
|
## Order cancellations
|
||||||
|
|
||||||
An investor may cancel a trade at anytime, but only trades they own. If the
|
An investor may cancel a trade at anytime, but only trades they own. If the
|
||||||
cancellation is successful, any tokens held in escrow are returned to the
|
cancellation is successful, any tokens held in escrow are returned to the
|
||||||
@ -260,24 +259,24 @@ account from which they came.
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
pub enum ExchangeInstruction {
|
pub enum ExchangeInstruction {
|
||||||
/// Trade cancellation
|
/// order cancellation
|
||||||
/// key 0 - Signer
|
/// key 0 - Signer
|
||||||
/// key 1 -Trade order to cancel
|
/// key 1 -order to cancel
|
||||||
TradeCancellation,
|
TradeCancellation,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Trade swaps
|
## Trade swaps
|
||||||
|
|
||||||
The broker is monitoring the accounts assigned to the exchange program and
|
The Matcher is monitoring the accounts assigned to the exchange program and
|
||||||
building a trade-order table. The trade order table is used to identify
|
building a trade-order table. The order table is used to identify
|
||||||
matching trade orders which could be fulfilled. When a match is found the
|
matching orders which could be fulfilled. When a match is found the
|
||||||
broker should issue a swap request. Swap requests may not satisfy the entirety
|
Matcher should issue a swap request. Swap requests may not satisfy the entirety
|
||||||
of either order, but the exchange will greedily fulfill it. Any leftover tokens
|
of either order, but the exchange will greedily fulfill it. Any leftover tokens
|
||||||
in either account will keep the trade order valid for further swap requests in
|
in either account will keep the order valid for further swap requests in
|
||||||
the future.
|
the future.
|
||||||
|
|
||||||
Matching trade orders are defined by the following swap requirements:
|
Matching orders are defined by the following swap requirements:
|
||||||
|
|
||||||
- Opposite polarity (one `To` and one `From`)
|
- Opposite polarity (one `To` and one `From`)
|
||||||
- Operate on the same token pair
|
- Operate on the same token pair
|
||||||
@ -310,14 +309,14 @@ whole for clarity.
|
|||||||
| 5 | 1 T AB 2 10 | 2 F AB 1 5 |
|
| 5 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||||
|
|
||||||
As part of a successful swap request, the exchange will credit tokens to the
|
As part of a successful swap request, the exchange will credit tokens to the
|
||||||
broker's account equal to the difference in the price ratios or the two orders.
|
Matcher's account equal to the difference in the price ratios or the two orders.
|
||||||
These tokens are considered the broker's profit for initiating the trade.
|
These tokens are considered the Matcher's profit for initiating the trade.
|
||||||
|
|
||||||
The broker would initiate the following swap on the order table above:
|
The Matcher would initiate the following swap on the order table above:
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 2 A tokens to 8 B tokens
|
- Row 1, To: Investor 1 trades 2 A tokens to 8 B tokens
|
||||||
- Row 1, From: Investor 2 trades 2 A tokens from 8 B tokens
|
- Row 1, From: Investor 2 trades 2 A tokens from 8 B tokens
|
||||||
- Broker takes 8 B tokens as profit
|
- Matcher takes 8 B tokens as profit
|
||||||
|
|
||||||
Both row 1 trades are fully realized, table becomes:
|
Both row 1 trades are fully realized, table becomes:
|
||||||
|
|
||||||
@ -328,11 +327,11 @@ Both row 1 trades are fully realized, table becomes:
|
|||||||
| 3 | 1 T AB 2 8 | 2 F AB 3 6 |
|
| 3 | 1 T AB 2 8 | 2 F AB 3 6 |
|
||||||
| 4 | 1 T AB 2 10 | 2 F AB 1 5 |
|
| 4 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||||
|
|
||||||
The broker would initiate the following swap:
|
The Matcher would initiate the following swap:
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 1 A token to 4 B tokens
|
- Row 1, To: Investor 1 trades 1 A token to 4 B tokens
|
||||||
- Row 1, From: Investor 2 trades 1 A token from 4 B tokens
|
- Row 1, From: Investor 2 trades 1 A token from 4 B tokens
|
||||||
- Broker takes 4 B tokens as profit
|
- Matcher takes 4 B tokens as profit
|
||||||
|
|
||||||
Row 1 From is not fully realized, table becomes:
|
Row 1 From is not fully realized, table becomes:
|
||||||
|
|
||||||
@ -343,11 +342,11 @@ Row 1 From is not fully realized, table becomes:
|
|||||||
| 3 | 1 T AB 2 10 | 2 F AB 3 6 |
|
| 3 | 1 T AB 2 10 | 2 F AB 3 6 |
|
||||||
| 4 | | 2 F AB 1 5 |
|
| 4 | | 2 F AB 1 5 |
|
||||||
|
|
||||||
The broker would initiate the following swap:
|
The Matcher would initiate the following swap:
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 1 A token to 6 B tokens
|
- Row 1, To: Investor 1 trades 1 A token to 6 B tokens
|
||||||
- Row 1, From: Investor 2 trades 1 A token from 6 B tokens
|
- Row 1, From: Investor 2 trades 1 A token from 6 B tokens
|
||||||
- Broker takes 2 B tokens as profit
|
- Matcher takes 2 B tokens as profit
|
||||||
|
|
||||||
Row 1 To is now fully realized, table becomes:
|
Row 1 To is now fully realized, table becomes:
|
||||||
|
|
||||||
@ -357,11 +356,11 @@ Row 1 To is now fully realized, table becomes:
|
|||||||
| 2 | 1 T AB 2 8 | 2 F AB 3 5 |
|
| 2 | 1 T AB 2 8 | 2 F AB 3 5 |
|
||||||
| 3 | 1 T AB 2 10 | 2 F AB 1 5 |
|
| 3 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||||
|
|
||||||
The broker would initiate the following last swap:
|
The Matcher would initiate the following last swap:
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 2 A token to 12 B tokens
|
- Row 1, To: Investor 1 trades 2 A token to 12 B tokens
|
||||||
- Row 1, From: Investor 2 trades 2 A token from 12 B tokens
|
- Row 1, From: Investor 2 trades 2 A token from 12 B tokens
|
||||||
- Broker takes 4 B tokens as profit
|
- Matcher takes 2 B tokens as profit
|
||||||
|
|
||||||
Table becomes:
|
Table becomes:
|
||||||
|
|
||||||
@ -379,11 +378,11 @@ pub enum ExchangeInstruction {
|
|||||||
/// Trade swap request
|
/// Trade swap request
|
||||||
/// key 0 - Signer
|
/// key 0 - Signer
|
||||||
/// key 1 - Account in which to record the swap
|
/// key 1 - Account in which to record the swap
|
||||||
/// key 2 - 'To' trade order
|
/// key 2 - 'To' order
|
||||||
/// key 3 - `From` trade order
|
/// key 3 - `From` order
|
||||||
/// key 4 - Token account associated with the To Trade
|
/// key 4 - Token account associated with the To Trade
|
||||||
/// key 5 - Token account associated with From trade
|
/// key 5 - Token account associated with From trade
|
||||||
/// key 6 - Token account in which to deposit the brokers profit from the swap.
|
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
||||||
SwapRequest,
|
SwapRequest,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,9 +390,9 @@ pub enum ExchangeInstruction {
|
|||||||
pub struct TradeSwapInfo {
|
pub struct TradeSwapInfo {
|
||||||
/// Pair swapped
|
/// Pair swapped
|
||||||
pub pair: TokenPair,
|
pub pair: TokenPair,
|
||||||
/// `To` trade order
|
/// `To` order
|
||||||
pub to_trade_order: Pubkey,
|
pub to_trade_order: Pubkey,
|
||||||
/// `From` trade order
|
/// `From` order
|
||||||
pub from_trade_order: Pubkey,
|
pub from_trade_order: Pubkey,
|
||||||
/// Number of primary tokens exchanged
|
/// Number of primary tokens exchanged
|
||||||
pub primary_tokens: u64,
|
pub primary_tokens: u64,
|
||||||
@ -424,32 +423,32 @@ pub enum ExchangeInstruction {
|
|||||||
/// the exchange has a limitless number of tokens it can transfer.
|
/// the exchange has a limitless number of tokens it can transfer.
|
||||||
TransferRequest(Token, u64),
|
TransferRequest(Token, u64),
|
||||||
|
|
||||||
/// Trade request
|
/// order request
|
||||||
/// key 0 - Signer
|
/// key 0 - Signer
|
||||||
/// key 1 - Account in which to record the swap
|
/// key 1 - Account in which to record the swap
|
||||||
/// key 2 - Token account associated with this trade
|
/// key 2 - Token account associated with this trade
|
||||||
TradeRequest(TradeRequestInfo),
|
TradeRequest(TradeRequestInfo),
|
||||||
|
|
||||||
/// Trade cancellation
|
/// order cancellation
|
||||||
/// key 0 - Signer
|
/// key 0 - Signer
|
||||||
/// key 1 -Trade order to cancel
|
/// key 1 -order to cancel
|
||||||
TradeCancellation,
|
TradeCancellation,
|
||||||
|
|
||||||
/// Trade swap request
|
/// Trade swap request
|
||||||
/// key 0 - Signer
|
/// key 0 - Signer
|
||||||
/// key 1 - Account in which to record the swap
|
/// key 1 - Account in which to record the swap
|
||||||
/// key 2 - 'To' trade order
|
/// key 2 - 'To' order
|
||||||
/// key 3 - `From` trade order
|
/// key 3 - `From` order
|
||||||
/// key 4 - Token account associated with the To Trade
|
/// key 4 - Token account associated with the To Trade
|
||||||
/// key 5 - Token account associated with From trade
|
/// key 5 - Token account associated with From trade
|
||||||
/// key 6 - Token account in which to deposit the brokers profit from the swap.
|
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
||||||
SwapRequest,
|
SwapRequest,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Quotes and OHLCV
|
## Quotes and OHLCV
|
||||||
|
|
||||||
The broker will provide current bid/ask price quotes based on trade actively and
|
The Matcher will provide current bid/ask price quotes based on trade actively and
|
||||||
also provide OHLCV based on some time window. The details of how the bid/ask
|
also provide OHLCV based on some time window. The details of how the bid/ask
|
||||||
price quotes are calculated are yet to be decided.
|
price quotes are calculated are yet to be decided.
|
||||||
|
|
||||||
@ -478,6 +477,3 @@ To also see the cluster messages:
|
|||||||
```bash
|
```bash
|
||||||
$ RUST_LOG=solana_bench_exchange=info,solana=info cargo test --release -- --nocapture test_exchange_local_cluster
|
$ RUST_LOG=solana_bench_exchange=info,solana=info cargo test --release -- --nocapture test_exchange_local_cluster
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
|
use clap::{crate_description, crate_name, value_t, App, Arg, ArgMatches};
|
||||||
|
use solana_core::gen_keys::GenKeys;
|
||||||
|
use solana_drone::drone::DRONE_PORT;
|
||||||
|
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
|
use std::process::exit;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use clap::{crate_description, crate_name, crate_version, value_t, App, Arg, ArgMatches};
|
|
||||||
use solana::gen_keys::GenKeys;
|
|
||||||
use solana_drone::drone::DRONE_PORT;
|
|
||||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
|
||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub network_addr: SocketAddr,
|
pub entrypoint_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub drone_addr: SocketAddr,
|
||||||
pub identity: Keypair,
|
pub identity: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
@ -18,12 +18,15 @@ pub struct Config {
|
|||||||
pub batch_size: usize,
|
pub batch_size: usize,
|
||||||
pub chunk_size: usize,
|
pub chunk_size: usize,
|
||||||
pub account_groups: usize,
|
pub account_groups: usize,
|
||||||
|
pub client_ids_and_stake_file: String,
|
||||||
|
pub write_to_client_file: bool,
|
||||||
|
pub read_from_client_file: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Config {
|
impl Default for Config {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
network_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
||||||
identity: Keypair::new(),
|
identity: Keypair::new(),
|
||||||
num_nodes: 1,
|
num_nodes: 1,
|
||||||
@ -34,23 +37,26 @@ impl Default for Config {
|
|||||||
batch_size: 100,
|
batch_size: 100,
|
||||||
chunk_size: 100,
|
chunk_size: 100,
|
||||||
account_groups: 100,
|
account_groups: 100,
|
||||||
|
client_ids_and_stake_file: String::new(),
|
||||||
|
write_to_client_file: false,
|
||||||
|
read_from_client_file: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
||||||
App::new(crate_name!())
|
App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(version)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("network")
|
Arg::with_name("entrypoint")
|
||||||
.short("n")
|
.short("n")
|
||||||
.long("network")
|
.long("entrypoint")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(false)
|
.required(false)
|
||||||
.default_value("127.0.0.1:8001")
|
.default_value("127.0.0.1:8001")
|
||||||
.help("Network's gossip entry point; defaults to 127.0.0.1:8001"),
|
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("drone")
|
||||||
@ -141,24 +147,41 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.default_value("10")
|
.default_value("10")
|
||||||
.help("Number of account groups to cycle for each batch"),
|
.help("Number of account groups to cycle for each batch"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("write-client-keys")
|
||||||
|
.long("write-client-keys")
|
||||||
|
.value_name("FILENAME")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Generate client keys and stakes and write the list to YAML file"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("read-client-keys")
|
||||||
|
.long("read-client-keys")
|
||||||
|
.value_name("FILENAME")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Read client keys and stakes from the YAML file"),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||||
let mut args = Config::default();
|
let mut args = Config::default();
|
||||||
|
|
||||||
args.network_addr = matches
|
args.entrypoint_addr = solana_net_utils::parse_host_port(
|
||||||
.value_of("network")
|
matches.value_of("entrypoint").unwrap(),
|
||||||
.unwrap()
|
)
|
||||||
.parse()
|
.unwrap_or_else(|e| {
|
||||||
.expect("Failed to parse network");
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
args.drone_addr = matches
|
exit(1)
|
||||||
.value_of("drone")
|
});
|
||||||
.unwrap()
|
|
||||||
.parse()
|
args.drone_addr = solana_net_utils::parse_host_port(matches.value_of("drone").unwrap())
|
||||||
.expect("Failed to parse drone address");
|
.unwrap_or_else(|e| {
|
||||||
|
eprintln!("failed to parse drone address: {}", e);
|
||||||
|
exit(1)
|
||||||
|
});
|
||||||
|
|
||||||
if matches.is_present("identity") {
|
if matches.is_present("identity") {
|
||||||
args.identity = read_keypair(matches.value_of("identity").unwrap())
|
args.identity = read_keypair_file(matches.value_of("identity").unwrap())
|
||||||
.expect("can't read client identity");
|
.expect("can't read client identity");
|
||||||
} else {
|
} else {
|
||||||
args.identity = {
|
args.identity = {
|
||||||
@ -183,5 +206,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
args.account_groups = value_t!(matches.value_of("account-groups"), usize)
|
args.account_groups = value_t!(matches.value_of("account-groups"), usize)
|
||||||
.expect("Failed to parse account-groups");
|
.expect("Failed to parse account-groups");
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("write-client-keys") {
|
||||||
|
args.write_to_client_file = true;
|
||||||
|
args.client_ids_and_stake_file = s.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("read-client-keys") {
|
||||||
|
assert!(!args.write_to_client_file);
|
||||||
|
args.read_from_client_file = true;
|
||||||
|
args.client_ids_and_stake_file = s.to_string();
|
||||||
|
}
|
||||||
args
|
args
|
||||||
}
|
}
|
||||||
|
3
bench-exchange/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod bench;
|
||||||
|
pub mod cli;
|
||||||
|
mod order_book;
|
@ -2,20 +2,20 @@ pub mod bench;
|
|||||||
mod cli;
|
mod cli;
|
||||||
pub mod order_book;
|
pub mod order_book;
|
||||||
|
|
||||||
use crate::bench::{airdrop_lamports, do_bench_exchange, get_clients, Config};
|
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana::gossip_service::discover_nodes;
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
use solana_sdk::signature::KeypairUtil;
|
use solana_sdk::signature::KeypairUtil;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
solana_metrics::set_panic_hook("bench-exchange");
|
solana_metrics::set_panic_hook("bench-exchange");
|
||||||
|
|
||||||
let matches = cli::build_args().get_matches();
|
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cli::Config {
|
let cli::Config {
|
||||||
network_addr,
|
entrypoint_addr,
|
||||||
drone_addr,
|
drone_addr,
|
||||||
identity,
|
identity,
|
||||||
threads,
|
threads,
|
||||||
@ -26,32 +26,12 @@ fn main() {
|
|||||||
batch_size,
|
batch_size,
|
||||||
chunk_size,
|
chunk_size,
|
||||||
account_groups,
|
account_groups,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
write_to_client_file,
|
||||||
|
read_from_client_file,
|
||||||
..
|
..
|
||||||
} = cli_config;
|
} = cli_config;
|
||||||
|
|
||||||
info!("Connecting to the cluster");
|
|
||||||
let nodes = discover_nodes(&network_addr, num_nodes).unwrap_or_else(|_| {
|
|
||||||
panic!("Failed to discover nodes");
|
|
||||||
});
|
|
||||||
|
|
||||||
let clients = get_clients(&nodes);
|
|
||||||
|
|
||||||
info!("{} nodes found", clients.len());
|
|
||||||
if clients.len() < num_nodes {
|
|
||||||
panic!("Error: Insufficient nodes discovered");
|
|
||||||
}
|
|
||||||
|
|
||||||
info!("Funding keypair: {}", identity.pubkey());
|
|
||||||
|
|
||||||
let accounts_in_groups = batch_size * account_groups;
|
|
||||||
const NUM_SIGNERS: u64 = 2;
|
|
||||||
airdrop_lamports(
|
|
||||||
&clients[0],
|
|
||||||
&drone_addr,
|
|
||||||
&identity,
|
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
|
||||||
);
|
|
||||||
|
|
||||||
let config = Config {
|
let config = Config {
|
||||||
identity,
|
identity,
|
||||||
threads,
|
threads,
|
||||||
@ -61,7 +41,43 @@ fn main() {
|
|||||||
batch_size,
|
batch_size,
|
||||||
chunk_size,
|
chunk_size,
|
||||||
account_groups,
|
account_groups,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
read_from_client_file,
|
||||||
};
|
};
|
||||||
|
|
||||||
do_bench_exchange(clients, config);
|
if write_to_client_file {
|
||||||
|
create_client_accounts_file(
|
||||||
|
&config.client_ids_and_stake_file,
|
||||||
|
config.batch_size,
|
||||||
|
config.account_groups,
|
||||||
|
config.fund_amount,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
info!("Connecting to the cluster");
|
||||||
|
let (nodes, _archivers) =
|
||||||
|
discover_cluster(&entrypoint_addr, num_nodes).unwrap_or_else(|_| {
|
||||||
|
panic!("Failed to discover nodes");
|
||||||
|
});
|
||||||
|
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
|
||||||
|
info!("{} nodes found", num_clients);
|
||||||
|
if num_clients < num_nodes {
|
||||||
|
panic!("Error: Insufficient nodes discovered");
|
||||||
|
}
|
||||||
|
|
||||||
|
if !read_from_client_file {
|
||||||
|
info!("Funding keypair: {}", config.identity.pubkey());
|
||||||
|
|
||||||
|
let accounts_in_groups = batch_size * account_groups;
|
||||||
|
const NUM_SIGNERS: u64 = 2;
|
||||||
|
airdrop_lamports(
|
||||||
|
&client,
|
||||||
|
&drone_addr,
|
||||||
|
&config.identity,
|
||||||
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
do_bench_exchange(vec![client], config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use itertools::EitherOrBoth::{Both, Left, Right};
|
use itertools::EitherOrBoth::{Both, Left, Right};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana_exchange_api::exchange_state::*;
|
use solana_exchange_program::exchange_state::*;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::BinaryHeap;
|
use std::collections::BinaryHeap;
|
||||||
@ -10,7 +10,7 @@ use std::{error, fmt};
|
|||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct ToOrder {
|
pub struct ToOrder {
|
||||||
pub pubkey: Pubkey,
|
pub pubkey: Pubkey,
|
||||||
pub info: TradeOrderInfo,
|
pub info: OrderInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ord for ToOrder {
|
impl Ord for ToOrder {
|
||||||
@ -26,7 +26,7 @@ impl PartialOrd for ToOrder {
|
|||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct FromOrder {
|
pub struct FromOrder {
|
||||||
pub pubkey: Pubkey,
|
pub pubkey: Pubkey,
|
||||||
pub info: TradeOrderInfo,
|
pub info: OrderInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ord for FromOrder {
|
impl Ord for FromOrder {
|
||||||
@ -95,17 +95,13 @@ impl OrderBook {
|
|||||||
// pub fn cancel(&mut self, pubkey: Pubkey) -> Result<(), Box<dyn error::Error>> {
|
// pub fn cancel(&mut self, pubkey: Pubkey) -> Result<(), Box<dyn error::Error>> {
|
||||||
// Ok(())
|
// Ok(())
|
||||||
// }
|
// }
|
||||||
pub fn push(
|
pub fn push(&mut self, pubkey: Pubkey, info: OrderInfo) -> Result<(), Box<dyn error::Error>> {
|
||||||
&mut self,
|
check_trade(info.side, info.tokens, info.price)?;
|
||||||
pubkey: Pubkey,
|
match info.side {
|
||||||
info: TradeOrderInfo,
|
OrderSide::Ask => {
|
||||||
) -> Result<(), Box<dyn error::Error>> {
|
|
||||||
check_trade(info.direction, info.tokens, info.price)?;
|
|
||||||
match info.direction {
|
|
||||||
Direction::To => {
|
|
||||||
self.to_ab.push(ToOrder { pubkey, info });
|
self.to_ab.push(ToOrder { pubkey, info });
|
||||||
}
|
}
|
||||||
Direction::From => {
|
OrderSide::Bid => {
|
||||||
self.from_ab.push(FromOrder { pubkey, info });
|
self.from_ab.push(FromOrder { pubkey, info });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
102
bench-exchange/tests/bench_exchange.rs
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
use log::*;
|
||||||
|
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
||||||
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
|
use solana_core::validator::ValidatorConfig;
|
||||||
|
use solana_drone::drone::run_local_drone;
|
||||||
|
use solana_exchange_program::exchange_processor::process_instruction;
|
||||||
|
use solana_exchange_program::id;
|
||||||
|
use solana_exchange_program::solana_exchange_program;
|
||||||
|
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_runtime::bank_client::BankClient;
|
||||||
|
use solana_sdk::genesis_config::create_genesis_config;
|
||||||
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
use std::process::exit;
|
||||||
|
use std::sync::mpsc::channel;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_exchange_local_cluster() {
|
||||||
|
solana_logger::setup();
|
||||||
|
|
||||||
|
const NUM_NODES: usize = 1;
|
||||||
|
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.identity = Keypair::new();
|
||||||
|
config.duration = Duration::from_secs(1);
|
||||||
|
config.fund_amount = 100_000;
|
||||||
|
config.threads = 1;
|
||||||
|
config.transfer_delay = 20; // 15
|
||||||
|
config.batch_size = 100; // 1000;
|
||||||
|
config.chunk_size = 10; // 200;
|
||||||
|
config.account_groups = 1; // 10;
|
||||||
|
let Config {
|
||||||
|
fund_amount,
|
||||||
|
batch_size,
|
||||||
|
account_groups,
|
||||||
|
..
|
||||||
|
} = config;
|
||||||
|
let accounts_in_groups = batch_size * account_groups;
|
||||||
|
|
||||||
|
let cluster = LocalCluster::new(&ClusterConfig {
|
||||||
|
node_stakes: vec![100_000; NUM_NODES],
|
||||||
|
cluster_lamports: 100_000_000_000_000,
|
||||||
|
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
||||||
|
native_instruction_processors: [solana_exchange_program!()].to_vec(),
|
||||||
|
..ClusterConfig::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
let drone_keypair = Keypair::new();
|
||||||
|
cluster.transfer(
|
||||||
|
&cluster.funding_keypair,
|
||||||
|
&drone_keypair.pubkey(),
|
||||||
|
2_000_000_000_000,
|
||||||
|
);
|
||||||
|
|
||||||
|
let (addr_sender, addr_receiver) = channel();
|
||||||
|
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
||||||
|
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
|
info!("Connecting to the cluster");
|
||||||
|
let (nodes, _) =
|
||||||
|
discover_cluster(&cluster.entry_point_info.gossip, NUM_NODES).unwrap_or_else(|err| {
|
||||||
|
error!("Failed to discover {} nodes: {:?}", NUM_NODES, err);
|
||||||
|
exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
|
||||||
|
info!("clients: {}", num_clients);
|
||||||
|
assert!(num_clients >= NUM_NODES);
|
||||||
|
|
||||||
|
const NUM_SIGNERS: u64 = 2;
|
||||||
|
airdrop_lamports(
|
||||||
|
&client,
|
||||||
|
&drone_addr,
|
||||||
|
&config.identity,
|
||||||
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
|
);
|
||||||
|
|
||||||
|
do_bench_exchange(vec![client], config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_exchange_bank_client() {
|
||||||
|
solana_logger::setup();
|
||||||
|
let (genesis_config, identity) = create_genesis_config(100_000_000_000_000);
|
||||||
|
let mut bank = Bank::new(&genesis_config);
|
||||||
|
bank.add_instruction_processor(id(), process_instruction);
|
||||||
|
let clients = vec![BankClient::new(bank)];
|
||||||
|
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.identity = identity;
|
||||||
|
config.duration = Duration::from_secs(1);
|
||||||
|
config.fund_amount = 100_000;
|
||||||
|
config.threads = 1;
|
||||||
|
config.transfer_delay = 20; // 0;
|
||||||
|
config.batch_size = 100; // 1500;
|
||||||
|
config.chunk_size = 10; // 1500;
|
||||||
|
config.account_groups = 1; // 50;
|
||||||
|
|
||||||
|
do_bench_exchange(clients, config);
|
||||||
|
}
|
2
bench-streamer/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/target/
|
||||||
|
/farf/
|
@ -2,17 +2,14 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-streamer"
|
name = "solana-bench-streamer"
|
||||||
version = "0.14.0"
|
version = "0.21.7"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
solana = { path = "../core", version = "0.14.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "0.21.7" }
|
||||||
solana-logger = { path = "../logger", version = "0.14.0" }
|
solana-core = { path = "../core", version = "0.21.7" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.14.0" }
|
solana-logger = { path = "../logger", version = "0.21.7" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "0.21.7" }
|
||||||
[features]
|
|
||||||
cuda = ["solana/cuda"]
|
|
||||||
erasure = []
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
use clap::{crate_description, crate_name, App, Arg};
|
||||||
use solana::packet::{Packet, Packets, BLOB_SIZE, PACKET_DATA_SIZE};
|
use solana_core::packet::{Packet, Packets, PacketsRecycler, PACKET_DATA_SIZE};
|
||||||
use solana::result::Result;
|
use solana_core::result::Result;
|
||||||
use solana::streamer::{receiver, PacketReceiver};
|
use solana_core::streamer::{receiver, PacketReceiver};
|
||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||||
@ -16,19 +16,19 @@ fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
|||||||
let send = UdpSocket::bind("0.0.0.0:0").unwrap();
|
let send = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||||
let mut msgs = Packets::default();
|
let mut msgs = Packets::default();
|
||||||
msgs.packets.resize(10, Packet::default());
|
msgs.packets.resize(10, Packet::default());
|
||||||
for w in &mut msgs.packets {
|
for w in msgs.packets.iter_mut() {
|
||||||
w.meta.size = PACKET_DATA_SIZE;
|
w.meta.size = PACKET_DATA_SIZE;
|
||||||
w.meta.set_addr(&addr);
|
w.meta.set_addr(&addr);
|
||||||
}
|
}
|
||||||
let msgs_ = msgs.clone();
|
let msgs = Arc::new(msgs);
|
||||||
spawn(move || loop {
|
spawn(move || loop {
|
||||||
if exit.load(Ordering::Relaxed) {
|
if exit.load(Ordering::Relaxed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
for p in &msgs_.packets {
|
for p in &msgs.packets {
|
||||||
let a = p.meta.addr();
|
let a = p.meta.addr();
|
||||||
assert!(p.meta.size < BLOB_SIZE);
|
assert!(p.meta.size < PACKET_DATA_SIZE);
|
||||||
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
||||||
num += 1;
|
num += 1;
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(solana_clap_utils::version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("num-recv-sockets")
|
Arg::with_name("num-recv-sockets")
|
||||||
.long("num-recv-sockets")
|
.long("num-recv-sockets")
|
||||||
@ -74,8 +74,9 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let mut read_channels = Vec::new();
|
let mut read_channels = Vec::new();
|
||||||
let mut read_threads = Vec::new();
|
let mut read_threads = Vec::new();
|
||||||
|
let recycler = PacketsRecycler::default();
|
||||||
for _ in 0..num_sockets {
|
for _ in 0..num_sockets {
|
||||||
let read = solana_netutil::bind_to(port, false).unwrap();
|
let read = solana_net_utils::bind_to(port, false).unwrap();
|
||||||
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
||||||
|
|
||||||
addr = read.local_addr().unwrap();
|
addr = read.local_addr().unwrap();
|
||||||
@ -83,7 +84,13 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let (s_reader, r_reader) = channel();
|
let (s_reader, r_reader) = channel();
|
||||||
read_channels.push(r_reader);
|
read_channels.push(r_reader);
|
||||||
read_threads.push(receiver(Arc::new(read), &exit, s_reader));
|
read_threads.push(receiver(
|
||||||
|
Arc::new(read),
|
||||||
|
&exit,
|
||||||
|
s_reader,
|
||||||
|
recycler.clone(),
|
||||||
|
"bench-streamer-test",
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let t_producer1 = producer(&addr, exit.clone());
|
let t_producer1 = producer(&addr, exit.clone());
|
||||||
|
1
bench-tps/.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
/target/
|
/target/
|
||||||
/config/
|
/config/
|
||||||
/config-local/
|
/config-local/
|
||||||
|
/farf/
|
||||||
|
@ -2,24 +2,38 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-tps"
|
name = "solana-bench-tps"
|
||||||
version = "0.14.0"
|
version = "0.21.7"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
bincode = "1.2.0"
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
rayon = "1.0.3"
|
log = "0.4.8"
|
||||||
serde_json = "1.0.39"
|
rayon = "1.2.0"
|
||||||
solana = { path = "../core", version = "0.14.0" }
|
serde = "1.0.102"
|
||||||
solana-client = { path = "../client", version = "0.14.0" }
|
serde_derive = "1.0.102"
|
||||||
solana-drone = { path = "../drone", version = "0.14.0" }
|
serde_json = "1.0.41"
|
||||||
solana-logger = { path = "../logger", version = "0.14.0" }
|
serde_yaml = "0.8.11"
|
||||||
solana-metrics = { path = "../metrics", version = "0.14.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "0.21.7" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.14.0" }
|
solana-core = { path = "../core", version = "0.21.7" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.14.0" }
|
solana-genesis = { path = "../genesis", version = "0.21.7" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.14.0" }
|
solana-client = { path = "../client", version = "0.21.7" }
|
||||||
|
solana-drone = { path = "../drone", version = "0.21.7" }
|
||||||
|
solana-librapay-api = { path = "../programs/librapay_api", version = "0.21.7", optional = true }
|
||||||
|
solana-logger = { path = "../logger", version = "0.21.7" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.21.7" }
|
||||||
|
solana-measure = { path = "../measure", version = "0.21.7" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "0.21.7" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.21.7" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.21.7" }
|
||||||
|
solana-move-loader-program = { path = "../programs/move_loader", version = "0.21.7", optional = true }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
serial_test = "0.2.0"
|
||||||
|
serial_test_derive = "0.2.0"
|
||||||
|
solana-local-cluster = { path = "../local-cluster", version = "0.21.7" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
cuda = ["solana/cuda"]
|
move = ["solana-librapay-api", "solana-move-loader-program"]
|
||||||
erasure = []
|
|
||||||
|
@ -1,51 +1,67 @@
|
|||||||
use std::net::SocketAddr;
|
use clap::{crate_description, crate_name, App, Arg, ArgMatches};
|
||||||
use std::process::exit;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
|
|
||||||
use solana_drone::drone::DRONE_PORT;
|
use solana_drone::drone::DRONE_PORT;
|
||||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
|
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||||
|
use std::{net::SocketAddr, process::exit, time::Duration};
|
||||||
|
|
||||||
|
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::SOL_LAMPORTS;
|
||||||
|
|
||||||
/// Holds the configuration for a single run of the benchmark
|
/// Holds the configuration for a single run of the benchmark
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub network_addr: SocketAddr,
|
pub entrypoint_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub drone_addr: SocketAddr,
|
||||||
pub id: Keypair,
|
pub id: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
pub num_nodes: usize,
|
pub num_nodes: usize,
|
||||||
pub duration: Duration,
|
pub duration: Duration,
|
||||||
pub tx_count: usize,
|
pub tx_count: usize,
|
||||||
|
pub keypair_multiplier: usize,
|
||||||
pub thread_batch_sleep_ms: usize,
|
pub thread_batch_sleep_ms: usize,
|
||||||
pub sustained: bool,
|
pub sustained: bool,
|
||||||
|
pub client_ids_and_stake_file: String,
|
||||||
|
pub write_to_client_file: bool,
|
||||||
|
pub read_from_client_file: bool,
|
||||||
|
pub target_lamports_per_signature: u64,
|
||||||
|
pub multi_client: bool,
|
||||||
|
pub use_move: bool,
|
||||||
|
pub num_lamports_per_account: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Config {
|
impl Default for Config {
|
||||||
fn default() -> Config {
|
fn default() -> Config {
|
||||||
Config {
|
Config {
|
||||||
network_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
||||||
id: Keypair::new(),
|
id: Keypair::new(),
|
||||||
threads: 4,
|
threads: 4,
|
||||||
num_nodes: 1,
|
num_nodes: 1,
|
||||||
duration: Duration::new(std::u64::MAX, 0),
|
duration: Duration::new(std::u64::MAX, 0),
|
||||||
tx_count: 500_000,
|
tx_count: 50_000,
|
||||||
thread_batch_sleep_ms: 0,
|
keypair_multiplier: 8,
|
||||||
|
thread_batch_sleep_ms: 1000,
|
||||||
sustained: false,
|
sustained: false,
|
||||||
|
client_ids_and_stake_file: String::new(),
|
||||||
|
write_to_client_file: false,
|
||||||
|
read_from_client_file: false,
|
||||||
|
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
||||||
|
multi_client: true,
|
||||||
|
use_move: false,
|
||||||
|
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Defines and builds the CLI args for a run of the benchmark
|
/// Defines and builds the CLI args for a run of the benchmark
|
||||||
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
||||||
App::new(crate_name!()).about(crate_description!())
|
App::new(crate_name!()).about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(version)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("network")
|
Arg::with_name("entrypoint")
|
||||||
.short("n")
|
.short("n")
|
||||||
.long("network")
|
.long("entrypoint")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Rendezvous with the network at this gossip entry point; defaults to 127.0.0.1:8001"),
|
.help("Rendezvous with the cluster at this entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("drone")
|
||||||
@ -53,7 +69,7 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.long("drone")
|
.long("drone")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Location of the drone; defaults to network:DRONE_PORT"),
|
.help("Location of the drone; defaults to entrypoint:DRONE_PORT"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity")
|
||||||
@ -91,6 +107,16 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.long("sustained")
|
.long("sustained")
|
||||||
.help("Use sustained performance mode vs. peak mode. This overlaps the tx generation with transfers."),
|
.help("Use sustained performance mode vs. peak mode. This overlaps the tx generation with transfers."),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("use-move")
|
||||||
|
.long("use-move")
|
||||||
|
.help("Use Move language transactions to perform transfers."),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("no-multi-client")
|
||||||
|
.long("no-multi-client")
|
||||||
|
.help("Disable multi-client support, only transact with the entrypoint."),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("tx_count")
|
Arg::with_name("tx_count")
|
||||||
.long("tx_count")
|
.long("tx_count")
|
||||||
@ -98,6 +124,13 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Number of transactions to send per batch")
|
.help("Number of transactions to send per batch")
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("keypair_multiplier")
|
||||||
|
.long("keypair-multiplier")
|
||||||
|
.value_name("NUM")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Multiply by transaction count to determine number of keypairs to create")
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("thread-batch-sleep-ms")
|
Arg::with_name("thread-batch-sleep-ms")
|
||||||
.short("z")
|
.short("z")
|
||||||
@ -106,6 +139,39 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Per-thread-per-iteration sleep in ms"),
|
.help("Per-thread-per-iteration sleep in ms"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("write-client-keys")
|
||||||
|
.long("write-client-keys")
|
||||||
|
.value_name("FILENAME")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Generate client keys and stakes and write the list to YAML file"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("read-client-keys")
|
||||||
|
.long("read-client-keys")
|
||||||
|
.value_name("FILENAME")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Read client keys and stakes from the YAML file"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("target_lamports_per_signature")
|
||||||
|
.long("target-lamports-per-signature")
|
||||||
|
.value_name("LAMPORTS")
|
||||||
|
.takes_value(true)
|
||||||
|
.help(
|
||||||
|
"The cost in lamports that the cluster will charge for signature \
|
||||||
|
verification when the cluster is operating at target-signatures-per-slot",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("num_lamports_per_account")
|
||||||
|
.long("num-lamports-per-account")
|
||||||
|
.value_name("LAMPORTS")
|
||||||
|
.takes_value(true)
|
||||||
|
.help(
|
||||||
|
"Number of lamports per account.",
|
||||||
|
),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a clap `ArgMatches` structure into a `Config`
|
/// Parses a clap `ArgMatches` structure into a `Config`
|
||||||
@ -116,22 +182,22 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||||
let mut args = Config::default();
|
let mut args = Config::default();
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("network") {
|
if let Some(addr) = matches.value_of("entrypoint") {
|
||||||
args.network_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
args.entrypoint_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse network address: {}", e);
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("drone") {
|
if let Some(addr) = matches.value_of("drone") {
|
||||||
args.drone_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
args.drone_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
eprintln!("failed to parse drone address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches.is_present("identity") {
|
if matches.is_present("identity") {
|
||||||
args.id = read_keypair(matches.value_of("identity").unwrap())
|
args.id = read_keypair_file(matches.value_of("identity").unwrap())
|
||||||
.expect("can't read client identity");
|
.expect("can't read client identity");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,7 +217,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("tx_count") {
|
if let Some(s) = matches.value_of("tx_count") {
|
||||||
args.tx_count = s.to_string().parse().expect("can't parse tx_account");
|
args.tx_count = s.to_string().parse().expect("can't parse tx_count");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("keypair_multiplier") {
|
||||||
|
args.keypair_multiplier = s
|
||||||
|
.to_string()
|
||||||
|
.parse()
|
||||||
|
.expect("can't parse keypair-multiplier");
|
||||||
|
assert!(args.keypair_multiplier >= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(t) = matches.value_of("thread-batch-sleep-ms") {
|
if let Some(t) = matches.value_of("thread-batch-sleep-ms") {
|
||||||
@ -163,5 +237,27 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
|
|
||||||
args.sustained = matches.is_present("sustained");
|
args.sustained = matches.is_present("sustained");
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("write-client-keys") {
|
||||||
|
args.write_to_client_file = true;
|
||||||
|
args.client_ids_and_stake_file = s.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("read-client-keys") {
|
||||||
|
assert!(!args.write_to_client_file);
|
||||||
|
args.read_from_client_file = true;
|
||||||
|
args.client_ids_and_stake_file = s.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(v) = matches.value_of("target_lamports_per_signature") {
|
||||||
|
args.target_lamports_per_signature = v.to_string().parse().expect("can't parse lamports");
|
||||||
|
}
|
||||||
|
|
||||||
|
args.use_move = matches.is_present("use-move");
|
||||||
|
args.multi_client = !matches.is_present("no-multi-client");
|
||||||
|
|
||||||
|
if let Some(v) = matches.value_of("num_lamports_per_account") {
|
||||||
|
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
||||||
|
}
|
||||||
|
|
||||||
args
|
args
|
||||||
}
|
}
|
||||||
|
2
bench-tps/src/lib.rs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pub mod bench;
|
||||||
|
pub mod cli;
|
@ -1,91 +1,143 @@
|
|||||||
mod bench;
|
use log::*;
|
||||||
mod cli;
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
||||||
|
use solana_bench_tps::cli;
|
||||||
|
use solana_core::gossip_service::{discover_cluster, get_client, get_multi_client};
|
||||||
|
use solana_genesis::Base64Account;
|
||||||
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
use solana_sdk::system_program;
|
||||||
|
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit};
|
||||||
|
|
||||||
use crate::bench::{
|
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
||||||
airdrop_lamports, do_bench_tps, fund_keys, generate_keypairs, Config, NUM_LAMPORTS_PER_ACCOUNT,
|
pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
|
||||||
};
|
|
||||||
use solana::cluster_info::FULLNODE_PORT_RANGE;
|
|
||||||
use solana::contact_info::ContactInfo;
|
|
||||||
use solana::gossip_service::discover_nodes;
|
|
||||||
use solana_client::thin_client::create_client;
|
|
||||||
use solana_sdk::client::SyncClient;
|
|
||||||
use solana_sdk::signature::KeypairUtil;
|
|
||||||
use std::process::exit;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup();
|
solana_logger::setup_with_filter("solana=info");
|
||||||
solana_metrics::set_panic_hook("bench-tps");
|
solana_metrics::set_panic_hook("bench-tps");
|
||||||
|
|
||||||
let matches = cli::build_args().get_matches();
|
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cli::Config {
|
let cli::Config {
|
||||||
network_addr,
|
entrypoint_addr,
|
||||||
drone_addr,
|
drone_addr,
|
||||||
id,
|
id,
|
||||||
threads,
|
|
||||||
num_nodes,
|
num_nodes,
|
||||||
duration,
|
|
||||||
tx_count,
|
tx_count,
|
||||||
thread_batch_sleep_ms,
|
keypair_multiplier,
|
||||||
sustained,
|
client_ids_and_stake_file,
|
||||||
} = cli_config;
|
write_to_client_file,
|
||||||
|
read_from_client_file,
|
||||||
|
target_lamports_per_signature,
|
||||||
|
use_move,
|
||||||
|
multi_client,
|
||||||
|
num_lamports_per_account,
|
||||||
|
..
|
||||||
|
} = &cli_config;
|
||||||
|
|
||||||
println!("Connecting to the cluster");
|
let keypair_count = *tx_count * keypair_multiplier;
|
||||||
let nodes = discover_nodes(&network_addr, num_nodes).unwrap_or_else(|err| {
|
if *write_to_client_file {
|
||||||
|
info!("Generating {} keypairs", keypair_count);
|
||||||
|
let (keypairs, _) = generate_keypairs(&id, keypair_count as u64);
|
||||||
|
let num_accounts = keypairs.len() as u64;
|
||||||
|
let max_fee =
|
||||||
|
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
||||||
|
let num_lamports_per_account = (num_accounts - 1 + NUM_SIGNATURES_FOR_TXS * max_fee)
|
||||||
|
/ num_accounts
|
||||||
|
+ num_lamports_per_account;
|
||||||
|
let mut accounts = HashMap::new();
|
||||||
|
keypairs.iter().for_each(|keypair| {
|
||||||
|
accounts.insert(
|
||||||
|
serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
|
||||||
|
Base64Account {
|
||||||
|
balance: num_lamports_per_account,
|
||||||
|
executable: false,
|
||||||
|
owner: system_program::id().to_string(),
|
||||||
|
data: String::new(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
info!("Writing {}", client_ids_and_stake_file);
|
||||||
|
let serialized = serde_yaml::to_string(&accounts).unwrap();
|
||||||
|
let path = Path::new(&client_ids_and_stake_file);
|
||||||
|
let mut file = File::create(path).unwrap();
|
||||||
|
file.write_all(&serialized.into_bytes()).unwrap();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
info!("Connecting to the cluster");
|
||||||
|
let (nodes, _archivers) =
|
||||||
|
discover_cluster(&entrypoint_addr, *num_nodes).unwrap_or_else(|err| {
|
||||||
eprintln!("Failed to discover {} nodes: {:?}", num_nodes, err);
|
eprintln!("Failed to discover {} nodes: {:?}", num_nodes, err);
|
||||||
exit(1);
|
exit(1);
|
||||||
});
|
});
|
||||||
if nodes.len() < num_nodes {
|
|
||||||
|
let client = if *multi_client {
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
if nodes.len() < num_clients {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"Error: Insufficient nodes discovered. Expecting {} or more",
|
"Error: Insufficient nodes discovered. Expecting {} or more",
|
||||||
num_nodes
|
num_nodes
|
||||||
);
|
);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
let clients: Vec<_> = nodes
|
client
|
||||||
.iter()
|
|
||||||
.filter_map(|node| {
|
|
||||||
let cluster_entrypoint = node.clone();
|
|
||||||
let cluster_addrs = cluster_entrypoint.client_facing_addr();
|
|
||||||
if ContactInfo::is_valid_address(&cluster_addrs.0)
|
|
||||||
&& ContactInfo::is_valid_address(&cluster_addrs.1)
|
|
||||||
{
|
|
||||||
let client = create_client(cluster_addrs, FULLNODE_PORT_RANGE);
|
|
||||||
Some(client)
|
|
||||||
} else {
|
} else {
|
||||||
None
|
get_client(&nodes)
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
println!("Creating {} keypairs...", tx_count * 2);
|
|
||||||
let keypairs = generate_keypairs(&id, tx_count);
|
|
||||||
|
|
||||||
println!("Get lamports...");
|
|
||||||
|
|
||||||
// Sample the first keypair, see if it has lamports, if so then resume.
|
|
||||||
// This logic is to prevent lamport loss on repeated solana-bench-tps executions
|
|
||||||
let keypair0_balance = clients[0]
|
|
||||||
.get_balance(&keypairs.last().unwrap().pubkey())
|
|
||||||
.unwrap_or(0);
|
|
||||||
|
|
||||||
if NUM_LAMPORTS_PER_ACCOUNT > keypair0_balance {
|
|
||||||
let extra = NUM_LAMPORTS_PER_ACCOUNT - keypair0_balance;
|
|
||||||
let total = extra * (keypairs.len() as u64);
|
|
||||||
airdrop_lamports(&clients[0], &drone_addr, &id, total);
|
|
||||||
println!("adding more lamports {}", extra);
|
|
||||||
fund_keys(&clients[0], &id, &keypairs, extra);
|
|
||||||
}
|
|
||||||
|
|
||||||
let config = Config {
|
|
||||||
id,
|
|
||||||
threads,
|
|
||||||
thread_batch_sleep_ms,
|
|
||||||
duration,
|
|
||||||
tx_count,
|
|
||||||
sustained,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
do_bench_tps(clients, config, keypairs, keypair0_balance);
|
let (keypairs, move_keypairs, keypair_balance) = if *read_from_client_file && !use_move {
|
||||||
|
let path = Path::new(&client_ids_and_stake_file);
|
||||||
|
let file = File::open(path).unwrap();
|
||||||
|
|
||||||
|
info!("Reading {}", client_ids_and_stake_file);
|
||||||
|
let accounts: HashMap<String, Base64Account> = serde_yaml::from_reader(file).unwrap();
|
||||||
|
let mut keypairs = vec![];
|
||||||
|
let mut last_balance = 0;
|
||||||
|
|
||||||
|
accounts
|
||||||
|
.into_iter()
|
||||||
|
.for_each(|(keypair, primordial_account)| {
|
||||||
|
let bytes: Vec<u8> = serde_json::from_str(keypair.as_str()).unwrap();
|
||||||
|
keypairs.push(Keypair::from_bytes(&bytes).unwrap());
|
||||||
|
last_balance = primordial_account.balance;
|
||||||
|
});
|
||||||
|
|
||||||
|
if keypairs.len() < keypair_count {
|
||||||
|
eprintln!(
|
||||||
|
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
||||||
|
keypair_count,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
keypairs.len(),
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
// Sort keypairs so that do_bench_tps() uses the same subset of accounts for each run.
|
||||||
|
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
||||||
|
// across multiple runs.
|
||||||
|
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
||||||
|
(keypairs, None, last_balance)
|
||||||
|
} else {
|
||||||
|
generate_and_fund_keypairs(
|
||||||
|
&client,
|
||||||
|
Some(*drone_addr),
|
||||||
|
&id,
|
||||||
|
keypair_count,
|
||||||
|
*num_lamports_per_account,
|
||||||
|
*use_move,
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|e| {
|
||||||
|
eprintln!("Error could not fund keys: {:?}", e);
|
||||||
|
exit(1);
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
do_bench_tps(
|
||||||
|
vec![client],
|
||||||
|
cli_config,
|
||||||
|
keypairs,
|
||||||
|
keypair_balance,
|
||||||
|
move_keypairs,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
86
bench-tps/tests/bench_tps.rs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
use serial_test_derive::serial;
|
||||||
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
||||||
|
use solana_bench_tps::cli::Config;
|
||||||
|
use solana_client::thin_client::create_client;
|
||||||
|
use solana_core::cluster_info::VALIDATOR_PORT_RANGE;
|
||||||
|
use solana_core::validator::ValidatorConfig;
|
||||||
|
use solana_drone::drone::run_local_drone;
|
||||||
|
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
|
#[cfg(feature = "move")]
|
||||||
|
use solana_sdk::move_loader::solana_move_loader_program;
|
||||||
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
use std::sync::mpsc::channel;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
fn test_bench_tps_local_cluster(config: Config) {
|
||||||
|
#[cfg(feature = "move")]
|
||||||
|
let native_instruction_processors = vec![solana_move_loader_program()];
|
||||||
|
|
||||||
|
#[cfg(not(feature = "move"))]
|
||||||
|
let native_instruction_processors = vec![];
|
||||||
|
|
||||||
|
solana_logger::setup();
|
||||||
|
const NUM_NODES: usize = 1;
|
||||||
|
let cluster = LocalCluster::new(&ClusterConfig {
|
||||||
|
node_stakes: vec![999_990; NUM_NODES],
|
||||||
|
cluster_lamports: 200_000_000,
|
||||||
|
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
||||||
|
native_instruction_processors,
|
||||||
|
..ClusterConfig::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
let drone_keypair = Keypair::new();
|
||||||
|
cluster.transfer(
|
||||||
|
&cluster.funding_keypair,
|
||||||
|
&drone_keypair.pubkey(),
|
||||||
|
100_000_000,
|
||||||
|
);
|
||||||
|
|
||||||
|
let client = create_client(
|
||||||
|
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
||||||
|
VALIDATOR_PORT_RANGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
let (addr_sender, addr_receiver) = channel();
|
||||||
|
run_local_drone(drone_keypair, addr_sender, None);
|
||||||
|
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
|
let lamports_per_account = 100;
|
||||||
|
|
||||||
|
let keypair_count = config.tx_count * config.keypair_multiplier;
|
||||||
|
let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs(
|
||||||
|
&client,
|
||||||
|
Some(drone_addr),
|
||||||
|
&config.id,
|
||||||
|
keypair_count,
|
||||||
|
lamports_per_account,
|
||||||
|
config.use_move,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let _total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs);
|
||||||
|
|
||||||
|
#[cfg(not(debug_assertions))]
|
||||||
|
assert!(_total > 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial]
|
||||||
|
fn test_bench_tps_local_cluster_solana() {
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.tx_count = 100;
|
||||||
|
config.duration = Duration::from_secs(10);
|
||||||
|
|
||||||
|
test_bench_tps_local_cluster(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial]
|
||||||
|
fn test_bench_tps_local_cluster_move() {
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.tx_count = 100;
|
||||||
|
config.duration = Duration::from_secs(10);
|
||||||
|
config.use_move = true;
|
||||||
|
|
||||||
|
test_bench_tps_local_cluster(config);
|
||||||
|
}
|
@ -1,15 +0,0 @@
|
|||||||
msc {
|
|
||||||
client,leader,verifier_a,verifier_b,verifier_c;
|
|
||||||
|
|
||||||
client=>leader [ label = "SUBMIT" ] ;
|
|
||||||
leader=>client [ label = "CONFIRMED" ] ;
|
|
||||||
leader=>verifier_a [ label = "CONFIRMED" ] ;
|
|
||||||
leader=>verifier_b [ label = "CONFIRMED" ] ;
|
|
||||||
leader=>verifier_c [ label = "CONFIRMED" ] ;
|
|
||||||
verifier_a=>leader [ label = "VERIFIED" ] ;
|
|
||||||
verifier_b=>leader [ label = "VERIFIED" ] ;
|
|
||||||
leader=>client [ label = "FINALIZED" ] ;
|
|
||||||
leader=>verifier_a [ label = "FINALIZED" ] ;
|
|
||||||
leader=>verifier_b [ label = "FINALIZED" ] ;
|
|
||||||
leader=>verifier_c [ label = "FINALIZED" ] ;
|
|
||||||
}
|
|
19
book/art/data-plane-fanout.bob
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
+------------------------------------------------------------------+
|
||||||
|
| |
|
||||||
|
| +-----------------+ Neighborhood 0 +-----------------+ |
|
||||||
|
| | +--------------------->+ | |
|
||||||
|
| | Validator 1 | | Validator 2 | |
|
||||||
|
| | +<---------------------+ | |
|
||||||
|
| +--------+-+------+ +------+-+--------+ |
|
||||||
|
| | | | | |
|
||||||
|
| | +-----------------------------+ | | |
|
||||||
|
| | +------------------------+------+ | |
|
||||||
|
| | | | | |
|
||||||
|
+------------------------------------------------------------------+
|
||||||
|
| | | |
|
||||||
|
v v v v
|
||||||
|
+---------+------+---+ +-+--------+---------+
|
||||||
|
| | | |
|
||||||
|
| Neighborhood 1 | | Neighborhood 2 |
|
||||||
|
| | | |
|
||||||
|
+--------------------+ +--------------------+
|
15
book/art/data-plane-seeding.bob
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
+--------------+
|
||||||
|
| |
|
||||||
|
+------------+ Leader +------------+
|
||||||
|
| | | |
|
||||||
|
| +--------------+ |
|
||||||
|
v v
|
||||||
|
+------------+----------------------------------------+------------+
|
||||||
|
| |
|
||||||
|
| +-----------------+ Neighborhood 0 +-----------------+ |
|
||||||
|
| | +--------------------->+ | |
|
||||||
|
| | Validator 1 | | Validator 2 | |
|
||||||
|
| | +<---------------------+ | |
|
||||||
|
| +-----------------+ +-----------------+ |
|
||||||
|
| |
|
||||||
|
+------------------------------------------------------------------+
|
@ -1,28 +1,18 @@
|
|||||||
|
+--------------------+
|
||||||
+--------------+
|
|
||||||
| |
|
| |
|
||||||
+------------+ Leader +------------+
|
+--------+ Neighborhood 0 +----------+
|
||||||
| | | |
|
| | | |
|
||||||
| +--------------+ |
|
| +--------------------+ |
|
||||||
v v
|
v v
|
||||||
+--------+--------+ +--------+--------+
|
+---------+----------+ +----------+---------+
|
||||||
| +--------------------->+ |
|
| | | |
|
||||||
+-----------------+ Validator 1 | | Validator 2 +-------------+
|
| Neighborhood 1 | | Neighborhood 2 |
|
||||||
| | +<---------------------+ | |
|
| | | |
|
||||||
| +------+-+-+------+ +---+-+-+---------+ |
|
+---+-----+----------+ +----------+-----+---+
|
||||||
| | | | | | | |
|
| | | |
|
||||||
| | | | | | | |
|
v v v v
|
||||||
| +---------------------------------------------+ | | |
|
+------------------+-+ +-+------------------+ +------------------+-+ +-+------------------+
|
||||||
| | | | | | | |
|
|
||||||
| | | | | +----------------------+ | |
|
|
||||||
| | | | | | | |
|
|
||||||
| | | | +--------------------------------------------+ |
|
|
||||||
| | | | | | | |
|
|
||||||
| | | +----------------------+ | | |
|
|
||||||
| | | | | | | |
|
|
||||||
v v v v v v v v
|
|
||||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| Neighborhood 1 | | Neighborhood 2 | | Neighborhood 3 | | Neighborhood 4 |
|
| Neighborhood 3 | | Neighborhood 4 | | Neighborhood 5 | | Neighborhood 6 |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
.--------------------------------------.
|
|
||||||
| Fullnode |
|
|
||||||
| |
|
|
||||||
.--------. | .-------------------. |
|
|
||||||
| |---->| | |
|
|
||||||
| Client | | | JSON RPC Service | |
|
|
||||||
| |<----| | |
|
|
||||||
`----+---` | `-------------------` |
|
|
||||||
| | ^ |
|
|
||||||
| | | .----------------. | .------------------.
|
|
||||||
| | | | Gossip Service |<----------| Validators |
|
|
||||||
| | | `----------------` | | |
|
|
||||||
| | | ^ | | |
|
|
||||||
| | | | | | .------------. |
|
|
||||||
| | .---+---. .----+---. .-----------. | | | | |
|
|
||||||
| | | Bank |<-+ Replay | | BlobFetch |<------+ Upstream | |
|
|
||||||
| | | Forks | | Stage | | Stage | | | | Validators | |
|
|
||||||
| | `-------` `--------` `--+--------` | | | | |
|
|
||||||
| | ^ ^ | | | `------------` |
|
|
||||||
| | | | v | | |
|
|
||||||
| | | .--+--------. | | |
|
|
||||||
| | | | Blocktree | | | |
|
|
||||||
| | | `-----------` | | .------------. |
|
|
||||||
| | | ^ | | | | |
|
|
||||||
| | | | | | | Downstream | |
|
|
||||||
| | .--+--. .-------+---. | | | Validators | |
|
|
||||||
`-------->| TPU +---->| Broadcast +--------------->| | |
|
|
||||||
| `-----` | Stage | | | `------------` |
|
|
||||||
| `-----------` | `------------------`
|
|
||||||
`--------------------------------------`
|
|
18
book/art/spv-bank-merkle.bob
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
+------------+
|
||||||
|
| Bank-Merkle|
|
||||||
|
+------------+
|
||||||
|
^ ^
|
||||||
|
/ \
|
||||||
|
+-----------------+ +-------------+
|
||||||
|
| Bank-Diff-Merkle| | Block-Merkle|
|
||||||
|
+-----------------+ +-------------+
|
||||||
|
^ ^
|
||||||
|
/ \
|
||||||
|
+------+ +--------------------------+
|
||||||
|
| Hash | | Previous Bank-Diff-Merkle|
|
||||||
|
+------+ +--------------------------+
|
||||||
|
^ ^
|
||||||
|
/ \
|
||||||
|
+---------------+ +---------------+
|
||||||
|
| Hash(Account1)| | Hash(Account2)|
|
||||||
|
+---------------+ +---------------+
|
19
book/art/spv-block-merkle.bob
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
+---------------+
|
||||||
|
| Block-Merkle |
|
||||||
|
+---------------+
|
||||||
|
^ ^
|
||||||
|
/ \
|
||||||
|
+-------------+ +-------------+
|
||||||
|
| Entry-Merkle| | Entry-Merkle|
|
||||||
|
+-------------+ +-------------+
|
||||||
|
^ ^
|
||||||
|
/ \
|
||||||
|
+-------+ +-------+
|
||||||
|
| Hash | | Hash |
|
||||||
|
+-------+ +-------+
|
||||||
|
^ ^ ^ ^
|
||||||
|
/ | | \
|
||||||
|
+-----------------+ +-----------------+ +-----------------+ +---+
|
||||||
|
| Hash(T1, status)| | Hash(T2, status)| | Hash(T3, status)| | 0 |
|
||||||
|
+-----------------+ +-----------------+ +-----------------+ +---+
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
| TVU | |
|
| TVU | |
|
||||||
| | |
|
| | |
|
||||||
| .-------. .------------. .----+---. .---------. |
|
| .-------. .------------. .----+---. .---------. |
|
||||||
.------------. | | Blob | | Retransmit | | Replay | | Storage | |
|
.------------. | | Shred | | Retransmit | | Replay | | Storage | |
|
||||||
| Upstream +----->| Fetch +-->| Stage +-->| Stage +-->| Stage | |
|
| Upstream +----->| Fetch +-->| Stage +-->| Stage +-->| Stage | |
|
||||||
| Validators | | | Stage | | | | | | | |
|
| Validators | | | Stage | | | | | | | |
|
||||||
`------------` | `-------` `----+-------` `----+---` `---------` |
|
`------------` | `-------` `----+-------` `----+---` `---------` |
|
||||||
|
60
book/art/validator-proposal.bob
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
|
||||||
|
.------------.
|
||||||
|
| Upstream |
|
||||||
|
| Validators |
|
||||||
|
`----+-------`
|
||||||
|
|
|
||||||
|
|
|
||||||
|
.-----------------------------------.
|
||||||
|
| Validator | |
|
||||||
|
| v |
|
||||||
|
| .-----------. .------------. |
|
||||||
|
.--------. | | Fetch | | Repair | |
|
||||||
|
| Client +---->| Stage | | Stage | |
|
||||||
|
`--------` | `---+-------` `----+-------` |
|
||||||
|
| | | |
|
||||||
|
| v v |
|
||||||
|
| .-----------. .------------. |
|
||||||
|
| | TPU |<-->| Blockstore | |
|
||||||
|
| | | | | |
|
||||||
|
| `-----------` `----+-------` |
|
||||||
|
| | |
|
||||||
|
| v |
|
||||||
|
| .------------. |
|
||||||
|
| | Multicast | |
|
||||||
|
| | Stage | |
|
||||||
|
| `----+-------` |
|
||||||
|
| | |
|
||||||
|
`-----------------------------------`
|
||||||
|
|
|
||||||
|
v
|
||||||
|
.------------.
|
||||||
|
| Downstream |
|
||||||
|
| Validators |
|
||||||
|
`------------`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.------------.
|
||||||
|
| PoH |
|
||||||
|
| Service |
|
||||||
|
`-------+----`
|
||||||
|
^ |
|
||||||
|
| |
|
||||||
|
.-----------------------------------.
|
||||||
|
| TPU | | |
|
||||||
|
| | v |
|
||||||
|
.-------. | .-----------. .---+--------. | .------------.
|
||||||
|
| Fetch +---->| SigVerify +--->| Banking |<--->| Blockstore |
|
||||||
|
| Stage | | | Stage | | Stage | | | |
|
||||||
|
`-------` | `-----------` `-----+------` | `------------`
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
`-----------------------------------`
|
||||||
|
|
|
||||||
|
v
|
||||||
|
.------------.
|
||||||
|
| Banktree |
|
||||||
|
| |
|
||||||
|
`------------`
|
||||||
|
|
30
book/art/validator.bob
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
.---------------------------------------.
|
||||||
|
| Validator |
|
||||||
|
| |
|
||||||
|
.--------. | .-------------------. |
|
||||||
|
| |---->| | |
|
||||||
|
| Client | | | JSON RPC Service | |
|
||||||
|
| |<----| | |
|
||||||
|
`----+---` | `-------------------` |
|
||||||
|
| | ^ |
|
||||||
|
| | | .----------------. | .------------------.
|
||||||
|
| | | | Gossip Service |<-----------| Validators |
|
||||||
|
| | | `----------------` | | |
|
||||||
|
| | | ^ | | |
|
||||||
|
| | | | | | .------------. |
|
||||||
|
| | .---+---. .----+---. .------------. | | | | |
|
||||||
|
| | | Bank |<-+ Replay | | ShredFetch |<------+ Upstream | |
|
||||||
|
| | | Forks | | Stage | | Stage | | | | Validators | |
|
||||||
|
| | `-------` `--------` `--+---------` | | | | |
|
||||||
|
| | ^ ^ | | | `------------` |
|
||||||
|
| | | | v | | |
|
||||||
|
| | | .--+--------. | | |
|
||||||
|
| | | | Blocktree | | | |
|
||||||
|
| | | `-----------` | | .------------. |
|
||||||
|
| | | ^ | | | | |
|
||||||
|
| | | | | | | Downstream | |
|
||||||
|
| | .--+--. .-------+---. | | | Validators | |
|
||||||
|
`-------->| TPU +---->| Broadcast +---------------->| | |
|
||||||
|
| `-----` | Stage | | | `------------` |
|
||||||
|
| `-----------` | `------------------`
|
||||||
|
`---------------------------------------`
|
34
book/build-cli-usage.sh
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
usage=$(cargo -q run -p solana-cli -- -C ~/.foo --help | sed 's|'"$HOME"'|~|g')
|
||||||
|
|
||||||
|
out=${1:-src/api-reference/cli.md}
|
||||||
|
|
||||||
|
cat src/api-reference/.cli.md > "$out"
|
||||||
|
|
||||||
|
section() {
|
||||||
|
declare mark=${2:-"###"}
|
||||||
|
declare section=$1
|
||||||
|
read -r name rest <<<"$section"
|
||||||
|
|
||||||
|
printf '%s %s
|
||||||
|
' "$mark" "$name"
|
||||||
|
printf '```text
|
||||||
|
%s
|
||||||
|
```
|
||||||
|
|
||||||
|
' "$section"
|
||||||
|
}
|
||||||
|
|
||||||
|
section "$usage" >> "$out"
|
||||||
|
|
||||||
|
in_subcommands=0
|
||||||
|
while read -r subcommand rest; do
|
||||||
|
[[ $subcommand == "SUBCOMMANDS:" ]] && in_subcommands=1 && continue
|
||||||
|
if ((in_subcommands)); then
|
||||||
|
section "$(cargo -q run -p solana-cli -- help "$subcommand" | sed 's|'"$HOME"'|~|g')" "####" >> "$out"
|
||||||
|
fi
|
||||||
|
done <<<"$usage">>"$out"
|
13
book/build-svg.sh
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
make -j"$(nproc)" -B svg
|
||||||
|
|
||||||
|
#TODO figure out why book wants to change, but local and CI differ
|
||||||
|
exit 0
|
||||||
|
if [[ -n $CI ]]; then
|
||||||
|
# In CI confirm that no svgs need to be built
|
||||||
|
git diff --exit-code
|
||||||
|
fi
|
@ -3,16 +3,4 @@ set -e
|
|||||||
|
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
cargo_install_unless() {
|
make -j"$(nproc)" test
|
||||||
declare crate=$1
|
|
||||||
shift
|
|
||||||
|
|
||||||
"$@" > /dev/null 2>&1 || \
|
|
||||||
cargo install "$crate"
|
|
||||||
}
|
|
||||||
|
|
||||||
export PATH=$CARGO_HOME/bin:$PATH
|
|
||||||
cargo_install_unless mdbook mdbook --help
|
|
||||||
cargo_install_unless svgbob_cli svgbob --help
|
|
||||||
|
|
||||||
make -j"$(nproc)"
|
|
||||||
|
@ -1,31 +1,41 @@
|
|||||||
BOB_SRCS=$(wildcard art/*.bob)
|
BOB_SRCS=$(wildcard art/*.bob)
|
||||||
|
MSC_SRCS=$(wildcard art/*.msc)
|
||||||
MD_SRCS=$(wildcard src/*.md)
|
MD_SRCS=$(wildcard src/*.md)
|
||||||
|
|
||||||
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/img/%.svg)
|
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/.gitbook/assets/%.svg) $(MSC_SRCS:art/%.msc=src/.gitbook/assets/%.svg)
|
||||||
|
|
||||||
all: html/index.html
|
TARGET=html/index.html
|
||||||
|
TEST_STAMP=src/tests.ok
|
||||||
|
|
||||||
test: src/tests.ok
|
all: $(TARGET)
|
||||||
|
|
||||||
open: all
|
svg: $(SVG_IMGS)
|
||||||
|
|
||||||
|
test: $(TEST_STAMP)
|
||||||
|
|
||||||
|
open: $(TEST_STAMP)
|
||||||
mdbook build --open
|
mdbook build --open
|
||||||
|
|
||||||
watch: $(SVG_IMGS)
|
watch: $(SVG_IMGS)
|
||||||
mdbook watch
|
mdbook watch
|
||||||
|
|
||||||
src/img/%.svg: art/%.bob
|
src/.gitbook/assets/%.svg: art/%.bob
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
svgbob < $< > $@
|
svgbob < $< > $@
|
||||||
|
|
||||||
|
src/.gitbook/assets/%.svg: art/%.msc
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
mscgen -T svg -i $< -o $@
|
||||||
|
|
||||||
src/%.md: %.md
|
src/%.md: %.md
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@cp $< $@
|
@cp $< $@
|
||||||
|
|
||||||
src/tests.ok: $(SVG_IMGS) $(MD_SRCS)
|
$(TEST_STAMP): $(TARGET)
|
||||||
mdbook test
|
mdbook test
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
html/index.html: src/tests.ok
|
$(TARGET): $(SVG_IMGS) $(MD_SRCS)
|
||||||
mdbook build
|
mdbook build
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
192
book/src/.gitbook/assets/data-plane (1).svg
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
192
book/src/.gitbook/assets/data-plane (2).svg
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
192
book/src/.gitbook/assets/data-plane (3).svg
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
192
book/src/.gitbook/assets/data-plane (4).svg
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
210
book/src/.gitbook/assets/data-plane (5).svg
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
rect.backdrop {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
text{
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
line {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fg_fill {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.bg_fill {
|
||||||
|
fill: white;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect class="backdrop" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
192
book/src/.gitbook/assets/data-plane-3.svg
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (1).svg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
201
book/src/.gitbook/assets/data-plane-fanout (2).svg
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
rect.backdrop {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
text{
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
line {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fg_fill {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.bg_fill {
|
||||||
|
fill: white;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect class="backdrop" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (3).svg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (4).svg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout (5).svg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout-3.svg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
183
book/src/.gitbook/assets/data-plane-fanout.svg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="184"/>
|
||||||
|
<line x1="4" x2="540" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="540" y1="184" y2="184"/>
|
||||||
|
<line x1="540" x2="540" y1="8" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="28" x2="28" y1="232" y2="296"/>
|
||||||
|
<line x1="28" x2="108" y1="232" y2="232"/>
|
||||||
|
<line x1="28" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="108" x2="164" y1="232" y2="232"/>
|
||||||
|
<line x1="164" x2="196" y1="232" y2="232"/>
|
||||||
|
<line x1="196" x2="196" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="40" y2="104"/>
|
||||||
|
<line x1="36" x2="180" y1="40" y2="40"/>
|
||||||
|
<line x1="36" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="108" x2="108" y1="104" y2="176"/>
|
||||||
|
<line x1="108" x2="124" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="136"/>
|
||||||
|
<line x1="124" x2="180" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="364" y1="136" y2="136"/>
|
||||||
|
<line x1="180" x2="180" y1="40" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="56" y2="88"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
||||||
|
<line x1="180" x2="180" y1="88" y2="104"/>
|
||||||
|
<line x1="180" x2="184" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="176"/>
|
||||||
|
<line x1="364" x2="420" y1="152" y2="152"/>
|
||||||
|
<line x1="420" x2="420" y1="104" y2="152"/>
|
||||||
|
<line x1="420" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="436" y1="104" y2="176"/>
|
||||||
|
<line x1="436" x2="508" y1="104" y2="104"/>
|
||||||
|
<line x1="508" x2="508" y1="40" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="176"/>
|
||||||
|
<line x1="164" x2="364" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
||||||
|
<line x1="192" x2="364" y1="88" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="56" y2="88"/>
|
||||||
|
<line x1="364" x2="364" y1="88" y2="104"/>
|
||||||
|
<line x1="364" x2="420" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="232" y2="296"/>
|
||||||
|
<line x1="348" x2="364" y1="232" y2="232"/>
|
||||||
|
<line x1="348" x2="516" y1="296" y2="296"/>
|
||||||
|
<line x1="364" x2="436" y1="232" y2="232"/>
|
||||||
|
<line x1="436" x2="516" y1="232" y2="232"/>
|
||||||
|
<line x1="516" x2="516" y1="232" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="40" y2="56"/>
|
||||||
|
<line x1="364" x2="508" y1="40" y2="40"/>
|
||||||
|
<line x1="364" x2="360" y1="56" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="57" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="76">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="268">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="76">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="481" y="268">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
340
book/src/.gitbook/assets/data-plane-neighborhood (1).svg
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
rect.backdrop {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
text{
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
line {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fg_fill {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.bg_fill {
|
||||||
|
fill: white;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect class="backdrop" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.2 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (2).svg
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (3).svg
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (4).svg
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood (5).svg
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood-3.svg
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
322
book/src/.gitbook/assets/data-plane-neighborhood.svg
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="8" y2="152"/>
|
||||||
|
<line x1="4" x2="852" y1="8" y2="8"/>
|
||||||
|
<line x1="4" x2="852" y1="152" y2="152"/>
|
||||||
|
<line x1="852" x2="852" y1="8" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="248" y2="392"/>
|
||||||
|
<line x1="4" x2="852" y1="248" y2="248"/>
|
||||||
|
<line x1="4" x2="852" y1="392" y2="392"/>
|
||||||
|
<line x1="852" x2="852" y1="248" y2="392"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="56" y2="120"/>
|
||||||
|
<line x1="60" x2="196" y1="56" y2="56"/>
|
||||||
|
<line x1="60" x2="84" y1="120" y2="120"/>
|
||||||
|
<line x1="84" x2="84" y1="120" y2="144"/>
|
||||||
|
<line x1="84" x2="196" y1="120" y2="120"/>
|
||||||
|
<line x1="196" x2="196" y1="56" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
||||||
|
<line x1="196" x2="196" y1="104" y2="120"/>
|
||||||
|
<line x1="196" x2="200" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="60" x2="60" y1="296" y2="360"/>
|
||||||
|
<line x1="60" x2="84" y1="296" y2="296"/>
|
||||||
|
<line x1="60" x2="196" y1="360" y2="360"/>
|
||||||
|
<line x1="84" x2="196" y1="296" y2="296"/>
|
||||||
|
<line x1="196" x2="196" y1="296" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
||||||
|
<line x1="196" x2="196" y1="344" y2="360"/>
|
||||||
|
<line x1="196" x2="200" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="84" x2="84" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="208" x2="260" y1="104" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="72" y2="104"/>
|
||||||
|
<line x1="260" x2="260" y1="104" y2="120"/>
|
||||||
|
<line x1="260" x2="284" y1="120" y2="120"/>
|
||||||
|
<line x1="284" x2="284" y1="120" y2="144"/>
|
||||||
|
<line x1="284" x2="396" y1="120" y2="120"/>
|
||||||
|
<line x1="396" x2="396" y1="104" y2="120"/>
|
||||||
|
<line x1="396" x2="400" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
||||||
|
<line x1="208" x2="260" y1="344" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="312" y2="344"/>
|
||||||
|
<line x1="260" x2="260" y1="344" y2="360"/>
|
||||||
|
<line x1="260" x2="396" y1="360" y2="360"/>
|
||||||
|
<line x1="396" x2="396" y1="344" y2="360"/>
|
||||||
|
<line x1="396" x2="400" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="56" y2="72"/>
|
||||||
|
<line x1="260" x2="396" y1="56" y2="56"/>
|
||||||
|
<line x1="260" x2="256" y1="72" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="56" y2="72"/>
|
||||||
|
<line x1="396" x2="396" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="296" y2="312"/>
|
||||||
|
<line x1="260" x2="284" y1="296" y2="296"/>
|
||||||
|
<line x1="260" x2="256" y1="312" y2="312"/>
|
||||||
|
<line x1="284" x2="396" y1="296" y2="296"/>
|
||||||
|
<line x1="396" x2="396" y1="296" y2="312"/>
|
||||||
|
<line x1="396" x2="396" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="284" x2="284" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
||||||
|
<line x1="408" x2="460" y1="104" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="72" y2="104"/>
|
||||||
|
<line x1="460" x2="460" y1="104" y2="120"/>
|
||||||
|
<line x1="460" x2="508" y1="120" y2="120"/>
|
||||||
|
<line x1="508" x2="508" y1="120" y2="144"/>
|
||||||
|
<line x1="508" x2="596" y1="120" y2="120"/>
|
||||||
|
<line x1="596" x2="596" y1="104" y2="120"/>
|
||||||
|
<line x1="596" x2="600" y1="104" y2="104"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
||||||
|
<line x1="408" x2="460" y1="344" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="312" y2="344"/>
|
||||||
|
<line x1="460" x2="460" y1="344" y2="360"/>
|
||||||
|
<line x1="460" x2="596" y1="360" y2="360"/>
|
||||||
|
<line x1="596" x2="596" y1="344" y2="360"/>
|
||||||
|
<line x1="596" x2="600" y1="344" y2="344"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="56" y2="72"/>
|
||||||
|
<line x1="460" x2="596" y1="56" y2="56"/>
|
||||||
|
<line x1="460" x2="456" y1="72" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="56" y2="72"/>
|
||||||
|
<line x1="596" x2="596" y1="72" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="296" y2="312"/>
|
||||||
|
<line x1="460" x2="508" y1="296" y2="296"/>
|
||||||
|
<line x1="460" x2="456" y1="312" y2="312"/>
|
||||||
|
<line x1="508" x2="596" y1="296" y2="296"/>
|
||||||
|
<line x1="596" x2="596" y1="296" y2="312"/>
|
||||||
|
<line x1="596" x2="596" y1="312" y2="344"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="508" x2="508" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
||||||
|
<line x1="608" x2="660" y1="104" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="72" y2="104"/>
|
||||||
|
<line x1="660" x2="660" y1="104" y2="120"/>
|
||||||
|
<line x1="660" x2="684" y1="120" y2="120"/>
|
||||||
|
<line x1="684" x2="684" y1="120" y2="144"/>
|
||||||
|
<line x1="684" x2="796" y1="120" y2="120"/>
|
||||||
|
<line x1="796" x2="796" y1="56" y2="120"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
||||||
|
<line x1="608" x2="660" y1="344" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="312" y2="344"/>
|
||||||
|
<line x1="660" x2="660" y1="344" y2="360"/>
|
||||||
|
<line x1="660" x2="796" y1="360" y2="360"/>
|
||||||
|
<line x1="796" x2="796" y1="296" y2="360"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="56" y2="72"/>
|
||||||
|
<line x1="660" x2="796" y1="56" y2="56"/>
|
||||||
|
<line x1="660" x2="656" y1="72" y2="72"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="660" x2="660" y1="296" y2="312"/>
|
||||||
|
<line x1="660" x2="684" y1="296" y2="296"/>
|
||||||
|
<line x1="660" x2="656" y1="312" y2="312"/>
|
||||||
|
<line x1="684" x2="796" y1="296" y2="296"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="684" x2="684" y1="160" y2="240"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="92">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="161" y="332">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="28">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="353" y="268">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="92">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="332">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="28">
|
||||||
|
Above
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="457" y="268">
|
||||||
|
Below
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="489" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="92">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="561" y="332">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="92">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="689" y="332">
|
||||||
|
Neighbor
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="92">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="761" y="332">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.3 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (1).svg
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="104" y2="232"/>
|
||||||
|
<line x1="4" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="4" x2="540" y1="232" y2="232"/>
|
||||||
|
<line x1="108" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="540" y1="104" y2="104"/>
|
||||||
|
<line x1="540" x2="540" y1="104" y2="232"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="136" y2="200"/>
|
||||||
|
<line x1="36" x2="180" y1="136" y2="136"/>
|
||||||
|
<line x1="36" x2="180" y1="200" y2="200"/>
|
||||||
|
<line x1="180" x2="180" y1="136" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="152" y2="184"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="184" y2="200"/>
|
||||||
|
<line x1="180" x2="184" y1="184" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
||||||
|
<line x1="108" x2="212" y1="40" y2="40"/>
|
||||||
|
<line x1="212" x2="212" y1="8" y2="40"/>
|
||||||
|
<line x1="212" x2="332" y1="8" y2="8"/>
|
||||||
|
<line x1="212" x2="212" y1="40" y2="72"/>
|
||||||
|
<line x1="212" x2="332" y1="72" y2="72"/>
|
||||||
|
<line x1="332" x2="332" y1="8" y2="40"/>
|
||||||
|
<line x1="332" x2="332" y1="40" y2="72"/>
|
||||||
|
<line x1="332" x2="436" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
||||||
|
<line x1="192" x2="364" y1="184" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="184" y2="200"/>
|
||||||
|
<line x1="364" x2="508" y1="200" y2="200"/>
|
||||||
|
<line x1="508" x2="508" y1="136" y2="200"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="508" y1="136" y2="136"/>
|
||||||
|
<line x1="364" x2="360" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="172">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="44">
|
||||||
|
Leader
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="140">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="172">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (2).svg
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="104" y2="232"/>
|
||||||
|
<line x1="4" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="4" x2="540" y1="232" y2="232"/>
|
||||||
|
<line x1="108" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="540" y1="104" y2="104"/>
|
||||||
|
<line x1="540" x2="540" y1="104" y2="232"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="136" y2="200"/>
|
||||||
|
<line x1="36" x2="180" y1="136" y2="136"/>
|
||||||
|
<line x1="36" x2="180" y1="200" y2="200"/>
|
||||||
|
<line x1="180" x2="180" y1="136" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="152" y2="184"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="184" y2="200"/>
|
||||||
|
<line x1="180" x2="184" y1="184" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
||||||
|
<line x1="108" x2="212" y1="40" y2="40"/>
|
||||||
|
<line x1="212" x2="212" y1="8" y2="40"/>
|
||||||
|
<line x1="212" x2="332" y1="8" y2="8"/>
|
||||||
|
<line x1="212" x2="212" y1="40" y2="72"/>
|
||||||
|
<line x1="212" x2="332" y1="72" y2="72"/>
|
||||||
|
<line x1="332" x2="332" y1="8" y2="40"/>
|
||||||
|
<line x1="332" x2="332" y1="40" y2="72"/>
|
||||||
|
<line x1="332" x2="436" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
||||||
|
<line x1="192" x2="364" y1="184" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="184" y2="200"/>
|
||||||
|
<line x1="364" x2="508" y1="200" y2="200"/>
|
||||||
|
<line x1="508" x2="508" y1="136" y2="200"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="508" y1="136" y2="136"/>
|
||||||
|
<line x1="364" x2="360" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="172">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="44">
|
||||||
|
Leader
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="140">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="172">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
156
book/src/.gitbook/assets/data-plane-seeding (3).svg
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
rect.backdrop {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
text{
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
line {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fg_fill {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.bg_fill {
|
||||||
|
fill: white;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect class="backdrop" height="240" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="104" y2="232"/>
|
||||||
|
<line x1="4" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="4" x2="540" y1="232" y2="232"/>
|
||||||
|
<line x1="108" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="540" y1="104" y2="104"/>
|
||||||
|
<line x1="540" x2="540" y1="104" y2="232"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="136" y2="200"/>
|
||||||
|
<line x1="36" x2="180" y1="136" y2="136"/>
|
||||||
|
<line x1="36" x2="180" y1="200" y2="200"/>
|
||||||
|
<line x1="180" x2="180" y1="136" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="152" y2="184"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="184" y2="200"/>
|
||||||
|
<line x1="180" x2="184" y1="184" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
||||||
|
<line x1="108" x2="212" y1="40" y2="40"/>
|
||||||
|
<line x1="212" x2="212" y1="8" y2="40"/>
|
||||||
|
<line x1="212" x2="332" y1="8" y2="8"/>
|
||||||
|
<line x1="212" x2="212" y1="40" y2="72"/>
|
||||||
|
<line x1="212" x2="332" y1="72" y2="72"/>
|
||||||
|
<line x1="332" x2="332" y1="8" y2="40"/>
|
||||||
|
<line x1="332" x2="332" y1="40" y2="72"/>
|
||||||
|
<line x1="332" x2="436" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
||||||
|
<line x1="192" x2="364" y1="184" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="184" y2="200"/>
|
||||||
|
<line x1="364" x2="508" y1="200" y2="200"/>
|
||||||
|
<line x1="508" x2="508" y1="136" y2="200"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="508" y1="136" y2="136"/>
|
||||||
|
<line x1="364" x2="360" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="172">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="44">
|
||||||
|
Leader
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="140">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="172">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (4).svg
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="104" y2="232"/>
|
||||||
|
<line x1="4" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="4" x2="540" y1="232" y2="232"/>
|
||||||
|
<line x1="108" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="540" y1="104" y2="104"/>
|
||||||
|
<line x1="540" x2="540" y1="104" y2="232"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="136" y2="200"/>
|
||||||
|
<line x1="36" x2="180" y1="136" y2="136"/>
|
||||||
|
<line x1="36" x2="180" y1="200" y2="200"/>
|
||||||
|
<line x1="180" x2="180" y1="136" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="152" y2="184"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="184" y2="200"/>
|
||||||
|
<line x1="180" x2="184" y1="184" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
||||||
|
<line x1="108" x2="212" y1="40" y2="40"/>
|
||||||
|
<line x1="212" x2="212" y1="8" y2="40"/>
|
||||||
|
<line x1="212" x2="332" y1="8" y2="8"/>
|
||||||
|
<line x1="212" x2="212" y1="40" y2="72"/>
|
||||||
|
<line x1="212" x2="332" y1="72" y2="72"/>
|
||||||
|
<line x1="332" x2="332" y1="8" y2="40"/>
|
||||||
|
<line x1="332" x2="332" y1="40" y2="72"/>
|
||||||
|
<line x1="332" x2="436" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
||||||
|
<line x1="192" x2="364" y1="184" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="184" y2="200"/>
|
||||||
|
<line x1="364" x2="508" y1="200" y2="200"/>
|
||||||
|
<line x1="508" x2="508" y1="136" y2="200"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="508" y1="136" y2="136"/>
|
||||||
|
<line x1="364" x2="360" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="172">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="44">
|
||||||
|
Leader
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="140">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="172">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
138
book/src/.gitbook/assets/data-plane-seeding (5).svg
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="104" y2="232"/>
|
||||||
|
<line x1="4" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="4" x2="540" y1="232" y2="232"/>
|
||||||
|
<line x1="108" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="540" y1="104" y2="104"/>
|
||||||
|
<line x1="540" x2="540" y1="104" y2="232"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="136" y2="200"/>
|
||||||
|
<line x1="36" x2="180" y1="136" y2="136"/>
|
||||||
|
<line x1="36" x2="180" y1="200" y2="200"/>
|
||||||
|
<line x1="180" x2="180" y1="136" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="152" y2="184"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="184" y2="200"/>
|
||||||
|
<line x1="180" x2="184" y1="184" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
||||||
|
<line x1="108" x2="212" y1="40" y2="40"/>
|
||||||
|
<line x1="212" x2="212" y1="8" y2="40"/>
|
||||||
|
<line x1="212" x2="332" y1="8" y2="8"/>
|
||||||
|
<line x1="212" x2="212" y1="40" y2="72"/>
|
||||||
|
<line x1="212" x2="332" y1="72" y2="72"/>
|
||||||
|
<line x1="332" x2="332" y1="8" y2="40"/>
|
||||||
|
<line x1="332" x2="332" y1="40" y2="72"/>
|
||||||
|
<line x1="332" x2="436" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
||||||
|
<line x1="192" x2="364" y1="184" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="184" y2="200"/>
|
||||||
|
<line x1="364" x2="508" y1="200" y2="200"/>
|
||||||
|
<line x1="508" x2="508" y1="136" y2="200"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="508" y1="136" y2="136"/>
|
||||||
|
<line x1="364" x2="360" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="172">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="44">
|
||||||
|
Leader
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="140">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="172">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
138
book/src/.gitbook/assets/data-plane-seeding.svg
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="104" y2="232"/>
|
||||||
|
<line x1="4" x2="108" y1="104" y2="104"/>
|
||||||
|
<line x1="4" x2="540" y1="232" y2="232"/>
|
||||||
|
<line x1="108" x2="436" y1="104" y2="104"/>
|
||||||
|
<line x1="436" x2="540" y1="104" y2="104"/>
|
||||||
|
<line x1="540" x2="540" y1="104" y2="232"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="36" x2="36" y1="136" y2="200"/>
|
||||||
|
<line x1="36" x2="180" y1="136" y2="136"/>
|
||||||
|
<line x1="36" x2="180" y1="200" y2="200"/>
|
||||||
|
<line x1="180" x2="180" y1="136" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="152" y2="184"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
||||||
|
<line x1="180" x2="180" y1="184" y2="200"/>
|
||||||
|
<line x1="180" x2="184" y1="184" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
||||||
|
<line x1="108" x2="212" y1="40" y2="40"/>
|
||||||
|
<line x1="212" x2="212" y1="8" y2="40"/>
|
||||||
|
<line x1="212" x2="332" y1="8" y2="8"/>
|
||||||
|
<line x1="212" x2="212" y1="40" y2="72"/>
|
||||||
|
<line x1="212" x2="332" y1="72" y2="72"/>
|
||||||
|
<line x1="332" x2="332" y1="8" y2="40"/>
|
||||||
|
<line x1="332" x2="332" y1="40" y2="72"/>
|
||||||
|
<line x1="332" x2="436" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
||||||
|
<line x1="192" x2="364" y1="184" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="152" y2="184"/>
|
||||||
|
<line x1="364" x2="364" y1="184" y2="200"/>
|
||||||
|
<line x1="364" x2="508" y1="200" y2="200"/>
|
||||||
|
<line x1="508" x2="508" y1="136" y2="200"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="364" x2="364" y1="136" y2="152"/>
|
||||||
|
<line x1="364" x2="508" y1="136" y2="136"/>
|
||||||
|
<line x1="364" x2="360" y1="152" y2="152"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="145" y="172">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="44">
|
||||||
|
Leader
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="140">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="172">
|
||||||
|
Validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="172">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
192
book/src/.gitbook/assets/data-plane.svg
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="4" x2="4" y1="216" y2="280"/>
|
||||||
|
<line x1="4" x2="156" y1="216" y2="216"/>
|
||||||
|
<line x1="4" x2="172" y1="280" y2="280"/>
|
||||||
|
<line x1="156" x2="172" y1="216" y2="216"/>
|
||||||
|
<line x1="172" x2="172" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="104" y2="168"/>
|
||||||
|
<line x1="124" x2="204" y1="104" y2="104"/>
|
||||||
|
<line x1="124" x2="156" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
||||||
|
<line x1="156" x2="204" y1="168" y2="168"/>
|
||||||
|
<line x1="204" x2="292" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
||||||
|
<line x1="204" x2="292" y1="168" y2="168"/>
|
||||||
|
<line x1="292" x2="292" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="216" y2="280"/>
|
||||||
|
<line x1="188" x2="204" y1="216" y2="216"/>
|
||||||
|
<line x1="188" x2="356" y1="280" y2="280"/>
|
||||||
|
<line x1="204" x2="356" y1="216" y2="216"/>
|
||||||
|
<line x1="356" x2="356" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
||||||
|
<line x1="204" x2="276" y1="40" y2="40"/>
|
||||||
|
<line x1="276" x2="276" y1="8" y2="40"/>
|
||||||
|
<line x1="276" x2="444" y1="8" y2="8"/>
|
||||||
|
<line x1="276" x2="276" y1="40" y2="72"/>
|
||||||
|
<line x1="276" x2="444" y1="72" y2="72"/>
|
||||||
|
<line x1="444" x2="444" y1="8" y2="40"/>
|
||||||
|
<line x1="444" x2="444" y1="40" y2="72"/>
|
||||||
|
<line x1="444" x2="532" y1="40" y2="40"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="380" x2="380" y1="216" y2="280"/>
|
||||||
|
<line x1="380" x2="532" y1="216" y2="216"/>
|
||||||
|
<line x1="380" x2="548" y1="280" y2="280"/>
|
||||||
|
<line x1="532" x2="548" y1="216" y2="216"/>
|
||||||
|
<line x1="548" x2="548" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="444" x2="444" y1="104" y2="168"/>
|
||||||
|
<line x1="444" x2="532" y1="104" y2="104"/>
|
||||||
|
<line x1="444" x2="532" y1="168" y2="168"/>
|
||||||
|
<line x1="532" x2="612" y1="104" y2="104"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
||||||
|
<line x1="532" x2="580" y1="168" y2="168"/>
|
||||||
|
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
||||||
|
<line x1="580" x2="612" y1="168" y2="168"/>
|
||||||
|
<line x1="612" x2="612" y1="104" y2="168"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="564" x2="564" y1="216" y2="280"/>
|
||||||
|
<line x1="564" x2="580" y1="216" y2="216"/>
|
||||||
|
<line x1="564" x2="732" y1="280" y2="280"/>
|
||||||
|
<line x1="580" x2="732" y1="216" y2="216"/>
|
||||||
|
<line x1="732" x2="732" y1="216" y2="280"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="252">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="153" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="217" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="44">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="321" y="252">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="44">
|
||||||
|
0
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="473" y="140">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="252">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="140">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="252">
|
||||||
|
Neighborhood
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="697" y="252">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
330
book/src/.gitbook/assets/fork-generation (1).svg
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation (2).svg
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation (3).svg
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
348
book/src/.gitbook/assets/fork-generation (4).svg
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
rect.backdrop {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
text{
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
line {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fg_fill {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.bg_fill {
|
||||||
|
fill: white;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect class="backdrop" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
330
book/src/.gitbook/assets/fork-generation (5).svg
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation-3.svg
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
330
book/src/.gitbook/assets/fork-generation.svg
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="124" x2="124" y1="24" y2="56"/>
|
||||||
|
<line x1="124" x2="164" y1="24" y2="24"/>
|
||||||
|
<line x1="124" x2="124" y1="56" y2="88"/>
|
||||||
|
<line x1="124" x2="164" y1="56" y2="56"/>
|
||||||
|
<line x1="124" x2="124" y1="88" y2="120"/>
|
||||||
|
<line x1="124" x2="164" y1="88" y2="88"/>
|
||||||
|
<line x1="124" x2="124" y1="120" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="120" y2="120"/>
|
||||||
|
<line x1="124" x2="124" y1="152" y2="184"/>
|
||||||
|
<line x1="124" x2="164" y1="152" y2="152"/>
|
||||||
|
<line x1="124" x2="164" y1="184" y2="184"/>
|
||||||
|
<line x1="164" x2="164" y1="24" y2="56"/>
|
||||||
|
<line x1="164" x2="164" y1="56" y2="88"/>
|
||||||
|
<line x1="164" x2="164" y1="88" y2="120"/>
|
||||||
|
<line x1="164" x2="164" y1="120" y2="152"/>
|
||||||
|
<line x1="164" x2="164" y1="152" y2="184"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="188" x2="188" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="200" x2="208" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="224" x2="236" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="232" x2="240" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="236" x2="236" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="260" x2="260" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="264" x2="272" y1="64" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="272" x2="280" y1="128" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="304" x2="316" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="316" x2="316" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="360" y1="136" y2="112"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="348" x2="348" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="368" x2="376" y1="96" y2="80"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="384" y1="48" y2="64"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="376" x2="388" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="388" x2="388" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="416" x2="424" y1="80" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="420" x2="420" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="436" x2="420" y1="104" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="448" x2="460" y1="112" y2="136"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="460" x2="460" y1="144" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="512" x2="640" y1="24" y2="24"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="108">
|
||||||
|
time
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="44">
|
||||||
|
L1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="76">
|
||||||
|
L2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="108">
|
||||||
|
L3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="140">
|
||||||
|
L4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="137" y="172">
|
||||||
|
L5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="140">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="185" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="209" y="108">
|
||||||
|
E3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="225" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="249" y="76">
|
||||||
|
E2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="140">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="257" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="289" y="108">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="305" y="172">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="313" y="44">
|
||||||
|
E1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="337" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="361" y="108">
|
||||||
|
E3'
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="377" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="393" y="76">
|
||||||
|
x
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="409" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="449" y="172">
|
||||||
|
xx
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="12">
|
||||||
|
validator
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="60">
|
||||||
|
vote(E1)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="92">
|
||||||
|
vote(E2)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="124">
|
||||||
|
slash(E3)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="156">
|
||||||
|
vote(E4)
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="513" y="188">
|
||||||
|
hang
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="553" y="188">
|
||||||
|
on
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="577" y="188">
|
||||||
|
to
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="593" y="12">
|
||||||
|
action
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="601" y="188">
|
||||||
|
E4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="625" y="188">
|
||||||
|
and
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="657" y="188">
|
||||||
|
E5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="681" y="188">
|
||||||
|
for
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="713" y="188">
|
||||||
|
more...
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
122
book/src/.gitbook/assets/forks (1).svg
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="48" x2="64" y1="16" y2="48"/>
|
||||||
|
<line x1="68" x2="64" y1="56" y2="48"/>
|
||||||
|
<line x1="68" x2="68" y1="64" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="68" x2="68" y1="80" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="72" x2="80" y1="80" y2="96"/>
|
||||||
|
<line x1="80" x2="88" y1="96" y2="112"/>
|
||||||
|
<line x1="92" x2="88" y1="120" y2="112"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="120"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="192"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="204">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
140
book/src/.gitbook/assets/forks (2).svg
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
rect.backdrop {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
text{
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
line {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fg_fill {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.bg_fill {
|
||||||
|
fill: white;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect class="backdrop" height="208" width="96" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="48" x2="64" y1="16" y2="48"/>
|
||||||
|
<line x1="68" x2="64" y1="56" y2="48"/>
|
||||||
|
<line x1="68" x2="68" y1="64" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="68" x2="68" y1="80" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="72" x2="80" y1="80" y2="96"/>
|
||||||
|
<line x1="80" x2="88" y1="96" y2="112"/>
|
||||||
|
<line x1="92" x2="88" y1="120" y2="112"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="120"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="192"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="204">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
122
book/src/.gitbook/assets/forks (3).svg
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="48" x2="64" y1="16" y2="48"/>
|
||||||
|
<line x1="68" x2="64" y1="56" y2="48"/>
|
||||||
|
<line x1="68" x2="68" y1="64" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="68" x2="68" y1="80" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="72" x2="80" y1="80" y2="96"/>
|
||||||
|
<line x1="80" x2="88" y1="96" y2="112"/>
|
||||||
|
<line x1="92" x2="88" y1="120" y2="112"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="120"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="192"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="204">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
122
book/src/.gitbook/assets/forks (4).svg
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="48" x2="64" y1="16" y2="48"/>
|
||||||
|
<line x1="68" x2="64" y1="56" y2="48"/>
|
||||||
|
<line x1="68" x2="68" y1="64" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="68" x2="68" y1="80" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="72" x2="80" y1="80" y2="96"/>
|
||||||
|
<line x1="80" x2="88" y1="96" y2="112"/>
|
||||||
|
<line x1="92" x2="88" y1="120" y2="112"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="120"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="192"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="204">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
122
book/src/.gitbook/assets/forks (5).svg
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="48" x2="64" y1="16" y2="48"/>
|
||||||
|
<line x1="68" x2="64" y1="56" y2="48"/>
|
||||||
|
<line x1="68" x2="68" y1="64" y2="56"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="68" x2="68" y1="80" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="72" x2="80" y1="80" y2="96"/>
|
||||||
|
<line x1="80" x2="88" y1="96" y2="112"/>
|
||||||
|
<line x1="92" x2="88" y1="120" y2="112"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="120"/>
|
||||||
|
<line x1="92" x2="92" y1="128" y2="192"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="76">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="65" y="172">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="89" y="204">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
92
book/src/.gitbook/assets/forks-pruned (1).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (2).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (3).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (4).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned (5).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
||||||
|
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
||||||
|
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="black" r="8"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
||||||
|
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
||||||
|
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
line,path {
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
line.dashed {
|
||||||
|
stroke-dasharray: 5;
|
||||||
|
}
|
||||||
|
circle.solid {
|
||||||
|
fill:black;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
circle.open {
|
||||||
|
fill:none;
|
||||||
|
stroke: black;
|
||||||
|
stroke-width: 2;
|
||||||
|
stroke-opacity: 1;
|
||||||
|
fill-opacity: 1;
|
||||||
|
stroke-linecap: round;
|
||||||
|
stroke-linejoin: miter;
|
||||||
|
}
|
||||||
|
tspan.head{
|
||||||
|
fill: none;
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="20" x2="24" y1="88" y2="80"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="88"/>
|
||||||
|
<line x1="20" x2="20" y1="96" y2="128"/>
|
||||||
|
<line x1="24" x2="40" y1="80" y2="48"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="44" x2="44" y1="48" y2="96"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="17" y="140">
|
||||||
|
5
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="44">
|
||||||
|
2
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="41" y="108">
|
||||||
|
4
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |