Compare commits
1998 Commits
Author | SHA1 | Date | |
---|---|---|---|
f1e9a944ef | |||
4cb38ddf01 | |||
593fde628c | |||
34fa025b17 | |||
33843f824a | |||
542bda0a6f | |||
d8bdbbf291 | |||
168b0f71f5 | |||
be79d97dde | |||
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 | |||
d36af917ea | |||
c81733b41a | |||
b6558a2ef3 | |||
634d8e25ee | |||
fea212e64e | |||
e3ab76f1a7 | |||
87f1bd58b9 | |||
a056c1f18f | |||
8b34fd2c75 | |||
b912ee7fdf | |||
3cf708f019 | |||
070e0e9613 | |||
3e678511d2 | |||
4ce2105548 | |||
721c6a7e2d | |||
08f0fb1e14 | |||
f5f5281f85 | |||
1684a7bd18 | |||
8b1724bb70 | |||
eebdfe8d73 | |||
82776b333d | |||
e71ab55288 | |||
fd60ef8a8d | |||
aa0b67c93c | |||
15aa07f2a0 | |||
e4536621df | |||
a3c302c36a | |||
d12705f9b0 | |||
0add5c1dc8 | |||
a9e63455a1 | |||
4dc0495a1b | |||
5a79676b8a | |||
b67b0bff05 | |||
4c200635b7 | |||
b98200aca4 | |||
d59c1cd412 | |||
c4d9dff590 | |||
cf91ff8694 | |||
e867ce0944 | |||
29a25990d3 | |||
9a40ad76bd | |||
54b44977e0 | |||
9c7ccc0e2b | |||
7710ef8b2b | |||
c969975fde | |||
3eed6a6090 | |||
1661a7a55f | |||
6293d324db | |||
c1ecfec3b0 | |||
05b4dbf148 | |||
4efada6d84 | |||
23c01473a0 | |||
f2e2106f62 | |||
0cbac26591 | |||
4e7e5ace9d | |||
ab11327e34 | |||
3ba93aa8fe | |||
c309cd80aa | |||
d22a1c9b1f | |||
29698fcd38 | |||
7372ec9e1a | |||
840a64ee8b | |||
524bc2b9a6 | |||
62a29a41d1 | |||
5406d82d89 | |||
de6af95061 | |||
43f7cd8149 | |||
69e67d06a7 | |||
4f47fc00bc | |||
4b04c37c36 | |||
b27b515186 | |||
05bcb7f292 | |||
95a16426f3 | |||
bec094bb3e | |||
af9ebf1d1a | |||
6f2f7018e8 | |||
101d6b92ee | |||
349e8a9462 | |||
c0bffb56df | |||
970cc32e65 | |||
3ab492ccf8 | |||
d83a71d89f | |||
efbb573316 | |||
85554087d1 | |||
c3155a6e39 | |||
4abe95abec | |||
e0acd48944 | |||
afb00432d4 | |||
320bd66c84 | |||
1a9ac62f60 | |||
809b051f10 | |||
baac21209e | |||
5fb8baed04 | |||
512bfc93cb | |||
0f88872650 | |||
f4e40d2c41 | |||
6eac5951ed | |||
475a74d37f | |||
b8ee952135 | |||
15bed29afa | |||
6dbe7e8bee | |||
2cd556e43c | |||
060793f451 | |||
7e409a13cd | |||
aab410380e | |||
67b8ad6a0f | |||
c1e39a3b98 | |||
7e1a7b1f64 | |||
a9cfae486c | |||
8514d27c2f | |||
8999bfef65 | |||
96425fb520 | |||
ce505d24b1 | |||
f2187780d2 | |||
6a878602f2 | |||
f8543a268f | |||
e9b82bacda | |||
684e1c73dd | |||
901c74b653 | |||
2c0afe71b2 | |||
2f4a3ed190 | |||
26a7eb6fa5 | |||
aa21f5343a | |||
9c2809db21 | |||
9ccd362461 | |||
596f611ede | |||
78d5ace754 | |||
2b3218b5f2 | |||
d0fb55d9b1 | |||
a2c8e3952f | |||
beb8c7914e | |||
6bef16a6a1 | |||
e03215c4c0 | |||
8d1fd29fa6 | |||
46f655eddd | |||
ca36a6f4e0 | |||
fdb12b54fa | |||
09dd4bb702 | |||
01657ddfe7 | |||
51a2988bb2 | |||
083090817a | |||
f3676e2d03 | |||
4b8cb72977 | |||
2518e95fb0 | |||
bc17edcda3 | |||
eb185b9ea5 | |||
aa6c82cfdc | |||
b9bb5af4a5 | |||
1e20d449ce | |||
e94f268346 | |||
7ec198b9cc | |||
b2e762ccc6 | |||
bee411e826 | |||
34344982a9 | |||
f73d38739a | |||
63d66ece57 | |||
a4b5493ba1 | |||
8d613f3977 | |||
0ff2bfdd0c | |||
141e25d567 | |||
c67cc694ae | |||
d77359914f | |||
9293a54234 | |||
d9983905b3 | |||
3dc47a46d5 | |||
8638b3bb19 |
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:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:rHBSqXK7uSnveA4qwUxARZjTNZcA0hXU:ko8lLGwPECpVm19znWBRxKEpMF7xpTHBCEzVOxRar2wDThw4lNDAKqTS61vtkJLtdkHtug==]",
|
"CODECOV_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:JnxhrIxh09AvqdJgrVSYmb7PxSrh19aE:07WzVExCHEd1lJ1m8QizRRthGri+WBNeZRKjjEvsy5eo4gv3HD7zVEm42tVTGkqITKkBNQ==]",
|
||||||
"CRATES_IO_TOKEN": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:NzN6y0ooXJBYvxB589khepthSxhKFkLB:ZTTFZh2A/kB2SAgjJJAMbwAfanRlzxOCNMVcA2MXBCpQHJeeZGULg+0MLACYswfS]",
|
"CRATES_IO_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:d0jJqC32/axwzq/N7kMRmpxKhnRrhtpt:zvcPHwkOzGnjhNkAQSejwdy1Jkr9wR1qXFFCnfIjyt/XQYubzB1tLkoly/qdmeb5]",
|
||||||
"GITHUB_TOKEN": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:iy0Fnxeo0aslTCvgXc5Ddj2ly6ZsQ8gK:GNOOj/kZUJ2rYKxTbLyVKtajWNoGQ3PcChwfEB4HdN18qDHlB96Z7gx01Pcf0qeIHODOWRtxlH4=]",
|
"GEOLOCATION_API_KEY": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R4gfB6Ey4i50HyfLt4UZDLBqg3qHEUye:UfZCOgt8XI6Y2g+ivCRVoS1fjFycFs7/GSevvCqh1B50mG0+hzpEyzXQLuKG5OeI]",
|
||||||
"INFLUX_DATABASE": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:Ly/TpIRF0oCxmiBWv225S3mX8s6pfQR+:+tXGB2c9rRCVDcgNO1IDOo89]",
|
"GITHUB_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Vq2dkGTOzfEpRht0BAGHFp/hDogMvXJe:tFXHg1epVt2mq9hkuc5sRHe+KAnVREi/p8S+IZu67XRyzdiA/nGak1k860FXYuuzuaE0QWekaEc=]",
|
||||||
"INFLUX_PASSWORD": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:ycrq1uQLoSfI932czD+krUOaJeLWpeq6:2iS7ukp/C7wVD3IT0GvQVcwccWGyLr4UocStF/XiDi0OB/N3YKIKN8SQU4ob1b6StAPZ/XOHmag=]",
|
"INFLUX_DATABASE": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:5KI9WBkXx3R/W4m256mU5MJOE7N8aAT9:Cb8QFELZ9I60t5zhJ9h55Kcs]",
|
||||||
"INFLUX_USERNAME": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:35hBKofakZ4Db/u0TOW53RXoNWzJTIcl:HWREcMTrgZ8DGB0ZupgSzNWr/tVyE06P]",
|
"INFLUX_PASSWORD": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:hQRMpLCrav+OYkNphkeM4hagdVoZv5Iw:AUO76rr6+gF1OLJA8ZLSG8wHKXgYCPNk6gRCV8rBhZBJ4KwDaxpvOhMl7bxxXG6jol7v4aRa/Lk=]",
|
||||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:kRz8CyJYKAg/AiwgLrcRNDJAmlRX2zvX:uV1XV6y2Fb+dN4Z9BIMPBRiNS3n+NL8GlJXyu1i7meIsph1DzfLg4Thcp5Mj9nUsFNLgqQgjnsa5C4XNY/h5AgMSzRrJxVj7RhVTRmDJ5/Vjq6v7wCMRfBOvF3rITsV4zTwWSV8yafFmS+ZQ+QJTRgtYsuoYAUNZ06IEebfDHcuNwws72hEGoD9w43hOLSpyEOmXbtZ9h1lIRxrgsrhYDpBlU5LkhDeTXAX5M5dwYxyquJFRwd5quGDV5DYsCh9bAkbjAyjWYymVJ78U9YJIQHT9izzQqTDlMQN49EbLo7MDIaC7O7HVtb7unDJs+DRejbHacoyWVulqVVwu3GRiZezu8zdjwzGHphMMxOtKQaidnqYgflNp/O01I8wZRgR1alsGcmIhEhI8YV/IvQ==]"
|
"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 \
|
||||||
|
"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
|
||||||
|
buildkite-agent annotate --style info --context pr-backlink \
|
||||||
|
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
if [[ $BUILDKITE_MESSAGE =~ GitBook: ]]; then
|
||||||
# Add helpful link back to the corresponding Github Pull Request
|
buildkite-agent annotate --style info --context gitbook-ci-skip \
|
||||||
buildkite-agent annotate --style info --context pr-backlink \
|
"GitBook commit detected, CI skipped"
|
||||||
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
buildkite-agent pipeline upload ci/buildkite.yml
|
||||||
fi
|
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.
|
15
.gitignore
vendored
@ -1,18 +1,16 @@
|
|||||||
/target/
|
|
||||||
/ledger-tool/target/
|
|
||||||
/wallet/target/
|
|
||||||
/core/target/
|
|
||||||
/book/html/
|
/book/html/
|
||||||
/book/src/img/
|
|
||||||
/book/src/tests.ok
|
/book/src/tests.ok
|
||||||
|
/farf/
|
||||||
|
/solana-release/
|
||||||
|
/solana-release.tar.bz2
|
||||||
|
/solana-metrics/
|
||||||
|
/solana-metrics.tar.bz2
|
||||||
|
/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
|
||||||
@ -21,3 +19,4 @@ log-*.txt
|
|||||||
# intellij files
|
# intellij files
|
||||||
/.idea/
|
/.idea/
|
||||||
/solana.iml
|
/solana.iml
|
||||||
|
/.vscode/
|
||||||
|
77
.mergify.yml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# 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.16 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.16
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.16
|
||||||
|
- name: v0.17 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.17
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.17
|
||||||
|
- name: v0.18 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.18
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.18
|
||||||
|
- name: v0.19 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.19
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.19
|
||||||
|
- name: v0.20 backport
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- label=v0.20
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.20
|
||||||
|
- 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
|
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
|
||||||
|
5006
Cargo.lock
generated
44
Cargo.toml
@ -1,40 +1,64 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
".",
|
"bench-exchange",
|
||||||
"bench-streamer",
|
"bench-streamer",
|
||||||
"bench-tps",
|
"bench-tps",
|
||||||
|
"banking_bench",
|
||||||
|
"chacha-sys",
|
||||||
|
"client",
|
||||||
|
"core",
|
||||||
"drone",
|
"drone",
|
||||||
"fullnode",
|
"validator",
|
||||||
"genesis",
|
"genesis",
|
||||||
|
"genesis_programs",
|
||||||
"gossip",
|
"gossip",
|
||||||
"install",
|
"install",
|
||||||
"keygen",
|
"keygen",
|
||||||
"kvstore",
|
"ledger",
|
||||||
"ledger-tool",
|
"ledger-tool",
|
||||||
|
"local_cluster",
|
||||||
"logger",
|
"logger",
|
||||||
|
"merkle-tree",
|
||||||
|
"measure",
|
||||||
"metrics",
|
"metrics",
|
||||||
"programs/bpf",
|
"programs/bpf_loader_api",
|
||||||
"programs/bpf_loader",
|
"programs/bpf_loader_program",
|
||||||
"programs/budget_api",
|
"programs/budget_api",
|
||||||
"programs/budget_program",
|
"programs/budget_program",
|
||||||
|
"programs/btc_spv_program",
|
||||||
|
"programs/btc_spv_api",
|
||||||
|
"programs/btc_spv_bin",
|
||||||
"programs/config_api",
|
"programs/config_api",
|
||||||
"programs/config_program",
|
"programs/config_program",
|
||||||
|
"programs/config_tests",
|
||||||
"programs/exchange_api",
|
"programs/exchange_api",
|
||||||
"programs/exchange_program",
|
"programs/exchange_program",
|
||||||
"programs/token_api",
|
|
||||||
"programs/token_program",
|
|
||||||
"programs/failure_program",
|
"programs/failure_program",
|
||||||
|
"programs/move_loader_api",
|
||||||
|
"programs/move_loader_program",
|
||||||
|
"programs/librapay_api",
|
||||||
"programs/noop_program",
|
"programs/noop_program",
|
||||||
"programs/stake_api",
|
"programs/stake_api",
|
||||||
"programs/stake_program",
|
"programs/stake_program",
|
||||||
|
"programs/stake_tests",
|
||||||
"programs/storage_api",
|
"programs/storage_api",
|
||||||
"programs/storage_program",
|
"programs/storage_program",
|
||||||
|
"programs/vest_api",
|
||||||
|
"programs/vest_program",
|
||||||
"programs/vote_api",
|
"programs/vote_api",
|
||||||
"programs/vote_program",
|
"programs/vote_program",
|
||||||
"replicator",
|
"archiver",
|
||||||
|
"runtime",
|
||||||
"sdk",
|
"sdk",
|
||||||
|
"sdk-c",
|
||||||
"upload-perf",
|
"upload-perf",
|
||||||
|
"netutil",
|
||||||
|
"fixed-buf",
|
||||||
"vote-signer",
|
"vote-signer",
|
||||||
"wallet",
|
"cli",
|
||||||
|
"rayon-threadlimit",
|
||||||
|
]
|
||||||
|
|
||||||
|
exclude = [
|
||||||
|
"programs/bpf",
|
||||||
]
|
]
|
||||||
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.38.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/
|
18
archiver/Cargo.toml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
name = "solana-archiver"
|
||||||
|
version = "0.20.0"
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = "2.33.0"
|
||||||
|
console = "0.9.0"
|
||||||
|
solana-core = { path = "../core", version = "0.20.0" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.20.0" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
||||||
|
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
||||||
|
|
125
archiver/src/main.rs
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
||||||
|
use console::style;
|
||||||
|
use solana_core::archiver::Archiver;
|
||||||
|
use solana_core::cluster_info::{Node, VALIDATOR_PORT_RANGE};
|
||||||
|
use solana_core::contact_info::ContactInfo;
|
||||||
|
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
||||||
|
use std::net::SocketAddr;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::process::exit;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
// Return an error if a keypair file cannot be parsed.
|
||||||
|
fn is_keypair(string: String) -> Result<(), String> {
|
||||||
|
read_keypair_file(&string)
|
||||||
|
.map(|_| ())
|
||||||
|
.map_err(|err| format!("{:?}", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
solana_logger::setup();
|
||||||
|
|
||||||
|
let matches = App::new(crate_name!())
|
||||||
|
.about(crate_description!())
|
||||||
|
.version(crate_version!())
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("identity")
|
||||||
|
.short("i")
|
||||||
|
.long("identity")
|
||||||
|
.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_netutil::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)
|
||||||
|
.required(true)
|
||||||
|
.validator(is_keypair)
|
||||||
|
.help("File containing the storage account keypair"),
|
||||||
|
)
|
||||||
|
.get_matches();
|
||||||
|
|
||||||
|
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
||||||
|
|
||||||
|
let keypair = if let Some(identity) = matches.value_of("identity") {
|
||||||
|
read_keypair_file(identity).unwrap_or_else(|err| {
|
||||||
|
eprintln!("{}: Unable to open keypair file: {}", err, identity);
|
||||||
|
exit(1);
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Keypair::new()
|
||||||
|
};
|
||||||
|
let storage_keypair = if let Some(storage_keypair) = matches.value_of("storage_keypair") {
|
||||||
|
read_keypair_file(storage_keypair).unwrap_or_else(|err| {
|
||||||
|
eprintln!("{}: Unable to open keypair file: {}", err, storage_keypair);
|
||||||
|
exit(1);
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Keypair::new()
|
||||||
|
};
|
||||||
|
|
||||||
|
let entrypoint_addr = matches
|
||||||
|
.value_of("entrypoint")
|
||||||
|
.map(|entrypoint| {
|
||||||
|
solana_netutil::parse_host_port(entrypoint).expect("failed to parse entrypoint address")
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let gossip_addr = {
|
||||||
|
let ip = solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap();
|
||||||
|
let mut addr = SocketAddr::new(ip, 0);
|
||||||
|
addr.set_ip(solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap());
|
||||||
|
addr
|
||||||
|
};
|
||||||
|
let node =
|
||||||
|
Node::new_archiver_with_external_ip(&keypair.pubkey(), &gossip_addr, VALIDATOR_PORT_RANGE);
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"{} version {} (branch={}, commit={})",
|
||||||
|
style(crate_name!()).bold(),
|
||||||
|
crate_version!(),
|
||||||
|
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
||||||
|
option_env!("CI_COMMIT").unwrap_or("unknown")
|
||||||
|
);
|
||||||
|
solana_metrics::set_host_id(keypair.pubkey().to_string());
|
||||||
|
println!(
|
||||||
|
"replicating the data with keypair={:?} gossip_addr={:?}",
|
||||||
|
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(keypair),
|
||||||
|
Arc::new(storage_keypair),
|
||||||
|
)
|
||||||
|
.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.20.0"
|
||||||
|
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.20.0" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "0.20.0" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.20.0" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
||||||
|
solana-measure = { path = "../measure", version = "0.20.0" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
||||||
|
rand = "0.6.5"
|
||||||
|
crossbeam-channel = "0.3"
|
322
banking_bench/src/main.rs
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate solana_ledger;
|
||||||
|
extern crate crossbeam_channel;
|
||||||
|
|
||||||
|
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_block, GenesisBlockInfo};
|
||||||
|
use solana_core::packet::to_packets_chunked;
|
||||||
|
use solana_core::poh_recorder::PohRecorder;
|
||||||
|
use solana_core::poh_recorder::WorkingBankEntry;
|
||||||
|
use solana_core::service::Service;
|
||||||
|
use solana_ledger::bank_forks::BankForks;
|
||||||
|
use solana_ledger::blocktree::{get_tmp_ledger_path, Blocktree};
|
||||||
|
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::iter;
|
||||||
|
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 GenesisBlockInfo {
|
||||||
|
genesis_block,
|
||||||
|
mint_keypair,
|
||||||
|
..
|
||||||
|
} = create_genesis_block(mint_total);
|
||||||
|
|
||||||
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
|
let (vote_sender, vote_receiver) = unbounded();
|
||||||
|
let bank0 = Bank::new(&genesis_block);
|
||||||
|
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_block.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_block.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)
|
||||||
|
.into_iter()
|
||||||
|
.map(|x| {
|
||||||
|
let len = x.packets.len();
|
||||||
|
(x, iter::repeat(1).take(len).collect())
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
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,
|
||||||
|
);
|
||||||
|
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.0.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)
|
||||||
|
.into_iter()
|
||||||
|
.map(|x| {
|
||||||
|
let len = x.packets.len();
|
||||||
|
(x, iter::repeat(1).take(len).collect())
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
4
bench-exchange/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
/config/
|
||||||
|
/config-local/
|
||||||
|
/farf/
|
39
bench-exchange/Cargo.toml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
name = "solana-bench-exchange"
|
||||||
|
version = "0.20.0"
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bincode = "1.2.0"
|
||||||
|
bs58 = "0.3.0"
|
||||||
|
clap = "2.32.0"
|
||||||
|
env_logger = "0.7.1"
|
||||||
|
itertools = "0.8.0"
|
||||||
|
log = "0.4.8"
|
||||||
|
num-derive = "0.3"
|
||||||
|
num-traits = "0.2"
|
||||||
|
rand = "0.6.5"
|
||||||
|
rayon = "1.2.0"
|
||||||
|
serde = "1.0.101"
|
||||||
|
serde_derive = "1.0.101"
|
||||||
|
serde_json = "1.0.41"
|
||||||
|
serde_yaml = "0.8.11"
|
||||||
|
# solana-runtime = { path = "../solana/runtime"}
|
||||||
|
solana-core = { path = "../core", version = "0.20.0" }
|
||||||
|
solana-genesis = { path = "../genesis", version = "0.20.0" }
|
||||||
|
solana-client = { path = "../client", version = "0.20.0" }
|
||||||
|
solana-drone = { path = "../drone", version = "0.20.0" }
|
||||||
|
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.0" }
|
||||||
|
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.0" }
|
||||||
|
solana-logger = { path = "../logger", version = "0.20.0" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
||||||
|
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
||||||
|
untrusted = "0.7.0"
|
||||||
|
ws = "0.9.1"
|
479
bench-exchange/README.md
Normal file
@ -0,0 +1,479 @@
|
|||||||
|
# token-exchange
|
||||||
|
Solana Token Exchange Bench
|
||||||
|
|
||||||
|
If you can't wait; jump to [Running the exchange](#Running-the-exchange) to
|
||||||
|
learn how to start and interact with the exchange.
|
||||||
|
|
||||||
|
### Table of Contents
|
||||||
|
[Overview](#Overview)<br>
|
||||||
|
[Premise](#Premise)<br>
|
||||||
|
[Exchange startup](#Exchange-startup)<br>
|
||||||
|
[Order Requests](#Trade-requests)<br>
|
||||||
|
[Order Cancellations](#Trade-cancellations)<br>
|
||||||
|
[Trade swap](#Trade-swap)<br>
|
||||||
|
[Exchange program operations](#Exchange-program-operations)<br>
|
||||||
|
[Quotes and OHLCV](#Quotes-and-OHLCV)<br>
|
||||||
|
[Investor strategies](#Investor-strategies)<br>
|
||||||
|
[Running the exchange](#Running-the-exchange)<br>
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
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
|
||||||
|
emulating a currency exchange.
|
||||||
|
|
||||||
|
The assets are virtual tokens held by investors who may post order requests to
|
||||||
|
the exchange. A Matcher monitors the exchange and posts swap requests for
|
||||||
|
matching orders. All the transactions can execute concurrently.
|
||||||
|
|
||||||
|
## Premise
|
||||||
|
|
||||||
|
- Exchange
|
||||||
|
- An exchange is a marketplace where one asset can be traded for another.
|
||||||
|
The exchange in this demo is the on-chain program that implements the
|
||||||
|
tokens and the policies for trading those tokens.
|
||||||
|
- Token
|
||||||
|
- A virtual asset that can be owned, traded, and holds virtual intrinsic value
|
||||||
|
compared to other assets. There are four types of tokens in this demo, A,
|
||||||
|
B, C, D. Each one may be traded for another.
|
||||||
|
- Token account
|
||||||
|
- An account owned by the exchange that holds a quantity of one type of token.
|
||||||
|
- Account request
|
||||||
|
- A request to create a token account
|
||||||
|
- Token request
|
||||||
|
- A request to deposit tokens of a particular type into a token account.
|
||||||
|
- Asset pair
|
||||||
|
- A struct with fields Base and Quote, representing the two assets which make up a
|
||||||
|
trading pair, which themselves are Tokens. The Base or 'primary' asset is the
|
||||||
|
numerator and the Quote is the denominator for pricing purposes.
|
||||||
|
- Order side
|
||||||
|
- Describes which side of the market an investor wants to place a trade on. Options
|
||||||
|
are "Bid" or "Ask", where a bid represents an offer to purchase the Base asset of
|
||||||
|
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
|
||||||
|
- An expression of the relative prices of two tokens. Calculated with the Base
|
||||||
|
Asset as the numerator and the Quote Asset as the denominator. 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)
|
||||||
|
- Order request
|
||||||
|
- A Solana transaction sent by a trader to the exchange to submit an order.
|
||||||
|
Order requests are made up of the token pair, the order side (bid or ask),
|
||||||
|
quantity of the primary token, the price ratio, and the two token accounts
|
||||||
|
to be credited/deducted. An example trade request looks like "T AB 5 2"
|
||||||
|
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
|
||||||
|
deducted and 10 B tokens credited to the trade initiator's token accounts.
|
||||||
|
Successful order requests result in an order.
|
||||||
|
- Order
|
||||||
|
- The result of a successful order request. orders are stored in
|
||||||
|
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
|
||||||
|
contain the same information as the order request.
|
||||||
|
- Price spread
|
||||||
|
- The difference between the two matching orders. The spread is the
|
||||||
|
profit of the Matcher initiating the swap request.
|
||||||
|
- Match requirements
|
||||||
|
- Policies that result in a successful trade swap.
|
||||||
|
- Match request
|
||||||
|
- A request to fill two complementary orders (bid/ask), resulting if successful,
|
||||||
|
in a trade being created.
|
||||||
|
- Trade
|
||||||
|
- A successful trade is created from two matching orders that meet
|
||||||
|
swap requirements which are submitted in a Match Request by a Matcher and
|
||||||
|
executed by the exchange. A trade may not wholly satisfy one or both of the
|
||||||
|
orders in which case the orders are adjusted appropriately. Upon execution,
|
||||||
|
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
|
||||||
|
- 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
|
||||||
|
accounts containing tokens and/or order requests. Investors post
|
||||||
|
transactions to the exchange in order to request tokens and post or cancel
|
||||||
|
order requests.
|
||||||
|
- Matcher
|
||||||
|
- An agent who facilitates trading between investors. Matchers operate as
|
||||||
|
Solana thin clients who monitor all the orders looking for a trade
|
||||||
|
match. Once found, the Matcher issues a swap request to the exchange.
|
||||||
|
Matchers are the engine of the exchange and are rewarded for their efforts by
|
||||||
|
accumulating the price spreads of the swaps they initiate. Matchers also
|
||||||
|
provide current bid/ask price and OHLCV (Open, High, Low, Close, Volume)
|
||||||
|
information on demand via a public network port.
|
||||||
|
- Transaction fees
|
||||||
|
- Solana transaction fees are paid for by the transaction submitters who are
|
||||||
|
the Investors and Matchers.
|
||||||
|
|
||||||
|
## Exchange startup
|
||||||
|
|
||||||
|
The exchange is up and running when it reaches a state where it can take
|
||||||
|
investors' trades and Matchers' match requests. To achieve this state the
|
||||||
|
following must occur in order:
|
||||||
|
|
||||||
|
- Start the Solana blockchain
|
||||||
|
- Start the thin-client
|
||||||
|
- 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
|
||||||
|
interface.
|
||||||
|
- The Matcher starts responding to queries for bid/ask price and OHLCV
|
||||||
|
|
||||||
|
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
|
||||||
|
is not ideal, and instead investors should be able to submit trades at any time,
|
||||||
|
and the Matcher could come and go without missing a trade. One way to achieve
|
||||||
|
this is for the Matcher to read the current state of all accounts looking for all
|
||||||
|
open orders.-->
|
||||||
|
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
/// Supported token types
|
||||||
|
pub enum Token {
|
||||||
|
A,
|
||||||
|
B,
|
||||||
|
C,
|
||||||
|
D,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Supported token pairs
|
||||||
|
pub enum TokenPair {
|
||||||
|
AB,
|
||||||
|
AC,
|
||||||
|
AD,
|
||||||
|
BC,
|
||||||
|
BD,
|
||||||
|
CD,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ExchangeInstruction {
|
||||||
|
/// New token account
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 - New token account
|
||||||
|
AccountRequest,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Token accounts are populated with this structure
|
||||||
|
pub struct TokenAccountInfo {
|
||||||
|
/// Investor who owns this account
|
||||||
|
pub owner: Pubkey,
|
||||||
|
/// Current number of tokens this account holds
|
||||||
|
pub tokens: Tokens,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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
|
||||||
|
would provide another way to exchange a 3rd party asset into tokens.
|
||||||
|
|
||||||
|
To request tokens, investors submit transfer requests:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum ExchangeInstruction {
|
||||||
|
/// Transfer tokens between two accounts
|
||||||
|
/// key 0 - Account to transfer tokens to
|
||||||
|
/// key 1 - Account to transfer tokens from. This can be the exchange program itself,
|
||||||
|
/// the exchange has a limitless number of tokens it can transfer.
|
||||||
|
TransferRequest(Token, u64),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Order Requests
|
||||||
|
|
||||||
|
When an investor decides to exchange a token of one type for another, they
|
||||||
|
submit a transaction to the Solana Blockchain containing an order request, which,
|
||||||
|
if successful, is turned into an order. orders do not expire but are
|
||||||
|
cancellable. <!-- orders should have a timestamp to enable trade
|
||||||
|
expiration --> When an order is created, tokens are deducted from a token
|
||||||
|
account and the order acts as an escrow. The tokens are held until the
|
||||||
|
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`
|
||||||
|
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
|
||||||
|
can no longer be used. <!-- Could support refilling orders, so order
|
||||||
|
accounts are refilled rather than accumulating -->
|
||||||
|
|
||||||
|
```rust
|
||||||
|
/// Direction of the exchange between two tokens in a pair
|
||||||
|
pub enum Direction {
|
||||||
|
/// Trade first token type (primary) in the pair 'To' the second
|
||||||
|
To,
|
||||||
|
/// Trade first token type in the pair 'From' the second (secondary)
|
||||||
|
From,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct OrderRequestInfo {
|
||||||
|
/// Direction of trade
|
||||||
|
pub direction: Direction,
|
||||||
|
|
||||||
|
/// Token pair to trade
|
||||||
|
pub pair: TokenPair,
|
||||||
|
|
||||||
|
/// Number of tokens to exchange; refers to the primary or the secondary depending on the direction
|
||||||
|
pub tokens: u64,
|
||||||
|
|
||||||
|
/// The price ratio the primary price over the secondary price. The primary price is fixed
|
||||||
|
/// and equal to the variable `SCALER`.
|
||||||
|
pub price: u64,
|
||||||
|
|
||||||
|
/// Token account to deposit tokens on successful swap
|
||||||
|
pub dst_account: Pubkey,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ExchangeInstruction {
|
||||||
|
/// order request
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 - Account in which to record the swap
|
||||||
|
/// key 2 - Token account associated with this trade
|
||||||
|
TradeRequest(TradeRequestInfo),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Trade accounts are populated with this structure
|
||||||
|
pub struct TradeOrderInfo {
|
||||||
|
/// Owner of the order
|
||||||
|
pub owner: Pubkey,
|
||||||
|
/// Direction of the exchange
|
||||||
|
pub direction: Direction,
|
||||||
|
/// Token pair indicating two tokens to exchange, first is primary
|
||||||
|
pub pair: TokenPair,
|
||||||
|
/// Number of tokens to exchange; primary or secondary depending on direction
|
||||||
|
pub tokens: u64,
|
||||||
|
/// Scaled price of the secondary token given the primary is equal to the scale value
|
||||||
|
/// If scale is 1 and price is 2 then ratio is 1:2 or 1 primary token for 2 secondary tokens
|
||||||
|
pub price: u64,
|
||||||
|
/// account which the tokens were source from. The trade account holds the tokens in escrow
|
||||||
|
/// until either one or more part of a swap or the trade is canceled.
|
||||||
|
pub src_account: Pubkey,
|
||||||
|
/// account which the tokens the tokens will be deposited into on a successful trade
|
||||||
|
pub dst_account: Pubkey,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Order cancellations
|
||||||
|
|
||||||
|
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
|
||||||
|
account from which they came.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum ExchangeInstruction {
|
||||||
|
/// order cancellation
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 -order to cancel
|
||||||
|
TradeCancellation,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Trade swaps
|
||||||
|
|
||||||
|
The Matcher is monitoring the accounts assigned to the exchange program and
|
||||||
|
building a trade-order table. The order table is used to identify
|
||||||
|
matching orders which could be fulfilled. When a match is found the
|
||||||
|
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
|
||||||
|
in either account will keep the order valid for further swap requests in
|
||||||
|
the future.
|
||||||
|
|
||||||
|
Matching orders are defined by the following swap requirements:
|
||||||
|
|
||||||
|
- Opposite polarity (one `To` and one `From`)
|
||||||
|
- Operate on the same token pair
|
||||||
|
- The price ratio of the `From` order is greater than or equal to the `To` order
|
||||||
|
- There are sufficient tokens to perform the trade
|
||||||
|
|
||||||
|
Orders can be written in the following format:
|
||||||
|
|
||||||
|
`investor direction pair quantity price-ratio`
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
- `1 T AB 2 1`
|
||||||
|
- Investor 1 wishes to exchange 2 A tokens to B tokens at a ratio of 1 A to 1
|
||||||
|
B
|
||||||
|
- `2 F AC 6 1.2`
|
||||||
|
- Investor 2 wishes to exchange A tokens from 6 B tokens at a ratio of 1 A
|
||||||
|
from 1.2 B
|
||||||
|
|
||||||
|
An order table could look something like the following. Notice how the columns
|
||||||
|
are sorted low to high and high to low, respectively. Prices are dramatic and
|
||||||
|
whole for clarity.
|
||||||
|
|
||||||
|
|Row| To | From |
|
||||||
|
|---|-------------|------------|
|
||||||
|
| 1 | 1 T AB 2 4 | 2 F AB 2 8 |
|
||||||
|
| 2 | 1 T AB 1 4 | 2 F AB 2 8 |
|
||||||
|
| 3 | 1 T AB 6 6 | 2 F AB 2 7 |
|
||||||
|
| 4 | 1 T AB 2 8 | 2 F AB 3 6 |
|
||||||
|
| 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
|
||||||
|
Matcher's account equal to the difference in the price ratios or the two orders.
|
||||||
|
These tokens are considered the Matcher's profit for initiating the trade.
|
||||||
|
|
||||||
|
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, From: Investor 2 trades 2 A tokens from 8 B tokens
|
||||||
|
- Matcher takes 8 B tokens as profit
|
||||||
|
|
||||||
|
Both row 1 trades are fully realized, table becomes:
|
||||||
|
|
||||||
|
|Row| To | From |
|
||||||
|
|---|-------------|------------|
|
||||||
|
| 1 | 1 T AB 1 4 | 2 F AB 2 8 |
|
||||||
|
| 2 | 1 T AB 6 6 | 2 F AB 2 7 |
|
||||||
|
| 3 | 1 T AB 2 8 | 2 F AB 3 6 |
|
||||||
|
| 4 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||||
|
|
||||||
|
The Matcher would initiate the following swap:
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- Matcher takes 4 B tokens as profit
|
||||||
|
|
||||||
|
Row 1 From is not fully realized, table becomes:
|
||||||
|
|
||||||
|
|Row| To | From |
|
||||||
|
|---|-------------|------------|
|
||||||
|
| 1 | 1 T AB 6 6 | 2 F AB 1 8 |
|
||||||
|
| 2 | 1 T AB 2 8 | 2 F AB 2 7 |
|
||||||
|
| 3 | 1 T AB 2 10 | 2 F AB 3 6 |
|
||||||
|
| 4 | | 2 F AB 1 5 |
|
||||||
|
|
||||||
|
The Matcher would initiate the following swap:
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- Matcher takes 2 B tokens as profit
|
||||||
|
|
||||||
|
Row 1 To is now fully realized, table becomes:
|
||||||
|
|
||||||
|
|Row| To | From |
|
||||||
|
|---|-------------|------------|
|
||||||
|
| 1 | 1 T AB 5 6 | 2 F AB 2 7 |
|
||||||
|
| 2 | 1 T AB 2 8 | 2 F AB 3 5 |
|
||||||
|
| 3 | 1 T AB 2 10 | 2 F AB 1 5 |
|
||||||
|
|
||||||
|
The Matcher would initiate the following last swap:
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- Matcher takes 4 B tokens as profit
|
||||||
|
|
||||||
|
Table becomes:
|
||||||
|
|
||||||
|
|Row| To | From |
|
||||||
|
|---|-------------|------------|
|
||||||
|
| 1 | 1 T AB 3 6 | 2 F AB 3 5 |
|
||||||
|
| 2 | 1 T AB 2 8 | 2 F AB 1 5 |
|
||||||
|
| 3 | 1 T AB 2 10 | |
|
||||||
|
|
||||||
|
At this point the lowest To's price is larger than the largest From's price so
|
||||||
|
no more swaps would be initiated until new orders came in.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum ExchangeInstruction {
|
||||||
|
/// Trade swap request
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 - Account in which to record the swap
|
||||||
|
/// key 2 - 'To' order
|
||||||
|
/// key 3 - `From` order
|
||||||
|
/// key 4 - Token account associated with the To Trade
|
||||||
|
/// key 5 - Token account associated with From trade
|
||||||
|
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
||||||
|
SwapRequest,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Swap accounts are populated with this structure
|
||||||
|
pub struct TradeSwapInfo {
|
||||||
|
/// Pair swapped
|
||||||
|
pub pair: TokenPair,
|
||||||
|
/// `To` order
|
||||||
|
pub to_trade_order: Pubkey,
|
||||||
|
/// `From` order
|
||||||
|
pub from_trade_order: Pubkey,
|
||||||
|
/// Number of primary tokens exchanged
|
||||||
|
pub primary_tokens: u64,
|
||||||
|
/// Price the primary tokens were exchanged for
|
||||||
|
pub primary_price: u64,
|
||||||
|
/// Number of secondary tokens exchanged
|
||||||
|
pub secondary_tokens: u64,
|
||||||
|
/// Price the secondary tokens were exchanged for
|
||||||
|
pub secondary_price: u64,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exchange program operations
|
||||||
|
|
||||||
|
Putting all the commands together from above, the following operations will be
|
||||||
|
supported by the on-chain exchange program:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub enum ExchangeInstruction {
|
||||||
|
/// New token account
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 - New token account
|
||||||
|
AccountRequest,
|
||||||
|
|
||||||
|
/// Transfer tokens between two accounts
|
||||||
|
/// key 0 - Account to transfer tokens to
|
||||||
|
/// key 1 - Account to transfer tokens from. This can be the exchange program itself,
|
||||||
|
/// the exchange has a limitless number of tokens it can transfer.
|
||||||
|
TransferRequest(Token, u64),
|
||||||
|
|
||||||
|
/// order request
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 - Account in which to record the swap
|
||||||
|
/// key 2 - Token account associated with this trade
|
||||||
|
TradeRequest(TradeRequestInfo),
|
||||||
|
|
||||||
|
/// order cancellation
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 -order to cancel
|
||||||
|
TradeCancellation,
|
||||||
|
|
||||||
|
/// Trade swap request
|
||||||
|
/// key 0 - Signer
|
||||||
|
/// key 1 - Account in which to record the swap
|
||||||
|
/// key 2 - 'To' order
|
||||||
|
/// key 3 - `From` order
|
||||||
|
/// key 4 - Token account associated with the To Trade
|
||||||
|
/// key 5 - Token account associated with From trade
|
||||||
|
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
||||||
|
SwapRequest,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quotes and OHLCV
|
||||||
|
|
||||||
|
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
|
||||||
|
price quotes are calculated are yet to be decided.
|
||||||
|
|
||||||
|
## Investor strategies
|
||||||
|
|
||||||
|
To make a compelling demo, the investors needs to provide interesting trade
|
||||||
|
behavior. Something as simple as a randomly twiddled baseline would be a
|
||||||
|
minimum starting point.
|
||||||
|
|
||||||
|
## Running the exchange
|
||||||
|
|
||||||
|
The exchange bench posts trades and swaps matches as fast as it can.
|
||||||
|
|
||||||
|
You might want to bump the duration up
|
||||||
|
to 60 seconds and the batch size to 1000 for better numbers. You can modify those
|
||||||
|
in client_demo/src/demo.rs::test_exchange_local_cluster.
|
||||||
|
|
||||||
|
The following command runs the bench:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ RUST_LOG=solana_bench_exchange=info cargo test --release -- --nocapture test_exchange_local_cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
To also see the cluster messages:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ RUST_LOG=solana_bench_exchange=info,solana=info cargo test --release -- --nocapture test_exchange_local_cluster
|
||||||
|
```
|
972
bench-exchange/src/bench.rs
Normal file
@ -0,0 +1,972 @@
|
|||||||
|
#![allow(clippy::useless_attribute)]
|
||||||
|
|
||||||
|
use crate::order_book::*;
|
||||||
|
use itertools::izip;
|
||||||
|
use log::*;
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
|
use rayon::prelude::*;
|
||||||
|
use solana_client::perf_utils::{sample_txs, SampleStats};
|
||||||
|
use solana_core::gen_keys::GenKeys;
|
||||||
|
use solana_drone::drone::request_airdrop_transaction;
|
||||||
|
use solana_exchange_api::exchange_instruction;
|
||||||
|
use solana_exchange_api::exchange_state::*;
|
||||||
|
use solana_exchange_api::id;
|
||||||
|
use solana_genesis::Base64Account;
|
||||||
|
use solana_metrics::datapoint_info;
|
||||||
|
use solana_sdk::client::Client;
|
||||||
|
use solana_sdk::client::SyncClient;
|
||||||
|
use solana_sdk::pubkey::Pubkey;
|
||||||
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
use solana_sdk::timing::{duration_as_ms, duration_as_s};
|
||||||
|
use solana_sdk::transaction::Transaction;
|
||||||
|
use solana_sdk::{system_instruction, system_program};
|
||||||
|
use std::cmp;
|
||||||
|
use std::collections::{HashMap, VecDeque};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::mem;
|
||||||
|
use std::net::SocketAddr;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::process::exit;
|
||||||
|
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||||
|
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||||
|
use std::sync::{Arc, RwLock};
|
||||||
|
use std::thread::{sleep, Builder};
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
|
// TODO Chunk length as specified results in a bunch of failures, divide by 10 helps...
|
||||||
|
// Assume 4MB network buffers, and 512 byte packets
|
||||||
|
const FUND_CHUNK_LEN: usize = 4 * 1024 * 1024 / 512;
|
||||||
|
|
||||||
|
// Maximum system transfers per transaction
|
||||||
|
const MAX_TRANSFERS_PER_TX: u64 = 4;
|
||||||
|
|
||||||
|
pub type SharedTransactions = Arc<RwLock<VecDeque<Vec<Transaction>>>>;
|
||||||
|
|
||||||
|
pub struct Config {
|
||||||
|
pub identity: Keypair,
|
||||||
|
pub threads: usize,
|
||||||
|
pub duration: Duration,
|
||||||
|
pub transfer_delay: u64,
|
||||||
|
pub fund_amount: u64,
|
||||||
|
pub batch_size: usize,
|
||||||
|
pub chunk_size: usize,
|
||||||
|
pub account_groups: usize,
|
||||||
|
pub client_ids_and_stake_file: String,
|
||||||
|
pub read_from_client_file: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Config {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
identity: Keypair::new(),
|
||||||
|
threads: 4,
|
||||||
|
duration: Duration::new(u64::max_value(), 0),
|
||||||
|
transfer_delay: 0,
|
||||||
|
fund_amount: 100_000,
|
||||||
|
batch_size: 10,
|
||||||
|
chunk_size: 10,
|
||||||
|
account_groups: 100,
|
||||||
|
client_ids_and_stake_file: String::new(),
|
||||||
|
read_from_client_file: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_client_accounts_file(
|
||||||
|
client_ids_and_stake_file: &str,
|
||||||
|
batch_size: usize,
|
||||||
|
account_groups: usize,
|
||||||
|
fund_amount: u64,
|
||||||
|
) {
|
||||||
|
let accounts_in_groups = batch_size * account_groups;
|
||||||
|
const NUM_KEYPAIR_GROUPS: u64 = 2;
|
||||||
|
let total_keys = accounts_in_groups as u64 * NUM_KEYPAIR_GROUPS;
|
||||||
|
|
||||||
|
let keypairs = generate_keypairs(total_keys);
|
||||||
|
|
||||||
|
let mut accounts = HashMap::new();
|
||||||
|
keypairs.iter().for_each(|keypair| {
|
||||||
|
accounts.insert(
|
||||||
|
serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
|
||||||
|
Base64Account {
|
||||||
|
balance: fund_amount,
|
||||||
|
executable: false,
|
||||||
|
owner: system_program::id().to_string(),
|
||||||
|
data: String::new(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn do_bench_exchange<T>(clients: Vec<T>, config: Config)
|
||||||
|
where
|
||||||
|
T: 'static + Client + Send + Sync,
|
||||||
|
{
|
||||||
|
let Config {
|
||||||
|
identity,
|
||||||
|
threads,
|
||||||
|
duration,
|
||||||
|
transfer_delay,
|
||||||
|
fund_amount,
|
||||||
|
batch_size,
|
||||||
|
chunk_size,
|
||||||
|
account_groups,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
read_from_client_file,
|
||||||
|
} = config;
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"Exchange client: threads {} duration {} fund_amount {}",
|
||||||
|
threads,
|
||||||
|
duration_as_s(&duration),
|
||||||
|
fund_amount
|
||||||
|
);
|
||||||
|
info!(
|
||||||
|
"Exchange client: transfer delay {} batch size {} chunk size {}",
|
||||||
|
transfer_delay, batch_size, chunk_size
|
||||||
|
);
|
||||||
|
|
||||||
|
let accounts_in_groups = batch_size * account_groups;
|
||||||
|
const NUM_KEYPAIR_GROUPS: u64 = 2;
|
||||||
|
let total_keys = accounts_in_groups as u64 * NUM_KEYPAIR_GROUPS;
|
||||||
|
|
||||||
|
let mut signer_keypairs = if read_from_client_file {
|
||||||
|
let path = Path::new(&client_ids_and_stake_file);
|
||||||
|
let file = File::open(path).unwrap();
|
||||||
|
|
||||||
|
let accounts: HashMap<String, Base64Account> = serde_yaml::from_reader(file).unwrap();
|
||||||
|
accounts
|
||||||
|
.into_iter()
|
||||||
|
.map(|(keypair, _)| {
|
||||||
|
let bytes: Vec<u8> = serde_json::from_str(keypair.as_str()).unwrap();
|
||||||
|
Keypair::from_bytes(&bytes).unwrap()
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
} else {
|
||||||
|
info!("Generating {:?} signer keys", total_keys);
|
||||||
|
generate_keypairs(total_keys)
|
||||||
|
};
|
||||||
|
|
||||||
|
let trader_signers: Vec<_> = signer_keypairs
|
||||||
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(Arc::new)
|
||||||
|
.collect();
|
||||||
|
let swapper_signers: Vec<_> = signer_keypairs
|
||||||
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(Arc::new)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let clients: Vec<_> = clients.into_iter().map(Arc::new).collect();
|
||||||
|
let client = clients[0].as_ref();
|
||||||
|
|
||||||
|
if !read_from_client_file {
|
||||||
|
info!("Fund trader accounts");
|
||||||
|
fund_keys(client, &identity, &trader_signers, fund_amount);
|
||||||
|
info!("Fund swapper accounts");
|
||||||
|
fund_keys(client, &identity, &swapper_signers, fund_amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
info!("Generating {:?} account keys", total_keys);
|
||||||
|
let mut account_keypairs = generate_keypairs(total_keys);
|
||||||
|
let src_pubkeys: Vec<_> = account_keypairs
|
||||||
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(|keypair| keypair.pubkey())
|
||||||
|
.collect();
|
||||||
|
let profit_pubkeys: Vec<_> = account_keypairs
|
||||||
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(|keypair| keypair.pubkey())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
info!("Create {:?} source token accounts", src_pubkeys.len());
|
||||||
|
create_token_accounts(client, &trader_signers, &src_pubkeys);
|
||||||
|
info!("Create {:?} profit token accounts", profit_pubkeys.len());
|
||||||
|
create_token_accounts(client, &swapper_signers, &profit_pubkeys);
|
||||||
|
|
||||||
|
// Collect the max transaction rate and total tx count seen (single node only)
|
||||||
|
let sample_stats = Arc::new(RwLock::new(Vec::new()));
|
||||||
|
let sample_period = 1; // in seconds
|
||||||
|
info!("Sampling clients for tps every {} s", sample_period);
|
||||||
|
info!(
|
||||||
|
"Requesting and swapping trades with {} ms delay per thread...",
|
||||||
|
transfer_delay
|
||||||
|
);
|
||||||
|
|
||||||
|
let exit_signal = Arc::new(AtomicBool::new(false));
|
||||||
|
let shared_txs: SharedTransactions = Arc::new(RwLock::new(VecDeque::new()));
|
||||||
|
let total_txs_sent_count = Arc::new(AtomicUsize::new(0));
|
||||||
|
let s_threads: Vec<_> = (0..threads)
|
||||||
|
.map(|_| {
|
||||||
|
let exit_signal = exit_signal.clone();
|
||||||
|
let shared_txs = shared_txs.clone();
|
||||||
|
let total_txs_sent_count = total_txs_sent_count.clone();
|
||||||
|
let client = clients[0].clone();
|
||||||
|
Builder::new()
|
||||||
|
.name("solana-exchange-transfer".to_string())
|
||||||
|
.spawn(move || {
|
||||||
|
do_tx_transfers(&exit_signal, &shared_txs, &total_txs_sent_count, &client)
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
trace!("Start swapper thread");
|
||||||
|
let (swapper_sender, swapper_receiver) = channel();
|
||||||
|
let swapper_thread = {
|
||||||
|
let exit_signal = exit_signal.clone();
|
||||||
|
let shared_txs = shared_txs.clone();
|
||||||
|
let client = clients[0].clone();
|
||||||
|
Builder::new()
|
||||||
|
.name("solana-exchange-swapper".to_string())
|
||||||
|
.spawn(move || {
|
||||||
|
swapper(
|
||||||
|
&exit_signal,
|
||||||
|
&swapper_receiver,
|
||||||
|
&shared_txs,
|
||||||
|
&swapper_signers,
|
||||||
|
&profit_pubkeys,
|
||||||
|
transfer_delay,
|
||||||
|
batch_size,
|
||||||
|
chunk_size,
|
||||||
|
account_groups,
|
||||||
|
&client,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
trace!("Start trader thread");
|
||||||
|
let trader_thread = {
|
||||||
|
let exit_signal = exit_signal.clone();
|
||||||
|
let shared_txs = shared_txs.clone();
|
||||||
|
let client = clients[0].clone();
|
||||||
|
Builder::new()
|
||||||
|
.name("solana-exchange-trader".to_string())
|
||||||
|
.spawn(move || {
|
||||||
|
trader(
|
||||||
|
&exit_signal,
|
||||||
|
&swapper_sender,
|
||||||
|
&shared_txs,
|
||||||
|
&trader_signers,
|
||||||
|
&src_pubkeys,
|
||||||
|
transfer_delay,
|
||||||
|
batch_size,
|
||||||
|
chunk_size,
|
||||||
|
account_groups,
|
||||||
|
&client,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
let sample_threads: Vec<_> = clients
|
||||||
|
.iter()
|
||||||
|
.map(|client| {
|
||||||
|
let exit_signal = exit_signal.clone();
|
||||||
|
let sample_stats = sample_stats.clone();
|
||||||
|
let client = client.clone();
|
||||||
|
Builder::new()
|
||||||
|
.name("solana-exchange-sample".to_string())
|
||||||
|
.spawn(move || sample_txs(&exit_signal, &sample_stats, sample_period, &client))
|
||||||
|
.unwrap()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
sleep(duration);
|
||||||
|
|
||||||
|
info!("Stopping threads");
|
||||||
|
exit_signal.store(true, Ordering::Relaxed);
|
||||||
|
info!("Wait for trader thread");
|
||||||
|
let _ = trader_thread.join();
|
||||||
|
info!("Waiting for swapper thread");
|
||||||
|
let _ = swapper_thread.join();
|
||||||
|
info!("Wait for tx threads");
|
||||||
|
for t in s_threads {
|
||||||
|
let _ = t.join();
|
||||||
|
}
|
||||||
|
info!("Wait for sample threads");
|
||||||
|
for t in sample_threads {
|
||||||
|
let _ = t.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
compute_and_report_stats(
|
||||||
|
&sample_stats,
|
||||||
|
total_txs_sent_count.load(Ordering::Relaxed) as u64,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_tx_transfers<T>(
|
||||||
|
exit_signal: &Arc<AtomicBool>,
|
||||||
|
shared_txs: &SharedTransactions,
|
||||||
|
total_txs_sent_count: &Arc<AtomicUsize>,
|
||||||
|
client: &Arc<T>,
|
||||||
|
) where
|
||||||
|
T: Client,
|
||||||
|
{
|
||||||
|
loop {
|
||||||
|
let txs;
|
||||||
|
{
|
||||||
|
let mut shared_txs_wl = shared_txs.write().unwrap();
|
||||||
|
txs = shared_txs_wl.pop_front();
|
||||||
|
}
|
||||||
|
if let Some(txs0) = txs {
|
||||||
|
let n = txs0.len();
|
||||||
|
|
||||||
|
let now = Instant::now();
|
||||||
|
for tx in txs0 {
|
||||||
|
client.async_send_transaction(tx).expect("Transfer");
|
||||||
|
}
|
||||||
|
let duration = now.elapsed();
|
||||||
|
|
||||||
|
total_txs_sent_count.fetch_add(n, Ordering::Relaxed);
|
||||||
|
datapoint_info!(
|
||||||
|
"bench-exchange-do_tx_transfers",
|
||||||
|
("duration", duration_as_ms(&duration), i64),
|
||||||
|
("count", n, i64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if exit_signal.load(Ordering::Relaxed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TradeInfo {
|
||||||
|
trade_account: Pubkey,
|
||||||
|
order_info: OrderInfo,
|
||||||
|
}
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
fn swapper<T>(
|
||||||
|
exit_signal: &Arc<AtomicBool>,
|
||||||
|
receiver: &Receiver<Vec<TradeInfo>>,
|
||||||
|
shared_txs: &SharedTransactions,
|
||||||
|
signers: &[Arc<Keypair>],
|
||||||
|
profit_pubkeys: &[Pubkey],
|
||||||
|
transfer_delay: u64,
|
||||||
|
batch_size: usize,
|
||||||
|
chunk_size: usize,
|
||||||
|
account_groups: usize,
|
||||||
|
client: &Arc<T>,
|
||||||
|
) where
|
||||||
|
T: Client,
|
||||||
|
{
|
||||||
|
let mut order_book = OrderBook::default();
|
||||||
|
let mut account_group: usize = 0;
|
||||||
|
|
||||||
|
let mut txs = 0;
|
||||||
|
let mut total_txs = 0;
|
||||||
|
let mut now = Instant::now();
|
||||||
|
let start_time = now;
|
||||||
|
let mut total_elapsed = start_time.elapsed();
|
||||||
|
|
||||||
|
// Chunks may have been dropped and we don't want to wait a long time
|
||||||
|
// for each time, Back-off each time we fail to confirm a chunk
|
||||||
|
const CHECK_TX_TIMEOUT_MAX_MS: u64 = 15000;
|
||||||
|
const CHECK_TX_DELAY_MS: u64 = 100;
|
||||||
|
let mut max_tries = CHECK_TX_TIMEOUT_MAX_MS / CHECK_TX_DELAY_MS;
|
||||||
|
|
||||||
|
// If we dump too many chunks maybe we are just waiting on a back-log
|
||||||
|
// rather than a series of dropped packets, reset to max waits
|
||||||
|
const MAX_DUMPS: u64 = 50;
|
||||||
|
let mut dumps = 0;
|
||||||
|
|
||||||
|
'outer: loop {
|
||||||
|
if let Ok(trade_infos) = receiver.try_recv() {
|
||||||
|
let mut tries = 0;
|
||||||
|
let mut trade_index = 0;
|
||||||
|
while client
|
||||||
|
.get_balance(&trade_infos[trade_index].trade_account)
|
||||||
|
.unwrap_or(0)
|
||||||
|
== 0
|
||||||
|
{
|
||||||
|
tries += 1;
|
||||||
|
if tries >= max_tries {
|
||||||
|
if exit_signal.load(Ordering::Relaxed) {
|
||||||
|
break 'outer;
|
||||||
|
}
|
||||||
|
error!("Give up and dump batch");
|
||||||
|
if dumps >= MAX_DUMPS {
|
||||||
|
error!("Max batches dumped, reset wait back-off");
|
||||||
|
max_tries = CHECK_TX_TIMEOUT_MAX_MS / CHECK_TX_DELAY_MS;
|
||||||
|
dumps = 0;
|
||||||
|
} else {
|
||||||
|
dumps += 1;
|
||||||
|
max_tries /= 2;
|
||||||
|
}
|
||||||
|
continue 'outer;
|
||||||
|
}
|
||||||
|
debug!("{} waiting for trades batch to clear", tries);
|
||||||
|
sleep(Duration::from_millis(CHECK_TX_DELAY_MS));
|
||||||
|
trade_index = thread_rng().gen_range(0, trade_infos.len());
|
||||||
|
}
|
||||||
|
max_tries = CHECK_TX_TIMEOUT_MAX_MS / CHECK_TX_DELAY_MS;
|
||||||
|
dumps = 0;
|
||||||
|
|
||||||
|
trade_infos.iter().for_each(|info| {
|
||||||
|
order_book
|
||||||
|
.push(info.trade_account, info.order_info)
|
||||||
|
.expect("Failed to push to order_book");
|
||||||
|
});
|
||||||
|
let mut swaps = Vec::new();
|
||||||
|
while let Some((to, from)) = order_book.pop() {
|
||||||
|
swaps.push((to, from));
|
||||||
|
if swaps.len() >= batch_size {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let swaps_size = swaps.len();
|
||||||
|
|
||||||
|
let mut to_swap = vec![];
|
||||||
|
let start = account_group * swaps_size as usize;
|
||||||
|
let end = account_group * swaps_size as usize + batch_size as usize;
|
||||||
|
for (signer, swap, profit) in izip!(
|
||||||
|
signers[start..end].iter(),
|
||||||
|
swaps,
|
||||||
|
profit_pubkeys[start..end].iter(),
|
||||||
|
) {
|
||||||
|
to_swap.push((signer, swap, profit));
|
||||||
|
}
|
||||||
|
account_group = (account_group + 1) % account_groups as usize;
|
||||||
|
|
||||||
|
let (blockhash, _fee_calculator) = client
|
||||||
|
.get_recent_blockhash()
|
||||||
|
.expect("Failed to get blockhash");
|
||||||
|
let to_swap_txs: Vec<_> = to_swap
|
||||||
|
.par_iter()
|
||||||
|
.map(|(signer, swap, profit)| {
|
||||||
|
let s: &Keypair = &signer;
|
||||||
|
let owner = &signer.pubkey();
|
||||||
|
Transaction::new_signed_instructions(
|
||||||
|
&[s],
|
||||||
|
vec![exchange_instruction::swap_request(
|
||||||
|
owner,
|
||||||
|
&swap.0.pubkey,
|
||||||
|
&swap.1.pubkey,
|
||||||
|
&profit,
|
||||||
|
)],
|
||||||
|
blockhash,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
txs += to_swap_txs.len() as u64;
|
||||||
|
total_txs += to_swap_txs.len() as u64;
|
||||||
|
total_elapsed = start_time.elapsed();
|
||||||
|
let duration = now.elapsed();
|
||||||
|
if duration_as_s(&duration) >= 1_f32 {
|
||||||
|
now = Instant::now();
|
||||||
|
let tps = txs as f32 / duration_as_s(&duration);
|
||||||
|
info!(
|
||||||
|
"Swapper {:9.2} TPS, Transactions: {:6}, Total transactions: {} over {} s",
|
||||||
|
tps,
|
||||||
|
txs,
|
||||||
|
total_txs,
|
||||||
|
total_elapsed.as_secs(),
|
||||||
|
);
|
||||||
|
txs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
datapoint_info!("bench-exchange-swaps", ("count", to_swap_txs.len(), i64));
|
||||||
|
|
||||||
|
let chunks: Vec<_> = to_swap_txs.chunks(chunk_size).collect();
|
||||||
|
{
|
||||||
|
let mut shared_txs_wl = shared_txs.write().unwrap();
|
||||||
|
for chunk in chunks {
|
||||||
|
shared_txs_wl.push_back(chunk.to_vec());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Throttle the swapper so it doesn't try to catchup unbridled
|
||||||
|
sleep(Duration::from_millis(transfer_delay / 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
if exit_signal.load(Ordering::Relaxed) {
|
||||||
|
break 'outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info!(
|
||||||
|
"Swapper sent {} at {:9.2} TPS",
|
||||||
|
total_txs,
|
||||||
|
total_txs as f32 / duration_as_s(&total_elapsed)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
order_book.get_num_outstanding().0 + order_book.get_num_outstanding().1,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
fn trader<T>(
|
||||||
|
exit_signal: &Arc<AtomicBool>,
|
||||||
|
sender: &Sender<Vec<TradeInfo>>,
|
||||||
|
shared_txs: &SharedTransactions,
|
||||||
|
signers: &[Arc<Keypair>],
|
||||||
|
srcs: &[Pubkey],
|
||||||
|
transfer_delay: u64,
|
||||||
|
batch_size: usize,
|
||||||
|
chunk_size: usize,
|
||||||
|
account_groups: usize,
|
||||||
|
client: &Arc<T>,
|
||||||
|
) where
|
||||||
|
T: Client,
|
||||||
|
{
|
||||||
|
// TODO Hard coded for now
|
||||||
|
let pair = AssetPair::default();
|
||||||
|
let tokens = 1;
|
||||||
|
let price = 1000;
|
||||||
|
let mut account_group: usize = 0;
|
||||||
|
|
||||||
|
let mut txs = 0;
|
||||||
|
let mut total_txs = 0;
|
||||||
|
let mut now = Instant::now();
|
||||||
|
let start_time = now;
|
||||||
|
let mut total_elapsed = start_time.elapsed();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let trade_keys = generate_keypairs(batch_size as u64);
|
||||||
|
|
||||||
|
let mut trades = vec![];
|
||||||
|
let mut trade_infos = vec![];
|
||||||
|
let start = account_group * batch_size as usize;
|
||||||
|
let end = account_group * batch_size as usize + batch_size as usize;
|
||||||
|
let mut side = OrderSide::Ask;
|
||||||
|
for (signer, trade, src) in izip!(
|
||||||
|
signers[start..end].iter(),
|
||||||
|
trade_keys,
|
||||||
|
srcs[start..end].iter(),
|
||||||
|
) {
|
||||||
|
side = if side == OrderSide::Ask {
|
||||||
|
OrderSide::Bid
|
||||||
|
} else {
|
||||||
|
OrderSide::Ask
|
||||||
|
};
|
||||||
|
let order_info = OrderInfo {
|
||||||
|
/// Owner of the trade order
|
||||||
|
owner: Pubkey::default(), // don't care
|
||||||
|
side,
|
||||||
|
pair,
|
||||||
|
tokens,
|
||||||
|
price,
|
||||||
|
tokens_settled: 0,
|
||||||
|
};
|
||||||
|
trade_infos.push(TradeInfo {
|
||||||
|
trade_account: trade.pubkey(),
|
||||||
|
order_info,
|
||||||
|
});
|
||||||
|
trades.push((signer, trade.pubkey(), side, src));
|
||||||
|
}
|
||||||
|
account_group = (account_group + 1) % account_groups as usize;
|
||||||
|
|
||||||
|
let (blockhash, _fee_calculator) = client
|
||||||
|
.get_recent_blockhash()
|
||||||
|
.expect("Failed to get blockhash");
|
||||||
|
|
||||||
|
trades.chunks(chunk_size).for_each(|chunk| {
|
||||||
|
let trades_txs: Vec<_> = chunk
|
||||||
|
.par_iter()
|
||||||
|
.map(|(signer, trade, side, src)| {
|
||||||
|
let s: &Keypair = &signer;
|
||||||
|
let owner = &signer.pubkey();
|
||||||
|
let space = mem::size_of::<ExchangeState>() as u64;
|
||||||
|
Transaction::new_signed_instructions(
|
||||||
|
&[s],
|
||||||
|
vec![
|
||||||
|
system_instruction::create_account(owner, trade, 1, space, &id()),
|
||||||
|
exchange_instruction::trade_request(
|
||||||
|
owner, trade, *side, pair, tokens, price, src,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
blockhash,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
{
|
||||||
|
txs += chunk_size as u64;
|
||||||
|
total_txs += chunk_size as u64;
|
||||||
|
total_elapsed = start_time.elapsed();
|
||||||
|
let duration = now.elapsed();
|
||||||
|
if duration_as_s(&duration) >= 1_f32 {
|
||||||
|
now = Instant::now();
|
||||||
|
let tps = txs as f32 / duration_as_s(&duration);
|
||||||
|
info!(
|
||||||
|
"Trader {:9.2} TPS, Transactions: {:6}, Total transactions: {} over {} s",
|
||||||
|
tps,
|
||||||
|
txs,
|
||||||
|
total_txs,
|
||||||
|
total_elapsed.as_secs(),
|
||||||
|
);
|
||||||
|
txs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
datapoint_info!("bench-exchange-trades", ("count", trades_txs.len(), i64));
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut shared_txs_wl = shared_txs
|
||||||
|
.write()
|
||||||
|
.expect("Failed to send tx to transfer threads");
|
||||||
|
shared_txs_wl.push_back(trades_txs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if transfer_delay > 0 {
|
||||||
|
sleep(Duration::from_millis(transfer_delay));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if exit_signal.load(Ordering::Relaxed) {
|
||||||
|
info!(
|
||||||
|
"Trader sent {} at {:9.2} TPS",
|
||||||
|
total_txs,
|
||||||
|
total_txs as f32 / duration_as_s(&total_elapsed)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO chunk the trade infos and send them when the batch is sent
|
||||||
|
sender
|
||||||
|
.send(trade_infos)
|
||||||
|
.expect("Failed to send trades to swapper");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn verify_transaction<T>(sync_client: &T, tx: &Transaction) -> bool
|
||||||
|
where
|
||||||
|
T: SyncClient + ?Sized,
|
||||||
|
{
|
||||||
|
for s in &tx.signatures {
|
||||||
|
if let Ok(Some(r)) = sync_client.get_signature_status(s) {
|
||||||
|
match r {
|
||||||
|
Ok(_) => {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
info!("error: {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn verify_funding_transfer<T: SyncClient + ?Sized>(
|
||||||
|
client: &T,
|
||||||
|
tx: &Transaction,
|
||||||
|
amount: u64,
|
||||||
|
) -> bool {
|
||||||
|
if verify_transaction(client, tx) {
|
||||||
|
for a in &tx.message().account_keys[1..] {
|
||||||
|
if client.get_balance(a).unwrap_or(0) >= amount {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>], lamports: u64) {
|
||||||
|
let total = lamports * (dests.len() as u64 + 1);
|
||||||
|
let mut funded: Vec<(&Keypair, u64)> = vec![(source, total)];
|
||||||
|
let mut notfunded: Vec<&Arc<Keypair>> = dests.iter().collect();
|
||||||
|
|
||||||
|
info!(
|
||||||
|
" Funding {} keys with {} lamports each",
|
||||||
|
dests.len(),
|
||||||
|
lamports
|
||||||
|
);
|
||||||
|
while !notfunded.is_empty() {
|
||||||
|
if funded.is_empty() {
|
||||||
|
panic!("No funded accounts left to fund remaining");
|
||||||
|
}
|
||||||
|
let mut new_funded: Vec<(&Keypair, u64)> = vec![];
|
||||||
|
let mut to_fund = vec![];
|
||||||
|
debug!(" Creating from... {}", funded.len());
|
||||||
|
for f in &mut funded {
|
||||||
|
let max_units = cmp::min(
|
||||||
|
cmp::min(notfunded.len() as u64, MAX_TRANSFERS_PER_TX),
|
||||||
|
(f.1 - lamports) / lamports,
|
||||||
|
);
|
||||||
|
if max_units == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let per_unit = ((f.1 - lamports) / lamports / max_units) * lamports;
|
||||||
|
f.1 -= per_unit * max_units;
|
||||||
|
let start = notfunded.len() - max_units as usize;
|
||||||
|
let moves: Vec<_> = notfunded[start..]
|
||||||
|
.iter()
|
||||||
|
.map(|k| (k.pubkey(), per_unit))
|
||||||
|
.collect();
|
||||||
|
notfunded[start..]
|
||||||
|
.iter()
|
||||||
|
.for_each(|k| new_funded.push((k, per_unit)));
|
||||||
|
notfunded.truncate(start);
|
||||||
|
if !moves.is_empty() {
|
||||||
|
to_fund.push((f.0, moves));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
to_fund.chunks(FUND_CHUNK_LEN).for_each(|chunk| {
|
||||||
|
#[allow(clippy::clone_double_ref)] // sigh
|
||||||
|
let mut to_fund_txs: Vec<_> = chunk
|
||||||
|
.par_iter()
|
||||||
|
.map(|(k, m)| {
|
||||||
|
(
|
||||||
|
k.clone(),
|
||||||
|
Transaction::new_unsigned_instructions(system_instruction::transfer_many(
|
||||||
|
&k.pubkey(),
|
||||||
|
&m,
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut retries = 0;
|
||||||
|
let amount = chunk[0].1[0].1;
|
||||||
|
while !to_fund_txs.is_empty() {
|
||||||
|
let receivers = to_fund_txs
|
||||||
|
.iter()
|
||||||
|
.fold(0, |len, (_, tx)| len + tx.message().instructions.len());
|
||||||
|
|
||||||
|
debug!(
|
||||||
|
" {} to {} in {} txs",
|
||||||
|
if retries == 0 {
|
||||||
|
" Transferring"
|
||||||
|
} else {
|
||||||
|
" Retrying"
|
||||||
|
},
|
||||||
|
receivers,
|
||||||
|
to_fund_txs.len(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let (blockhash, _fee_calculator) =
|
||||||
|
client.get_recent_blockhash().expect("blockhash");
|
||||||
|
to_fund_txs.par_iter_mut().for_each(|(k, tx)| {
|
||||||
|
tx.sign(&[*k], blockhash);
|
||||||
|
});
|
||||||
|
to_fund_txs.iter().for_each(|(_, tx)| {
|
||||||
|
client.async_send_transaction(tx.clone()).expect("transfer");
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut waits = 0;
|
||||||
|
loop {
|
||||||
|
sleep(Duration::from_millis(200));
|
||||||
|
to_fund_txs.retain(|(_, tx)| !verify_funding_transfer(client, &tx, amount));
|
||||||
|
if to_fund_txs.is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
debug!(
|
||||||
|
" {} transactions outstanding, {:?} waits",
|
||||||
|
to_fund_txs.len(),
|
||||||
|
waits
|
||||||
|
);
|
||||||
|
waits += 1;
|
||||||
|
if waits >= 5 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !to_fund_txs.is_empty() {
|
||||||
|
retries += 1;
|
||||||
|
debug!(" Retry {:?}", retries);
|
||||||
|
if retries >= 10 {
|
||||||
|
error!("fund_keys: Too many retries ({}), give up", retries);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
funded.append(&mut new_funded);
|
||||||
|
funded.retain(|(k, b)| {
|
||||||
|
client.get_balance(&k.pubkey()).unwrap_or(0) > lamports && *b > lamports
|
||||||
|
});
|
||||||
|
debug!(" Funded: {} left: {}", funded.len(), notfunded.len());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], accounts: &[Pubkey]) {
|
||||||
|
let mut notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = signers.iter().zip(accounts).collect();
|
||||||
|
|
||||||
|
while !notfunded.is_empty() {
|
||||||
|
notfunded.chunks(FUND_CHUNK_LEN).for_each(|chunk| {
|
||||||
|
let mut to_create_txs: Vec<_> = chunk
|
||||||
|
.par_iter()
|
||||||
|
.map(|(signer, new)| {
|
||||||
|
let owner_pubkey = &signer.pubkey();
|
||||||
|
let space = mem::size_of::<ExchangeState>() as u64;
|
||||||
|
let create_ix =
|
||||||
|
system_instruction::create_account(owner_pubkey, new, 1, space, &id());
|
||||||
|
let request_ix = exchange_instruction::account_request(owner_pubkey, new);
|
||||||
|
(
|
||||||
|
signer,
|
||||||
|
Transaction::new_unsigned_instructions(vec![create_ix, request_ix]),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let accounts = to_create_txs
|
||||||
|
.iter()
|
||||||
|
.fold(0, |len, (_, tx)| len + tx.message().instructions.len() / 2);
|
||||||
|
|
||||||
|
debug!(
|
||||||
|
" Creating {} accounts in {} txs",
|
||||||
|
accounts,
|
||||||
|
to_create_txs.len(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut retries = 0;
|
||||||
|
while !to_create_txs.is_empty() {
|
||||||
|
let (blockhash, _fee_calculator) = client
|
||||||
|
.get_recent_blockhash()
|
||||||
|
.expect("Failed to get blockhash");
|
||||||
|
to_create_txs.par_iter_mut().for_each(|(k, tx)| {
|
||||||
|
let kp: &Keypair = k;
|
||||||
|
tx.sign(&[kp], blockhash);
|
||||||
|
});
|
||||||
|
to_create_txs.iter().for_each(|(_, tx)| {
|
||||||
|
client.async_send_transaction(tx.clone()).expect("transfer");
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut waits = 0;
|
||||||
|
while !to_create_txs.is_empty() {
|
||||||
|
sleep(Duration::from_millis(200));
|
||||||
|
to_create_txs.retain(|(_, tx)| !verify_transaction(client, &tx));
|
||||||
|
if to_create_txs.is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
info!(
|
||||||
|
" {} transactions outstanding, waits {:?}",
|
||||||
|
to_create_txs.len(),
|
||||||
|
waits
|
||||||
|
);
|
||||||
|
waits += 1;
|
||||||
|
if waits >= 5 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !to_create_txs.is_empty() {
|
||||||
|
retries += 1;
|
||||||
|
info!(" Retry {:?} {} txes left", retries, to_create_txs.len());
|
||||||
|
if retries >= 20 {
|
||||||
|
error!(
|
||||||
|
"create_token_accounts: Too many retries ({}), give up",
|
||||||
|
retries
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut new_notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = vec![];
|
||||||
|
for f in ¬funded {
|
||||||
|
if client.get_balance(&f.1).unwrap_or(0) == 0 {
|
||||||
|
new_notfunded.push(*f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
notfunded = new_notfunded;
|
||||||
|
debug!(" Left: {}", notfunded.len());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn compute_and_report_stats(maxes: &Arc<RwLock<Vec<(String, SampleStats)>>>, total_txs_sent: u64) {
|
||||||
|
let mut max_txs = 0;
|
||||||
|
let mut max_elapsed = Duration::new(0, 0);
|
||||||
|
info!("| Max TPS | Total Transactions");
|
||||||
|
info!("+---------------+--------------------");
|
||||||
|
|
||||||
|
for (_sock, stats) in maxes.read().unwrap().iter() {
|
||||||
|
let maybe_flag = match stats.txs {
|
||||||
|
0 => "!!!!!",
|
||||||
|
_ => "",
|
||||||
|
};
|
||||||
|
|
||||||
|
info!("| {:13.2} | {} {}", stats.tps, stats.txs, maybe_flag);
|
||||||
|
|
||||||
|
if stats.elapsed > max_elapsed {
|
||||||
|
max_elapsed = stats.elapsed;
|
||||||
|
}
|
||||||
|
if stats.txs > max_txs {
|
||||||
|
max_txs = stats.txs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info!("+---------------+--------------------");
|
||||||
|
|
||||||
|
if max_txs >= total_txs_sent {
|
||||||
|
info!(
|
||||||
|
"Warning: Average TPS might be under reported, there were no txs sent for a portion of the duration"
|
||||||
|
);
|
||||||
|
max_txs = total_txs_sent;
|
||||||
|
}
|
||||||
|
info!(
|
||||||
|
"{} txs outstanding when test ended (lag) ({:.2}%)",
|
||||||
|
total_txs_sent - max_txs,
|
||||||
|
(total_txs_sent - max_txs) as f64 / total_txs_sent as f64 * 100_f64
|
||||||
|
);
|
||||||
|
info!(
|
||||||
|
"\tAverage TPS: {:.2}",
|
||||||
|
max_txs as f32 / max_elapsed.as_secs() as f32
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_keypairs(num: u64) -> Vec<Keypair> {
|
||||||
|
let mut seed = [0_u8; 32];
|
||||||
|
seed.copy_from_slice(&Keypair::new().pubkey().as_ref());
|
||||||
|
let mut rnd = GenKeys::new(seed);
|
||||||
|
rnd.gen_n_keypairs(num)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypair, amount: u64) {
|
||||||
|
let balance = client.get_balance(&id.pubkey());
|
||||||
|
let balance = balance.unwrap_or(0);
|
||||||
|
if balance >= amount {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let amount_to_drop = amount - balance;
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"Airdropping {:?} lamports from {} for {}",
|
||||||
|
amount_to_drop,
|
||||||
|
drone_addr,
|
||||||
|
id.pubkey(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut tries = 0;
|
||||||
|
loop {
|
||||||
|
let (blockhash, _fee_calculator) = client
|
||||||
|
.get_recent_blockhash()
|
||||||
|
.expect("Failed to get blockhash");
|
||||||
|
match request_airdrop_transaction(&drone_addr, &id.pubkey(), amount_to_drop, blockhash) {
|
||||||
|
Ok(transaction) => {
|
||||||
|
let signature = client.async_send_transaction(transaction).unwrap();
|
||||||
|
|
||||||
|
for _ in 0..30 {
|
||||||
|
if let Ok(Some(_)) = client.get_signature_status(&signature) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep(Duration::from_millis(100));
|
||||||
|
}
|
||||||
|
if client.get_balance(&id.pubkey()).unwrap_or(0) >= amount {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
panic!(
|
||||||
|
"Error requesting airdrop: {:?} to addr: {:?} amount: {}",
|
||||||
|
err, drone_addr, amount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
debug!(" Retry...");
|
||||||
|
tries += 1;
|
||||||
|
if tries > 50 {
|
||||||
|
error!("airdrop_lamports: Too many retries ({}), give up", tries);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
sleep(Duration::from_secs(2));
|
||||||
|
}
|
||||||
|
}
|
218
bench-exchange/src/cli.rs
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
use clap::{crate_description, crate_name, crate_version, 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::process::exit;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
pub struct Config {
|
||||||
|
pub entrypoint_addr: SocketAddr,
|
||||||
|
pub drone_addr: SocketAddr,
|
||||||
|
pub identity: Keypair,
|
||||||
|
pub threads: usize,
|
||||||
|
pub num_nodes: usize,
|
||||||
|
pub duration: Duration,
|
||||||
|
pub transfer_delay: u64,
|
||||||
|
pub fund_amount: u64,
|
||||||
|
pub batch_size: usize,
|
||||||
|
pub chunk_size: 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 {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
|
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
||||||
|
identity: Keypair::new(),
|
||||||
|
num_nodes: 1,
|
||||||
|
threads: 4,
|
||||||
|
duration: Duration::new(u64::max_value(), 0),
|
||||||
|
transfer_delay: 0,
|
||||||
|
fund_amount: 100_000,
|
||||||
|
batch_size: 100,
|
||||||
|
chunk_size: 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> {
|
||||||
|
App::new(crate_name!())
|
||||||
|
.about(crate_description!())
|
||||||
|
.version(crate_version!())
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("entrypoint")
|
||||||
|
.short("n")
|
||||||
|
.long("entrypoint")
|
||||||
|
.value_name("HOST:PORT")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("127.0.0.1:8001")
|
||||||
|
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("drone")
|
||||||
|
.short("d")
|
||||||
|
.long("drone")
|
||||||
|
.value_name("HOST:PORT")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("127.0.0.1:9900")
|
||||||
|
.help("Location of the drone; defaults to 127.0.0.1:9900"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("identity")
|
||||||
|
.short("i")
|
||||||
|
.long("identity")
|
||||||
|
.value_name("PATH")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("File containing a client identity (keypair)"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("threads")
|
||||||
|
.long("threads")
|
||||||
|
.value_name("<threads>")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("1")
|
||||||
|
.help("Number of threads submitting transactions"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("num-nodes")
|
||||||
|
.long("num-nodes")
|
||||||
|
.value_name("NUM")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("1")
|
||||||
|
.help("Wait for NUM nodes to converge"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("duration")
|
||||||
|
.long("duration")
|
||||||
|
.value_name("SECS")
|
||||||
|
.takes_value(true)
|
||||||
|
.default_value("60")
|
||||||
|
.help("Seconds to run benchmark, then exit; default is forever"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("transfer-delay")
|
||||||
|
.long("transfer-delay")
|
||||||
|
.value_name("<delay>")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("0")
|
||||||
|
.help("Delay between each chunk"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("fund-amount")
|
||||||
|
.long("fund-amount")
|
||||||
|
.value_name("<fund>")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("100000")
|
||||||
|
.help("Number of lamports to fund to each signer"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("batch-size")
|
||||||
|
.long("batch-size")
|
||||||
|
.value_name("<batch>")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("1000")
|
||||||
|
.help("Number of transactions before the signer rolls over"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("chunk-size")
|
||||||
|
.long("chunk-size")
|
||||||
|
.value_name("<cunk>")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("500")
|
||||||
|
.help("Number of transactions to generate and send at a time"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("account-groups")
|
||||||
|
.long("account-groups")
|
||||||
|
.value_name("<groups>")
|
||||||
|
.takes_value(true)
|
||||||
|
.required(false)
|
||||||
|
.default_value("10")
|
||||||
|
.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 {
|
||||||
|
let mut args = Config::default();
|
||||||
|
|
||||||
|
args.entrypoint_addr = solana_netutil::parse_host_port(matches.value_of("entrypoint").unwrap())
|
||||||
|
.unwrap_or_else(|e| {
|
||||||
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
|
exit(1)
|
||||||
|
});
|
||||||
|
|
||||||
|
args.drone_addr = solana_netutil::parse_host_port(matches.value_of("drone").unwrap())
|
||||||
|
.unwrap_or_else(|e| {
|
||||||
|
eprintln!("failed to parse drone address: {}", e);
|
||||||
|
exit(1)
|
||||||
|
});
|
||||||
|
|
||||||
|
if matches.is_present("identity") {
|
||||||
|
args.identity = read_keypair_file(matches.value_of("identity").unwrap())
|
||||||
|
.expect("can't read client identity");
|
||||||
|
} else {
|
||||||
|
args.identity = {
|
||||||
|
let seed = [42_u8; 32];
|
||||||
|
let mut rnd = GenKeys::new(seed);
|
||||||
|
rnd.gen_keypair()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
args.threads = value_t!(matches.value_of("threads"), usize).expect("Failed to parse threads");
|
||||||
|
args.num_nodes =
|
||||||
|
value_t!(matches.value_of("num-nodes"), usize).expect("Failed to parse num-nodes");
|
||||||
|
let duration = value_t!(matches.value_of("duration"), u64).expect("Failed to parse duration");
|
||||||
|
args.duration = Duration::from_secs(duration);
|
||||||
|
args.transfer_delay =
|
||||||
|
value_t!(matches.value_of("transfer-delay"), u64).expect("Failed to parse transfer-delay");
|
||||||
|
args.fund_amount =
|
||||||
|
value_t!(matches.value_of("fund-amount"), u64).expect("Failed to parse fund-amount");
|
||||||
|
args.batch_size =
|
||||||
|
value_t!(matches.value_of("batch-size"), usize).expect("Failed to parse batch-size");
|
||||||
|
args.chunk_size =
|
||||||
|
value_t!(matches.value_of("chunk-size"), usize).expect("Failed to parse chunk-size");
|
||||||
|
args.account_groups = value_t!(matches.value_of("account-groups"), usize)
|
||||||
|
.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
|
||||||
|
}
|
3
bench-exchange/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod bench;
|
||||||
|
pub mod cli;
|
||||||
|
mod order_book;
|
83
bench-exchange/src/main.rs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
pub mod bench;
|
||||||
|
mod cli;
|
||||||
|
pub mod order_book;
|
||||||
|
|
||||||
|
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
||||||
|
use log::*;
|
||||||
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
|
use solana_sdk::signature::KeypairUtil;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
solana_logger::setup();
|
||||||
|
solana_metrics::set_panic_hook("bench-exchange");
|
||||||
|
|
||||||
|
let matches = cli::build_args().get_matches();
|
||||||
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
|
let cli::Config {
|
||||||
|
entrypoint_addr,
|
||||||
|
drone_addr,
|
||||||
|
identity,
|
||||||
|
threads,
|
||||||
|
num_nodes,
|
||||||
|
duration,
|
||||||
|
transfer_delay,
|
||||||
|
fund_amount,
|
||||||
|
batch_size,
|
||||||
|
chunk_size,
|
||||||
|
account_groups,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
write_to_client_file,
|
||||||
|
read_from_client_file,
|
||||||
|
..
|
||||||
|
} = cli_config;
|
||||||
|
|
||||||
|
let config = Config {
|
||||||
|
identity,
|
||||||
|
threads,
|
||||||
|
duration,
|
||||||
|
transfer_delay,
|
||||||
|
fund_amount,
|
||||||
|
batch_size,
|
||||||
|
chunk_size,
|
||||||
|
account_groups,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
read_from_client_file,
|
||||||
|
};
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
134
bench-exchange/src/order_book.rs
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
use itertools::EitherOrBoth::{Both, Left, Right};
|
||||||
|
use itertools::Itertools;
|
||||||
|
use log::*;
|
||||||
|
use solana_exchange_api::exchange_state::*;
|
||||||
|
use solana_sdk::pubkey::Pubkey;
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
use std::collections::BinaryHeap;
|
||||||
|
use std::{error, fmt};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct ToOrder {
|
||||||
|
pub pubkey: Pubkey,
|
||||||
|
pub info: OrderInfo,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for ToOrder {
|
||||||
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
|
other.info.price.cmp(&self.info.price)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl PartialOrd for ToOrder {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct FromOrder {
|
||||||
|
pub pubkey: Pubkey,
|
||||||
|
pub info: OrderInfo,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for FromOrder {
|
||||||
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
|
self.info.price.cmp(&other.info.price)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl PartialOrd for FromOrder {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct OrderBook {
|
||||||
|
// TODO scale to x token types
|
||||||
|
to_ab: BinaryHeap<ToOrder>,
|
||||||
|
from_ab: BinaryHeap<FromOrder>,
|
||||||
|
}
|
||||||
|
impl fmt::Display for OrderBook {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
writeln!(
|
||||||
|
f,
|
||||||
|
"+-Order Book--------------------------+-------------------------------------+"
|
||||||
|
)?;
|
||||||
|
for (i, it) in self
|
||||||
|
.to_ab
|
||||||
|
.iter()
|
||||||
|
.zip_longest(self.from_ab.iter())
|
||||||
|
.enumerate()
|
||||||
|
{
|
||||||
|
match it {
|
||||||
|
Both(to, from) => writeln!(
|
||||||
|
f,
|
||||||
|
"| T AB {:8} for {:8}/{:8} | F AB {:8} for {:8}/{:8} |{}",
|
||||||
|
to.info.tokens,
|
||||||
|
SCALER,
|
||||||
|
to.info.price,
|
||||||
|
from.info.tokens,
|
||||||
|
SCALER,
|
||||||
|
from.info.price,
|
||||||
|
i
|
||||||
|
)?,
|
||||||
|
Left(to) => writeln!(
|
||||||
|
f,
|
||||||
|
"| T AB {:8} for {:8}/{:8} | |{}",
|
||||||
|
to.info.tokens, SCALER, to.info.price, i
|
||||||
|
)?,
|
||||||
|
Right(from) => writeln!(
|
||||||
|
f,
|
||||||
|
"| | F AB {:8} for {:8}/{:8} |{}",
|
||||||
|
from.info.tokens, SCALER, from.info.price, i
|
||||||
|
)?,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"+-------------------------------------+-------------------------------------+"
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OrderBook {
|
||||||
|
// TODO
|
||||||
|
// pub fn cancel(&mut self, pubkey: Pubkey) -> Result<(), Box<dyn error::Error>> {
|
||||||
|
// Ok(())
|
||||||
|
// }
|
||||||
|
pub fn push(&mut self, pubkey: Pubkey, info: OrderInfo) -> Result<(), Box<dyn error::Error>> {
|
||||||
|
check_trade(info.side, info.tokens, info.price)?;
|
||||||
|
match info.side {
|
||||||
|
OrderSide::Ask => {
|
||||||
|
self.to_ab.push(ToOrder { pubkey, info });
|
||||||
|
}
|
||||||
|
OrderSide::Bid => {
|
||||||
|
self.from_ab.push(FromOrder { pubkey, info });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
pub fn pop(&mut self) -> Option<(ToOrder, FromOrder)> {
|
||||||
|
if let Some(pair) = Self::pop_pair(&mut self.to_ab, &mut self.from_ab) {
|
||||||
|
return Some(pair);
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
pub fn get_num_outstanding(&self) -> (usize, usize) {
|
||||||
|
(self.to_ab.len(), self.from_ab.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pop_pair(
|
||||||
|
to_ab: &mut BinaryHeap<ToOrder>,
|
||||||
|
from_ab: &mut BinaryHeap<FromOrder>,
|
||||||
|
) -> Option<(ToOrder, FromOrder)> {
|
||||||
|
let to = to_ab.peek()?;
|
||||||
|
let from = from_ab.peek()?;
|
||||||
|
if from.info.price < to.info.price {
|
||||||
|
debug!("Trade not viable");
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let to = to_ab.pop()?;
|
||||||
|
let from = from_ab.pop()?;
|
||||||
|
Some((to, from))
|
||||||
|
}
|
||||||
|
}
|
2
bench-streamer/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/target/
|
||||||
|
/farf/
|
@ -2,17 +2,13 @@
|
|||||||
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.13.0"
|
version = "0.20.0"
|
||||||
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.13.0" }
|
solana-core = { path = "../core", version = "0.20.0" }
|
||||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
solana-logger = { path = "../logger", version = "0.20.0" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
||||||
|
|
||||||
[features]
|
|
||||||
cuda = ["solana/cuda"]
|
|
||||||
erasure = []
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
||||||
use solana::packet::{Packet, SharedPackets, BLOB_SIZE, PACKET_DATA_SIZE};
|
use solana_core::packet::PacketsRecycler;
|
||||||
use solana::result::Result;
|
use solana_core::packet::{Packet, Packets, BLOB_SIZE, PACKET_DATA_SIZE};
|
||||||
use solana::streamer::{receiver, PacketReceiver};
|
use solana_core::result::Result;
|
||||||
|
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};
|
||||||
@ -14,19 +15,19 @@ use std::time::SystemTime;
|
|||||||
|
|
||||||
fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
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 msgs = SharedPackets::default();
|
let mut msgs = Packets::default();
|
||||||
let msgs_ = msgs.clone();
|
msgs.packets.resize(10, Packet::default());
|
||||||
msgs.write().unwrap().packets.resize(10, Packet::default());
|
for w in msgs.packets.iter_mut() {
|
||||||
for w in &mut msgs.write().unwrap().packets {
|
|
||||||
w.meta.size = PACKET_DATA_SIZE;
|
w.meta.size = PACKET_DATA_SIZE;
|
||||||
w.meta.set_addr(&addr);
|
w.meta.set_addr(&addr);
|
||||||
}
|
}
|
||||||
|
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_.read().unwrap().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 < BLOB_SIZE);
|
||||||
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
||||||
@ -43,7 +44,7 @@ fn sink(exit: Arc<AtomicBool>, rvs: Arc<AtomicUsize>, r: PacketReceiver) -> Join
|
|||||||
}
|
}
|
||||||
let timer = Duration::new(1, 0);
|
let timer = Duration::new(1, 0);
|
||||||
if let Ok(msgs) = r.recv_timeout(timer) {
|
if let Ok(msgs) = r.recv_timeout(timer) {
|
||||||
rvs.fetch_add(msgs.read().unwrap().packets.len(), Ordering::Relaxed);
|
rvs.fetch_add(msgs.packets.len(), Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -74,6 +75,7 @@ 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_netutil::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();
|
||||||
@ -83,7 +85,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, "bench-streamer"));
|
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());
|
||||||
|
4
bench-tps/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
/config/
|
||||||
|
/config-local/
|
||||||
|
/farf/
|
@ -2,23 +2,37 @@
|
|||||||
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.13.0"
|
version = "0.20.0"
|
||||||
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.13.0" }
|
serde = "1.0.101"
|
||||||
solana-client = { path = "../client", version = "0.13.0" }
|
serde_derive = "1.0.101"
|
||||||
solana-drone = { path = "../drone", version = "0.13.0" }
|
serde_json = "1.0.41"
|
||||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
serde_yaml = "0.8.11"
|
||||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
solana-core = { path = "../core", version = "0.20.0" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
solana-genesis = { path = "../genesis", version = "0.20.0" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
solana-client = { path = "../client", version = "0.20.0" }
|
||||||
|
solana-drone = { path = "../drone", version = "0.20.0" }
|
||||||
|
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.0", optional = true }
|
||||||
|
solana-logger = { path = "../logger", version = "0.20.0" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
||||||
|
solana-measure = { path = "../measure", version = "0.20.0" }
|
||||||
|
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
||||||
|
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.0", optional = true }
|
||||||
|
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.0", optional = true }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
serial_test = "0.2.0"
|
||||||
|
serial_test_derive = "0.2.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
cuda = ["solana/cuda"]
|
move = ["solana-core/move", "solana-librapay-api", "solana-move-loader-program", "solana-move-loader-api"]
|
||||||
erasure = []
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
use std::net::SocketAddr;
|
|
||||||
use std::process::exit;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
|
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,
|
||||||
@ -17,20 +17,32 @@ pub struct Config {
|
|||||||
pub tx_count: usize,
|
pub tx_count: 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 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,
|
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,
|
||||||
|
use_move: false,
|
||||||
|
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -40,12 +52,12 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
App::new(crate_name!()).about(crate_description!())
|
App::new(crate_name!()).about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(crate_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 +65,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 +103,11 @@ 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(
|
||||||
Arg::with_name("tx_count")
|
Arg::with_name("tx_count")
|
||||||
.long("tx_count")
|
.long("tx_count")
|
||||||
@ -106,6 +123,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,9 +166,9 @@ 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_netutil::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)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -131,7 +181,7 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,5 +213,26 @@ 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");
|
||||||
|
|
||||||
|
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,15 +1,136 @@
|
|||||||
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_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::do_bench_tps;
|
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
||||||
|
pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
|
||||||
|
|
||||||
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().get_matches();
|
||||||
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cfg = cli::extract_args(&matches);
|
let cli::Config {
|
||||||
|
entrypoint_addr,
|
||||||
|
drone_addr,
|
||||||
|
id,
|
||||||
|
num_nodes,
|
||||||
|
tx_count,
|
||||||
|
client_ids_and_stake_file,
|
||||||
|
write_to_client_file,
|
||||||
|
read_from_client_file,
|
||||||
|
target_lamports_per_signature,
|
||||||
|
use_move,
|
||||||
|
num_lamports_per_account,
|
||||||
|
..
|
||||||
|
} = &cli_config;
|
||||||
|
|
||||||
do_bench_tps(cfg);
|
if *write_to_client_file {
|
||||||
|
info!("Generating {} keypairs", *tx_count * 2);
|
||||||
|
let (keypairs, _) = generate_keypairs(&id, *tx_count as u64 * 2);
|
||||||
|
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);
|
||||||
|
exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
|
||||||
|
if nodes.len() < num_clients {
|
||||||
|
eprintln!(
|
||||||
|
"Error: Insufficient nodes discovered. Expecting {} or more",
|
||||||
|
num_nodes
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
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() < tx_count * 2 {
|
||||||
|
eprintln!(
|
||||||
|
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
||||||
|
tx_count * 2,
|
||||||
|
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,
|
||||||
|
*tx_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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -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 @@
|
|||||||
|
+--------------------+
|
||||||
+--------------+
|
| |
|
||||||
| |
|
+--------+ Neighborhood 0 +----------+
|
||||||
+------------+ Leader +------------+
|
| | | |
|
||||||
| | | |
|
| +--------------------+ |
|
||||||
| +--------------+ |
|
v v
|
||||||
v v
|
+---------+----------+ +----------+---------+
|
||||||
+--------+--------+ +--------+--------+
|
| | | |
|
||||||
| +--------------------->+ |
|
| Neighborhood 1 | | Neighborhood 2 |
|
||||||
+-----------------+ Validator 1 | | Validator 2 +-------------+
|
| | | |
|
||||||
| | +<---------------------+ | |
|
+---+-----+----------+ +----------+-----+---+
|
||||||
| +------+-+-+------+ +---+-+-+---------+ |
|
| | | |
|
||||||
| | | | | | | |
|
v v v v
|
||||||
| | | | | | | |
|
+------------------+-+ +-+------------------+ +------------------+-+ +-+------------------+
|
||||||
| +---------------------------------------------+ | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| Neighborhood 3 | | Neighborhood 4 | | Neighborhood 5 | | Neighborhood 6 |
|
||||||
| | | | | +----------------------+ | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||||
| | | | +--------------------------------------------+ |
|
|
||||||
| | | | | | | |
|
|
||||||
| | | +----------------------+ | | |
|
|
||||||
| | | | | | | |
|
|
||||||
v v v v v v v v
|
|
||||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
|
||||||
| | | | | | | |
|
|
||||||
| Neighborhood 1 | | Neighborhood 2 | | Neighborhood 3 | | Neighborhood 4 |
|
|
||||||
| | | | | | | |
|
|
||||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
|
||||||
|
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 |
|
||||||
|
+-----------------+ +-----------------+ +-----------------+ +---+
|
||||||
|
|
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 |
|
||||||
|
| |
|
||||||
|
`------------`
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
.--------------------------------------.
|
.--------------------------------------.
|
||||||
| Fullnode |
|
| Validator |
|
||||||
| |
|
| |
|
||||||
.--------. | .-------------------. |
|
.--------. | .-------------------. |
|
||||||
| |---->| | |
|
| |---->| | |
|
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 |
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.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-pruned2 (1).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" 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="176" width="40" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="12" x2="12" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="12" x2="12" y1="48" y2="128"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="16" x2="32" y1="48" y2="80"/>
|
||||||
|
<line x1="36" x2="32" y1="88" y2="80"/>
|
||||||
|
<line x1="36" x2="36" y1="96" y2="88"/>
|
||||||
|
<line x1="36" x2="36" y1="96" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="9" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="9" y="44">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="9" y="140">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="172">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
92
book/src/.gitbook/assets/forks-pruned2 (2).svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" 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="176" width="40" x="0" y="0"/>
|
||||||
|
<g>
|
||||||
|
<line x1="12" x2="12" y1="16" y2="32"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="12" x2="12" y1="48" y2="128"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<line x1="16" x2="32" y1="48" y2="80"/>
|
||||||
|
<line x1="36" x2="32" y1="88" y2="80"/>
|
||||||
|
<line x1="36" x2="36" y1="96" y2="88"/>
|
||||||
|
<line x1="36" x2="36" y1="96" y2="160"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="9" y="12">
|
||||||
|
1
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="9" y="44">
|
||||||
|
3
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="9" y="140">
|
||||||
|
6
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="33" y="172">
|
||||||
|
7
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |