cpp_dependency_graph 0.1.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +22 -6
- data/Rakefile +4 -4
- data/cpp_dependency_graph.gemspec +11 -12
- data/docs/examples/rethinkdb_errors_header_include.svg +1 -0
- data/exe/cpp_dependency_graph +17 -15
- data/lib/cpp_dependency_graph.rb +11 -3
- data/lib/cpp_dependency_graph/graph_to_dot_visualiser.rb +10 -8
- data/lib/cpp_dependency_graph/{include_dependency_graph.rb → include_component_dependency_graph.rb} +5 -7
- data/lib/cpp_dependency_graph/include_file_dependency_graph.rb +33 -0
- data/lib/cpp_dependency_graph/version.rb +1 -1
- metadata +26 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49dbf00badc862586088263651f5b0eeb26b9953fae870baa86e14e9d96dee36
|
4
|
+
data.tar.gz: e935e59934e696511cde583c8b89b60b201cafc84e65e3dab487829769f3f9ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 203cf7a07370d1fde0cb90e376d1b45ec605aa7332dff34247e99463099b1e496d3f05c831589df73c03c50c776a3838db201acd759468062db49c87560de48f
|
7
|
+
data.tar.gz: 4e122ad96022ba802effbc94c9ac9c185810838ed762514380444d2227ede7f25a97c66eafd7f8436a59d984f5816dad39fc35379dc2131ff8b0012a5d2e8ce8
|
data/README.md
CHANGED
@@ -37,8 +37,6 @@ A huge shout out to the people behind these projects.
|
|
37
37
|
|
38
38
|
### dep-matrix
|
39
39
|
|
40
|
-
|
41
|
-
|
42
40
|
## Usage
|
43
41
|
|
44
42
|
### Installation
|
@@ -53,7 +51,7 @@ A huge shout out to the people behind these projects.
|
|
53
51
|
|
54
52
|
To generate the overall component dependency graph for a project, use it like so -
|
55
53
|
|
56
|
-
`cpp_dependency_graph
|
54
|
+
`cpp_dependency_graph visualise_project -r spec\test\example_project\ -o deps.dot -f dot`
|
57
55
|
|
58
56
|
Below is the overall `dot` and `d3` component dependency visualisations for [leveldb](https://github.com/google/leveldb)
|
59
57
|
|
@@ -69,7 +67,7 @@ Below is the overall `dot` and `d3` component dependency visualisations for [lev
|
|
69
67
|
|
70
68
|
This will highlight the dependencies coming in and going out of a specific component. This allows you to filter out extraneous detail and study individual components in more detail.
|
71
69
|
|
72
|
-
`cpp_dependency_graph
|
70
|
+
`cpp_dependency_graph visualise_component -r spec\test\example_project\ --component Engine -o deps.dot -f dot`
|
73
71
|
|
74
72
|
Here's a component dependency visualisation generated for the `queue` component in [rethinkdb](https://github.com/rethinkdb/rethinkdb)
|
75
73
|
|
@@ -81,7 +79,7 @@ Here's a component dependency visualisation generated for the `queue` component
|
|
81
79
|
|
82
80
|
This will highlight dependencies of includes within a specific component
|
83
81
|
|
84
|
-
`cpp_dependency_graph
|
82
|
+
`cpp_dependency_graph visualise_component_includes -r spec\test\example_project\ --component Engine`
|
85
83
|
|
86
84
|
Here's a component include dependency visualisation generated for the `queue` component in [rethinkdb](https://github.com/rethinkdb/rethinkdb)
|
87
85
|
|
@@ -89,6 +87,16 @@ Here's a component include dependency visualisation generated for the `queue` co
|
|
89
87
|
|
90
88
|

|
91
89
|
|
90
|
+
### Header file include dependency graph
|
91
|
+
|
92
|
+
This will highlight include dependencies of header files globally within the project
|
93
|
+
|
94
|
+
`cpp_dependency_graph visualise_header_includes -r spec\test\example_project\ --header Engine.h`
|
95
|
+
|
96
|
+
Here's a component include dependency visualisation generated for the `errors.hpp` header file in [rethinkdb](https://github.com/rethinkdb/rethinkdb)
|
97
|
+
|
98
|
+

|
99
|
+
|
92
100
|
### Cyclic dependencies only graph
|
93
101
|
|
94
102
|
This will highlight cyclic dependencies between components within a project. This is especially useful for targeted refactoring activities to reduce coupling between components.
|
@@ -103,7 +111,15 @@ Here's the cyclic dependencies only visualisation generated for [rethinkdb](http
|
|
103
111
|
|
104
112
|
## Development
|
105
113
|
|
106
|
-
`bundle exec cpp_dependency_graph
|
114
|
+
`bundle exec cpp_dependency_graph <cmd> -r <dir> ...`
|
115
|
+
|
116
|
+
### Running all unit tests
|
117
|
+
|
118
|
+
`rake spec`
|
119
|
+
|
120
|
+
### Running a single test
|
121
|
+
|
122
|
+
`rake spec SPEC=<path_to_spec_file>`
|
107
123
|
|
108
124
|
## License
|
109
125
|
|
data/Rakefile
CHANGED
@@ -4,8 +4,8 @@ require 'bundler/gem_tasks'
|
|
4
4
|
require 'rspec/core/rake_task'
|
5
5
|
require 'rubocop/rake_task'
|
6
6
|
|
7
|
-
RSpec::Core::RakeTask.new(:spec)
|
8
|
-
|
9
|
-
# task default: spec
|
10
|
-
|
11
7
|
RuboCop::RakeTask.new
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
10
|
+
t.pattern = Dir.glob('spec/**/*_spec.rb')
|
11
|
+
end
|
@@ -25,21 +25,20 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
26
|
s.require_paths = ['lib']
|
27
27
|
|
28
|
-
s.required_ruby_version = Gem::Requirement.new('>= 2.
|
29
|
-
s.rubygems_version = '
|
28
|
+
s.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
|
29
|
+
s.rubygems_version = '3.1.2'
|
30
30
|
|
31
31
|
s.add_runtime_dependency 'docopt', '~> 0.6'
|
32
|
-
s.add_runtime_dependency 'graphviz', '~> 1.
|
33
|
-
s.add_runtime_dependency 'json', '~> 2.
|
34
|
-
s.add_runtime_dependency 'parallel', '~> 1.12'
|
32
|
+
s.add_runtime_dependency 'ruby-graphviz', '~> 1.2'
|
33
|
+
s.add_runtime_dependency 'json', '~> 2.3.0'
|
35
34
|
|
36
|
-
s.add_development_dependency 'bundler', '~> 1
|
35
|
+
s.add_development_dependency 'bundler', '~> 2.1'
|
37
36
|
s.add_development_dependency 'debase', '~> 0.2'
|
38
|
-
s.add_development_dependency 'rake', '~>
|
39
|
-
s.add_development_dependency 'rspec', '~> 3.
|
40
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
41
|
-
s.add_development_dependency 'ruby-debug-ide', '~> 0.
|
42
|
-
s.add_development_dependency 'ruby-prof', '~> 0.
|
43
|
-
s.add_development_dependency 'simplecov', '~> 0.
|
37
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
38
|
+
s.add_development_dependency 'rspec', '~> 3.9'
|
39
|
+
s.add_development_dependency 'rubocop', '~> 0.81'
|
40
|
+
s.add_development_dependency 'ruby-debug-ide', '~> 0.7'
|
41
|
+
s.add_development_dependency 'ruby-prof', '~> 0.18'
|
42
|
+
s.add_development_dependency 'simplecov', '~> 0.18'
|
44
43
|
s.add_development_dependency 'simplecov-console', '~> 0.4'
|
45
44
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="1536" height="722" style="perspective-origin:768px 361px;transform-origin:768px 361px;" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><rect width="1536" height="722" style="overflow-x:visible;overflow-y:visible;pointer-events:all;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform-origin:0px 0px;fill:none;"/><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><defs style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><marker id="default" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);d:path("M 0 -5 L 10 0 L 0 5");"/></marker><marker id="dependency" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);d:path("M 0 -5 L 10 0 L 0 5");"/></marker><marker id="dependants" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);d:path("M 0 -5 L 10 0 L 0 5");"/></marker></defs><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><path class="link" marker-end="url(#default)" d="M824.7314577733719,445.17013158385123L751.4924954629396,358.5668145800863" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 824.731 445.17 L 751.492 358.567");"/><path class="link" marker-end="url(#default)" d="M713.5730534613863,258.55472427001047L735.9248725180471,330.21644200176974" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 713.573 258.555 L 735.925 330.216");"/><path class="link" marker-end="url(#default)" d="M782.2238931080286,431.7884418218213L748.0050054986211,360.8301389161922" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 782.224 431.788 L 748.005 360.83");"/><path class="link" marker-end="url(#default)" d="M726.1431020308893,295.0242542349266L736.2649017326157,330.1143851044905" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 726.143 295.024 L 736.265 330.114");"/><path class="link" marker-end="url(#default)" d="M750.593913473179,257.30589302857874L742.6426032304965,329.5670088476135" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 750.594 257.306 L 742.643 329.567");"/><path class="link" marker-end="url(#default)" d="M675.3052592209143,345.0892290973707L724.3393884296817,345.74677303144796" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 675.305 345.089 L 724.339 345.747");"/><path class="link" marker-end="url(#default)" d="M685.6661884990369,285.4134785288226L729.72534171606,333.77125764724855" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 685.666 285.413 L 729.725 333.771");"/><path class="link" marker-end="url(#default)" d="M830.0576421153336,484.05733105803847L749.7921988404297,359.8269714951077" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 830.058 484.057 L 749.792 359.827");"/><path class="link" marker-end="url(#default)" d="M699.7529915777192,320.33819398280787L726.8385492202722,337.2348596095234" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 699.753 320.338 L 726.839 337.235");"/><path class="link" marker-end="url(#default)" d="M743.2084230279708,221.62432307321768L741.1524078699999,329.4710144876581" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 743.208 221.624 L 741.152 329.471");"/><path class="link" marker-end="url(#default)" d="M814.4977954452266,402.3851096711924L753.9371733686743,356.0009212418831" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 814.498 402.385 L 753.937 356.001");"/><path class="link" marker-end="url(#default)" d="M656.9666465488115,310.7047184649909L725.6276209913405,339.5729204472052" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 656.967 310.705 L 725.628 339.573");"/><path class="link" marker-end="url(#default)" d="M831.5615276140223,330.33526962123113L757.0982746823878,343.1661639413176" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 831.562 330.335 L 757.098 343.166");"/><path class="link" marker-end="url(#default)" d="M645.2059969145175,380.5087776749402L725.3191294697248,351.5731577388932" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 645.206 380.509 L 725.319 351.573");"/><path class="link" marker-end="url(#default)" d="M702.7072678837017,221.9506600617466L735.988805326902,330.19664307548317" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 702.707 221.951 L 735.989 330.197");"/><path class="link" marker-end="url(#default)" d="M888.2519826140206,477.89590322091584L753.1330984986355,356.9715716901176" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 888.252 477.896 L 753.133 356.972");"/><path class="link" marker-end="url(#default)" d="M609.0431127551606,370.48022442445006L724.6160876575423,348.9850750524088" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 609.043 370.48 L 724.616 348.985");"/><path class="link" marker-end="url(#default)" d="M817.9639035022202,227.21337190893755L749.8249269811121,332.13026283422545" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 817.964 227.213 L 749.825 332.13");"/><path class="link" marker-end="url(#default)" d="M780.1206590752068,395.0708536376371L751.1454508842684,358.8522902091525" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 780.121 395.071 L 751.145 358.852");"/><path class="link" marker-end="url(#default)" d="M645.5457796253468,276.9002996170178L727.4780620877252,336.2848048304035" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 645.546 276.9 L 727.478 336.285");"/><path class="link" marker-end="url(#default)" d="M847.0530885987478,420.2109607774105L754.3616699622363,355.42094145542023" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 847.053 420.211 L 754.362 355.421");"/><path class="link" marker-end="url(#default)" d="M590.1474820071631,401.2046842547474L725.3458980622185,351.64672439584683" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 590.147 401.205 L 725.346 351.647");"/><path class="link" marker-end="url(#default)" d="M728.571491303343,188.5917641970646L739.5557305404275,329.51790963303466" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 728.571 188.592 L 739.556 329.518");"/><path class="link" marker-end="url(#default)" d="M762.4731416838355,464.36090153052015L743.8040130934229,362.1992276547444" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 762.473 464.361 L 743.804 362.199");"/><path class="link" marker-end="url(#default)" d="M637.6406555310864,342.9297302501012L724.345051557658,345.4824417664399" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 637.641 342.93 L 724.345 345.482");"/><path class="link" marker-end="url(#default)" d="M826.957698245014,369.1343708043198L756.7714817475214,350.2541729794686" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 826.958 369.134 L 756.771 350.254");"/><path class="link" marker-end="url(#default)" d="M712.1722727514934,365.1179190287549L727.1178028675088,355.13364810351726" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 712.172 365.118 L 727.118 355.134");"/><path class="link" marker-end="url(#default)" d="M676.0432234766016,249.5024421672299L731.6378004216814,332.27100718765126" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 676.043 249.502 L 731.638 332.271");"/><path class="link" marker-end="url(#default)" d="M863.3998711437758,456.3604778822772L753.0979455615617,357.01072520054277" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 863.4 456.36 L 753.098 357.011");"/><path class="link" marker-end="url(#default)" d="M621.1074108364091,461.73131625208873L728.9757762913279,357.43710145543486" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 621.107 461.731 L 728.976 357.437");"/><path class="link" marker-end="url(#default)" d="M782.7353052941318,224.21414476351922L746.2068215358672,330.36594215011826" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 782.735 224.214 L 746.207 330.366");"/><path class="link" marker-end="url(#default)" d="M741.3686397206018,434.11909197029195L740.9372454653039,362.46771783296913" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 741.369 434.119 L 740.937 362.468");"/><path class="link" marker-end="url(#default)" d="M617.4715467937516,307.9118282765489L725.0710512081287,341.10424062616715" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 617.472 307.912 L 725.071 341.104");"/><path class="link" marker-end="url(#default)" d="M863.0454272526651,348.8841643812061L757.3332094590363,346.36163210104536" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 863.045 348.884 L 757.333 346.362");"/><path class="link" marker-end="url(#default)" d="M645.5195291518605,439.5286611179817L729.0625760674949,357.5262012980832" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 645.52 439.529 L 729.063 357.526");"/><path class="link" marker-end="url(#default)" d="M691.1623526185913,185.44673707227815L735.9599843203335,330.20553328252663" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 691.162 185.447 L 735.96 330.206");"/><path class="link" marker-end="url(#default)" d="M791.4688895181879,501.646560570478L745.941057553539,361.6590281516335" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 791.469 501.647 L 745.941 361.659");"/><path class="link" marker-end="url(#default)" d="M594.2859109720567,335.4166173499794L724.3805047305577,344.7831226926528" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 594.286 335.417 L 724.38 344.783");"/><path class="link" marker-end="url(#default)" d="M760.2535956745775,298.2993138086093L747.0619586682575,330.6869450362976" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 760.254 298.299 L 747.062 330.687");"/><path class="link" marker-end="url(#default)" d="M746.8363507094721,396.7960047461888L742.7717262513393,362.35430186686193" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 746.836 396.796 L 742.772 362.354");"/><path class="link" marker-end="url(#default)" d="M645.8639446569878,235.28805823158137L730.0929733109095,333.44617829436663" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 645.864 235.288 L 730.093 333.446");"/><path class="link" marker-end="url(#default)" d="M861.0699707238473,384.14675797024665L756.564084573695,350.96174074796136" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 861.07 384.147 L 756.564 350.962");"/><path class="link" marker-end="url(#default)" d="M675.8514566472609,415.24103344712347L729.5489019399677,358.0016534245455" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 675.851 415.241 L 729.549 358.002");"/><path class="link" marker-end="url(#default)" d="M805.2320282295434,191.78768809483066L747.1968732312911,330.7425932796914" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 805.232 191.788 L 747.197 330.743");"/><path class="link" marker-end="url(#default)" d="M796.4669199020715,466.2068441893844L747.7661377832193,360.94298237067613" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 796.467 466.207 L 747.766 360.943");"/><path class="link" marker-end="url(#default)" d="M573.8908647115677,305.7658526795704L724.7964601900107,342.10511042018567" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 573.891 305.766 L 724.796 342.105");"/><path class="link" marker-end="url(#default)" d="M788.4723110216162,360.236282005276L756.6440517172418,350.70254198988283" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 788.472 360.236 L 756.644 350.703");"/><path class="link" marker-end="url(#default)" d="M624.7680391516108,413.5167729626643L726.5770760422746,354.2673394798982" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 624.768 413.517 L 726.577 354.267");"/><path class="link" marker-end="url(#default)" d="M662.7023005262081,205.78091279598647L732.804859134037,331.5555162979163" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 662.702 205.781 L 732.805 331.556");"/><path class="link" marker-end="url(#default)" d="M899.7997849863265,375.6039601271753L757.0584187026662,348.99207662361283" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 899.8 375.604 L 757.058 348.992");"/><path class="link" marker-end="url(#default)" d="M590.6148439020802,437.7998292027239L726.7599571009215,354.573909114637" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 590.615 437.8 L 726.76 354.574");"/><path class="link" marker-end="url(#default)" d="M833.1296490695308,173.80992536543587L748.6337713938336,331.4258551379049" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 833.13 173.81 L 748.634 331.426");"/><path class="link" marker-end="url(#default)" d="M656.2773879551258,528.357965648133L733.8977076619668,360.9374410525468" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 656.277 528.358 L 733.898 360.937");"/><path class="link" marker-end="url(#default)" d="M615.7911550106287,256.5541212271794L727.4161165267112,336.37085102706976" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 615.791 256.554 L 727.416 336.371");"/><path class="link" marker-end="url(#default)" d="M900.0105208147527,249.07867521977175L754.9321158505779,337.3887848457041" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 900.01 249.079 L 754.932 337.389");"/><path class="link" marker-end="url(#default)" d="M678.1009366352123,381.6121093349265L726.4916840431775,354.1188415269405" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 678.101 381.612 L 726.492 354.119");"/><path class="link" marker-end="url(#default)" d="M767.3163328995299,188.03237786176265L743.5661082270468,329.6951281550821" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 767.316 188.032 L 743.566 329.695");"/><path class="link" marker-end="url(#default)" d="M754.2788596951001,507.03056197221406L742.2100894943086,362.41086061044325" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 754.279 507.031 L 742.21 362.411");"/><path class="link" marker-end="url(#default)" d="M544.7595265137402,323.48450723256013L724.4453202475912,344.0883458967887" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 544.76 323.484 L 724.445 344.088");"/><path class="link" marker-end="url(#default)" d="M787.1538488243145,328.1028590821421L756.2323836987119,340.0300014227419" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 787.154 328.103 L 756.232 340.03");"/><path class="link" marker-end="url(#default)" d="M710.2456248213821,447.4498774603711L736.0755718805899,361.7658073170537" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 710.246 447.45 L 736.076 361.766");"/><path class="link" marker-end="url(#default)" d="M620.87532712937,183.80890291182436L731.0248543496745,332.70325017943577" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 620.875 183.809 L 731.025 332.703");"/><path class="link" marker-end="url(#default)" d="M935.3854001361425,339.0582349989623L757.3275077620682,345.3823523993668" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 935.385 339.058 L 757.328 345.382");"/><path class="link" marker-end="url(#default)" d="M579.598093612069,469.4420793220624L727.7377872861932,355.99981204432635" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 579.598 469.442 L 727.738 356");"/><path class="link" marker-end="url(#default)" d="M849.9265866679459,224.44377181748757L751.8600085578432,333.6894487815133" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 849.927 224.444 L 751.86 333.689");"/><path class="link" marker-end="url(#default)" d="M686.7042039473516,530.6304165950736L736.1962705392264,361.8016907740022" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 686.704 530.63 L 736.196 361.802");"/><path class="link" marker-end="url(#default)" d="M591.6768309346432,276.1130643850879L725.8953580392528,338.97013946127794" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 591.677 276.113 L 725.895 338.97");"/><path class="link" marker-end="url(#default)" d="M880.4014718865939,283.51213846135835L755.8986198642091,339.2282194268921" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 880.401 283.512 L 755.899 339.228");"/><path class="link" marker-end="url(#default)" d="M713.4929061450166,405.1812073177273L733.9201430236881,360.94782223222353" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 713.493 405.181 L 733.92 360.948");"/><path class="link" marker-end="url(#default)" d="M691.6427278783292,151.0899210773598L736.7993269412059,329.96989553126775" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 691.643 151.09 L 736.799 329.97");"/><path class="link" marker-end="url(#default)" d="M882.3827554663139,413.46371026231856L755.7312873709641,353.0699295452346" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 882.383 413.464 L 755.731 353.07");"/><path class="link" marker-end="url(#default)" d="M570.4284796281877,363.2463539756299L724.4220712596838,347.6324688885029" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 570.428 363.246 L 724.422 347.632");"/><path class="link" marker-end="url(#default)" d="M782.9127956115566,263.29820197654834L748.3220420759326,331.2629941615034" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 782.913 263.298 L 748.322 331.263");"/><path class="link" marker-end="url(#default)" d="M637.5613153607127,502.69695341659474L731.7590846008109,359.74571694303086" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 637.561 502.697 L 731.759 359.746");"/><path class="link" marker-end="url(#default)" d="M616.8932839556962,217.28367811360627L729.3915537684903,334.0839501533301" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 616.893 217.284 L 729.392 334.084");"/><path class="link" marker-end="url(#default)" d="M876.7378649765803,314.4196392453757L756.910504370885,342.23685733722306" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 876.738 314.42 L 756.911 342.237");"/><path class="link" marker-end="url(#default)" d="M607.6560214728046,494.90868224631066L729.8394970304206,358.2678144697506" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 607.656 494.909 L 729.839 358.268");"/><path class="link" marker-end="url(#default)" d="M863.0686090203529,192.26484090389528L751.1078360648113,333.0537411661423" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 863.069 192.265 L 751.108 333.054");"/><path class="link" marker-end="url(#default)" d="M855.9390854173638,503.33844153896655L750.5786790300623,359.28594924954655" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 855.939 503.338 L 750.579 359.286");"/><path class="link" marker-end="url(#default)" d="M546.6702673691783,281.92670539080933L725.168215782844,340.7997640039345" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 546.67 281.927 L 725.168 340.8");"/><path class="link" marker-end="url(#default)" d="M799.9385131522453,299.15503743586015L753.7719983190178,335.72305559856267" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 799.939 299.155 L 753.772 335.723");"/><path class="link" marker-end="url(#default)" d="M716.2478096839545,534.6136987048719L738.7051613561711,362.32960006517845" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 716.248 534.614 L 738.705 362.33");"/><path class="link" marker-end="url(#default)" d="M726.0336061961648,151.49352243229558L739.5854723315342,329.51561850784014" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 726.034 151.494 L 739.585 329.516");"/><path class="link" marker-end="url(#default)" d="M933.2126867745937,379.0997258853288L757.098511246983,348.76849658826114" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 933.213 379.1 L 757.099 348.768");"/><path class="link" marker-end="url(#default)" d="M554.7194111710263,426.5331316224501L725.6956788786565,352.52263251701663" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 554.719 426.533 L 725.696 352.523");"/><path class="link" marker-end="url(#default)" d="M817.3142865921532,265.775512107367L752.2252212622793,334.0273707592818" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 817.314 265.776 L 752.225 334.027");"/><path class="link" marker-end="url(#default)" d="M784.6722873292106,537.481806667243L744.5192871450176,362.0520905564851" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 784.672 537.482 L 744.519 362.052");"/><path class="link" marker-end="url(#default)" d="M585.3262847332461,218.87772961558863L728.0617131939721,335.52680424702953" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 585.326 218.878 L 728.062 335.527");"/><path class="link" marker-end="url(#default)" d="M921.4085641190868,272.9820456878837L756.1355354649249,339.7847730613398" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 921.409 272.982 L 756.136 339.785");"/><path class="link" marker-end="url(#default)" d="M677.3521921164136,451.0852063532129L732.3077206352112,360.09196652740656" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 677.352 451.085 L 732.308 360.092");"/><path class="link" marker-end="url(#default)" d="M794.4118477470804,156.2172362520737L745.3212217128013,330.0887891978043" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 794.412 156.217 L 745.321 330.089");"/><path class="link" marker-end="url(#default)" d="M902.6152066275354,444.64142281066046L754.9244306740827,354.5598616345319" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 902.615 444.641 L 754.924 354.56");"/><path class="link" marker-end="url(#default)" d="M536.8775771611803,356.43911724682295L724.3596065635495,346.8139947206574" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 536.878 356.439 L 724.36 346.814");"/><path class="link" marker-end="url(#default)" d="M899.7254493561412,340.36849888272604L757.3276680998024,345.3868843244541" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 899.725 340.368 L 757.328 345.387");"/><path class="link" marker-end="url(#default)" d="M701.0829329727036,492.7472178404881L736.52432005773,361.89418981757893" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 701.083 492.747 L 736.524 361.894");"/><path class="link" marker-end="url(#default)" d="M653.7252108389373,166.45189652708044L733.6343995995064,331.1235058080787" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 653.725 166.452 L 733.634 331.124");"/><path class="link" marker-end="url(#default)" d="M924.4448466586906,304.87614462440484L756.9395815677734,342.36440566600675" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 924.445 304.876 L 756.94 342.364");"/><path class="link" marker-end="url(#default)" d="M666.4631016071132,483.82340413223784L733.0034214051935,360.48941026472306" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 666.463 483.823 L 733.003 360.489");"/><path class="link" marker-end="url(#default)" d="M888.0222092976525,220.2375219101071L753.3836258653321,335.2509795300344" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 888.022 220.238 L 753.384 335.251");"/><path class="link" marker-end="url(#default)" d="M821.2656880259049,522.7881280255958L747.6695255820672,360.9873031864699" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 821.266 522.788 L 747.67 360.987");"/><path class="link" marker-end="url(#default)" d="M565.969107842046,248.14037667829814L726.4380857296751,337.91226098185325" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 565.969 248.14 L 726.438 337.912");"/><path class="link" marker-end="url(#default)" d="M857.0617997392701,258.15043265635865L754.0024993516234,336.0209842957952" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 857.062 258.15 L 754.003 336.021");"/><path class="link" marker-end="url(#default)" d="M731.2094871463279,481.995016565376L739.6728981274613,362.42683697405425" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 731.209 481.995 L 739.673 362.427");"/><path class="link" marker-end="url(#default)" d="M759.2421031276996,150.85437243916095L742.3873984283767,329.5409334424622" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 759.242 150.854 L 742.387 329.541");"/><path class="link" marker-end="url(#default)" d="M921.139916235731,414.44544276033156L756.2628945743297,351.826318566419" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 921.14 414.445 L 756.263 351.826");"/><path class="link" marker-end="url(#default)" d="M549.2397559829851,392.169122220146L724.797656846597,349.83588930696146" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 549.24 392.169 L 724.798 349.836");"/><path class="link" marker-end="url(#default)" d="M839.1042593245974,294.9455564520048L755.4816180182485,338.36461823779223" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 839.104 294.946 L 755.482 338.365");"/><path class="link" marker-end="url(#default)" d="M747.2064709518922,542.8179643293549L741.3714403210618,362.4593885689429" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path("M 747.206 542.818 L 741.371 362.459");"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 836.355, 458.914);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(836.3546472986317,458.9142745276615)"/><circle class="node" r="16.5" source="1" dest="108" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 740.838, 345.968);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:16.5px;" transform="translate(740.8379050647848,345.96801688159354)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 708.213, 241.371);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(708.2133815922178,241.37118803747543)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 790.043, 448.002);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(790.0425481267592,448.00166585956526)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 721.154, 277.729);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(721.1543711230685,277.7293832053597)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 752.563, 239.414);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(752.562675108501,239.41388426423694)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 657.307, 344.848);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(657.3068774371656,344.8478721699392)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 673.543, 272.108);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(673.54339211861,272.10792300044625)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 839.826, 499.176);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(839.8259625978553,499.1761906364176)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 684.481, 310.811);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(684.4809670200691,310.81111332236776)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 743.552, 203.628);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(743.5515169972964,203.62759318892446)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 828.788, 413.33);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(828.7879063221969,413.33009624605376)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 640.374, 303.728);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(640.3736093777813,303.7282496274763)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 849.3, 327.279);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(849.3001126514074,327.27870277729374)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 628.276, 386.623);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(628.2764235380885,386.6234767919944)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 697.417, 204.746);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(697.4173408969205,204.74552500053525)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 901.665, 489.9);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(901.6649209054941,489.89978119385125)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 591.347, 373.772);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(591.3465846745323,373.771560610794)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 827.768, 212.118);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(827.767927410941,212.1176402208996)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 791.365, 409.126);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(791.3652545146434,409.1264245404287)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 630.971, 266.337);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(630.9714054685545,266.33679556117414)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 861.806, 430.523);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(861.806286668695,430.523242130676)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 573.247, 407.4);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(573.2471107316363,407.3996379066601)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 727.173, 170.646);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(727.1727554585897,170.6461926531822)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 765.709, 482.068);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(765.7088958968952,482.067676919412)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 619.648, 342.4);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(619.6484517051299,342.40001194266085)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 844.34, 373.81);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(844.3397818989084,373.81017745654714)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 697.205, 375.117);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(697.2048885362833,375.1167894526717)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 666.007, 234.56);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(666.0067456841252,234.56024977383834)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 876.775, 468.407);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(876.7744607766234,468.40706877567635)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 608.167, 474.243);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(608.1669067199107,474.24304487809746)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 788.592, 207.194);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(788.5923050807672,207.19369960190983)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 741.477, 452.119);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(741.4770110666227,452.11876573542895)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 600.271, 302.606);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(600.2713425864904,302.60589054335645)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 881.04, 349.314);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(881.0403047736669,349.3135628024263)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 632.674, 452.138);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(632.6737157002716,452.13758957233404)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 685.841, 168.251);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(685.8409845337354,168.25130041875065)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 797.036, 518.764);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(797.0359649604652,518.7640274105216)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 576.332, 334.124);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(576.3323833347182,334.1240055074986)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 767.043, 281.629);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(767.0434723329114,281.62905361374095)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 748.946, 414.672);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(748.945973822077,414.6719520028453)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 634.142, 221.628);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(634.1422009254876,221.6278706818793)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 878.226, 389.594);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(878.2258029153858,389.594456733557)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 663.536, 428.369);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(663.5361805110967,428.3686369485256)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 812.169, 175.178);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(812.1690844111868,175.1781350745738)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 804.025, 482.543);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(804.0249919585455,482.5431701774745)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 556.391, 301.552);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(556.3911066663597,301.55177290348905)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 805.715, 365.401);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(805.7153800970239,365.4012184870461)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 609.211, 422.571);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(609.2107711270542,422.5705794335421)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 653.939, 190.058);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(653.938977692665,190.05818488652042)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 917.495, 378.903);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(917.4948907731062,378.90293439119637)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 575.257, 447.188);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(575.2570824869566,447.18807527513496)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 841.634, 157.946);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(841.6342305194023,157.94574891777552)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 648.706, 544.688);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(648.7062635156881,544.6882465619002)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 601.149, 246.085);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(601.1492038781848,246.08448574951709)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 915.386, 239.72);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(915.3860234901634,239.71951299880143)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 662.45, 390.504);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(662.4505137025499,390.50391803894144)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 770.293, 170.28);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(770.2925545310885,170.28013561465926)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 755.776, 524.968);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(755.7757881636716,524.9682096764137)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 526.877, 321.434);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(526.8767067131655,321.43395706731854)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 803.948, 321.625);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(803.9478255158714,321.62502403612217)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 705.05, 464.684);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(705.0503522568059,464.6838306626913)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 610.17, 169.338);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(610.1701808947042,169.33824832765225)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 953.374, 338.419);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(953.3740576240881,338.41932829107856)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 565.307, 480.386);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(565.3070560354237,480.3858558632255)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 861.951, 211.049);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(861.9506995694643,211.0489702537637)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 681.641, 547.904);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(681.6406026467424,547.9035153867922)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 575.376, 268.479);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(575.3758705431537,268.4790162901981)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 896.831, 276.16);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(896.8313425768749,276.1596321471386)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 705.946, 421.523);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(705.9462566456384,421.52281315477813)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 687.237, 133.637);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(687.2370062889704,133.63742505882257)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 898.63, 421.211);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(898.6300816185096,421.21125134992695)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 552.52, 365.062);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(552.5202972953502,365.0621198013492)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 791.077, 247.256);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(791.077308714627,247.25635900917726)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 627.657, 517.727);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(627.6571475818321,517.7271716654354)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 604.406, 204.319);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(604.4063552688295,204.3192416827734)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 894.272, 310.349);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(894.2716096741442,310.3492833787897)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 595.658, 508.327);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(595.6577581625892,508.3266432515729)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 874.272, 178.177);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(874.272170111291,178.17654012340302)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 866.565, 517.867);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(866.5653842885757,517.867095031279)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 529.576, 276.289);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(529.5760608797884,276.28861134245403)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 814.048, 287.979);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(814.0484330659541,287.9787160361901)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 713.921, 552.463);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(713.9211801836486,552.46269854151)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 724.667, 133.545);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(724.6673159417097,133.54545147911008)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 950.952, 382.155);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(950.9515298824464,382.1547946562389)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 538.201, 433.684);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(538.2006189679773,433.683621406548)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 829.737, 252.749);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(829.7368133530563,252.7493527012087)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 788.688, 555.028);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(788.6883405076464,555.0280688580337)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 571.389, 207.487);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(571.3886208741777,207.4873158324279)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 938.097, 266.237);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(938.0968881919671,266.2366887930615)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 668.046, 466.493);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(668.0465363750607,466.4931514213726)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 799.303, 138.894);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(799.3027386358257,138.8944424152127)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 917.982, 454.014);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(917.9823254740421,454.0143443593205)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 518.901, 357.362);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(518.9012515234691,357.3620021621653)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 917.714, 339.735);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(917.7142817579786,339.7345360931194)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 696.377, 510.121);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(696.3772038740984,510.12122467974484)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 645.867, 150.258);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(645.8668412404518,150.25788444688243)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 942.01, 300.945);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(942.0103119346783,300.9449323892193)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 657.916, 499.665);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(657.9163921602865,499.664924186561)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 901.708, 208.546);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(901.7084501709768,208.54620843567892)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 828.718, 539.173);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(828.7183649538492,539.1728039945518)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 550.26, 239.352);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(550.2602140219263,239.3522793331269)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 871.423, 247.299);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(871.4231753249123,247.29912438094226)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 729.939, 499.95);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(729.9385704874295,499.9500930298786)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 760.932, 132.934);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(760.9324595243454,132.93391777829038)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 937.967, 420.836);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(937.9671775188709,420.8363173255957)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 531.741, 396.389);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(531.7413033813257,396.38861941145643)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 855.079, 286.651);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(855.0792189101941,286.65093974967607)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 747.789, 560.809);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(747.7885094132854,560.8085516246451)"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"/><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><text visibility="visible" transform="translate(836.3546472986317,458.9142745276615)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 836.355, 458.914);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">paths.hpp</text><text visibility="visible" transform="translate(740.8379050647848,345.96801688159354)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 740.838, 345.968);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">errors.hpp</text><text visibility="visible" transform="translate(708.2133815922178,241.37118803747543)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 708.213, 241.371);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">random.hpp</text><text visibility="visible" transform="translate(790.0425481267592,448.00166585956526)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 790.043, 448.002);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">stl_utils.hpp</text><text visibility="visible" transform="translate(721.1543711230685,277.7293832053597)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 721.154, 277.729);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">threading.hpp</text><text visibility="visible" transform="translate(752.562675108501,239.41388426423694)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 752.563, 239.414);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">thread_local.hpp</text><text visibility="visible" transform="translate(657.3068774371656,344.8478721699392)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 657.307, 344.848);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">utils.hpp</text><text visibility="visible" transform="translate(673.54339211861,272.10792300044625)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 673.543, 272.108);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">errors.cc</text><text visibility="visible" transform="translate(839.8259625978553,499.1761906364176)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 839.826, 499.176);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">math.cc</text><text visibility="visible" transform="translate(684.4809670200691,310.81111332236776)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 684.481, 310.811);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">memory_utils.cc</text><text visibility="visible" transform="translate(743.5515169972964,203.62759318892446)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 743.552, 203.628);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rethinkdb_backtrace.cc</text><text visibility="visible" transform="translate(828.7879063221969,413.33009624605376)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 828.788, 413.33);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">threading.cc</text><text visibility="visible" transform="translate(640.3736093777813,303.7282496274763)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 640.374, 303.728);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">time.cc</text><text visibility="visible" transform="translate(849.3001126514074,327.27870277729374)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 849.3, 327.279);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">utils.cc</text><text visibility="visible" transform="translate(628.2764235380885,386.6234767919944)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 628.276, 386.623);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">address.hpp</text><text visibility="visible" transform="translate(697.4173408969205,204.74552500053525)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 697.417, 204.746);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">barrier.hpp</text><text visibility="visible" transform="translate(901.6649209054941,489.89978119385125)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 901.665, 489.9);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">fd_send_recv.hpp</text><text visibility="visible" transform="translate(591.3465846745323,373.771560610794)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 591.347, 373.772);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filesystem.hpp</text><text visibility="visible" transform="translate(827.767927410941,212.1176402208996)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 827.768, 212.118);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">spinlock.hpp</text><text visibility="visible" transform="translate(791.3652545146434,409.1264245404287)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 791.365, 409.126);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">types.hpp</text><text visibility="visible" transform="translate(630.9714054685545,266.33679556117414)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 630.971, 266.337);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">concurrency.hpp</text><text visibility="visible" transform="translate(861.806286668695,430.523242130676)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 861.806, 430.523);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">event_watcher.hpp</text><text visibility="visible" transform="translate(573.2471107316363,407.3996379066601)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 573.247, 407.4);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">network.cc</text><text visibility="visible" transform="translate(727.1727554585897,170.6461926531822)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 727.173, 170.646);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filestat.cc</text><text visibility="visible" transform="translate(765.7088958968952,482.067676919412)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 765.709, 482.068);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">callable_action.hpp</text><text visibility="visible" transform="translate(619.6484517051299,342.40001194266085)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 619.648, 342.4);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">context_switching.hpp</text><text visibility="visible" transform="translate(844.3397818989084,373.81017745654714)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 844.34, 373.81);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">context_switching.cc</text><text visibility="visible" transform="translate(697.2048885362833,375.1167894526717)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 697.205, 375.117);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">thread_pool.cc</text><text visibility="visible" transform="translate(666.0067456841252,234.56024977383834)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 666.007, 234.56);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">poll.hpp</text><text visibility="visible" transform="translate(876.7744607766234,468.40706877567635)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 876.775, 468.407);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">kqueue.cc</text><text visibility="visible" transform="translate(608.1669067199107,474.24304487809746)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 608.167, 474.243);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">eventfd_event.hpp</text><text visibility="visible" transform="translate(788.5923050807672,207.19369960190983)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 788.592, 207.194);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pipe_event.hpp</text><text visibility="visible" transform="translate(741.4770110666227,452.11876573542895)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 741.477, 452.119);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">eventfd_event.cc</text><text visibility="visible" transform="translate(600.2713425864904,302.60589054335645)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 600.271, 302.606);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">unistd.h</text><text visibility="visible" transform="translate(881.0403047736669,349.3135628024263)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 881.04, 349.314);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pthread.cc</text><text visibility="visible" transform="translate(632.6737157002716,452.13758957233404)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 632.674, 452.138);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">traversal_progress.hpp</text><text visibility="visible" transform="translate(685.8409845337354,168.25130041875065)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 685.841, 168.251);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">blob.hpp</text><text visibility="visible" transform="translate(797.0359649604652,518.7640274105216)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 797.036, 518.764);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">cache_balancer.hpp</text><text visibility="visible" transform="translate(576.3323833347182,334.1240055074986)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 576.332, 334.124);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">cJSON.cc</text><text visibility="visible" transform="translate(767.0434723329114,281.62905361374095)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 767.043, 281.629);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">user_context.hpp</text><text visibility="visible" transform="translate(748.945973822077,414.6719520028453)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 748.946, 414.672);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">password.cc</text><text visibility="visible" transform="translate(634.1422009254876,221.6278706818793)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 634.142, 221.628);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">permissions.cc</text><text visibility="visible" transform="translate(878.2258029153858,389.594456733557)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 878.226, 389.594);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">permissions_artificial_table_backend.cc</text><text visibility="visible" transform="translate(663.5361805110967,428.3686369485256)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 663.536, 428.369);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">user.cc</text><text visibility="visible" transform="translate(812.1690844111868,175.1781350745738)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 812.169, 175.178);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http.hpp</text><text visibility="visible" transform="translate(804.0249919585455,482.5431701774745)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 804.025, 482.543);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http.cc</text><text visibility="visible" transform="translate(556.3911066663597,301.55177290348905)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 556.391, 301.552);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http_parser.cc</text><text visibility="visible" transform="translate(805.7153800970239,365.4012184870461)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 805.715, 365.401);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">windows_service.hpp</text><text visibility="visible" transform="translate(609.2107711270542,422.5705794335421)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 609.211, 422.571);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">command_line.cc</text><text visibility="visible" transform="translate(653.938977692665,190.05818488652042)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 653.939, 190.058);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">options.cc</text><text visibility="visible" transform="translate(917.4948907731062,378.90293439119637)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 917.495, 378.903);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">path.cc</text><text visibility="visible" transform="translate(575.2570824869566,447.18807527513496)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 575.257, 447.188);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">raft_core.hpp</text><text visibility="visible" transform="translate(841.6342305194023,157.94574891777552)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 841.634, 157.946);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">metadata.hpp</text><text visibility="visible" transform="translate(648.7062635156881,544.6882465619002)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 648.706, 544.688);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">cond_var.hpp</text><text visibility="visible" transform="translate(601.1492038781848,246.08448574951709)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 601.149, 246.085);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">interruptor.hpp</text><text visibility="visible" transform="translate(915.3860234901634,239.71951299880143)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 915.386, 239.72);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">mutex.hpp</text><text visibility="visible" transform="translate(662.4505137025499,390.50391803894144)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 662.45, 390.504);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">signal.hpp</text><text visibility="visible" transform="translate(770.2925545310885,170.28013561465926)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 770.293, 170.28);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">passive_producer.hpp</text><text visibility="visible" transform="translate(755.7757881636716,524.9682096764137)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 755.776, 524.968);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">buffer_group.hpp</text><text visibility="visible" transform="translate(526.8767067131655,321.43395706731854)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 526.877, 321.434);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">counted.hpp</text><text visibility="visible" transform="translate(803.9478255158714,321.62502403612217)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 803.948, 321.625);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">half_intrusive_list.hpp</text><text visibility="visible" transform="translate(705.0503522568059,464.6838306626913)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 705.05, 464.684);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">intrusive_list.hpp</text><text visibility="visible" transform="translate(610.1701808947042,169.33824832765225)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 610.17, 169.338);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">intrusive_priority_queue.hpp</text><text visibility="visible" transform="translate(953.3740576240881,338.41932829107856)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 953.374, 338.419);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">lru_cache.hpp</text><text visibility="visible" transform="translate(565.3070560354237,480.3858558632255)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 565.307, 480.386);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">object_buffer.hpp</text><text visibility="visible" transform="translate(861.9506995694643,211.0489702537637)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 861.951, 211.049);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">optional.hpp</text><text visibility="visible" transform="translate(681.6406026467424,547.9035153867922)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 681.641, 547.904);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">printf_buffer.hpp</text><text visibility="visible" transform="translate(575.3758705431537,268.4790162901981)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 575.376, 268.479);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">scoped.hpp</text><text visibility="visible" transform="translate(896.8313425768749,276.1596321471386)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 896.831, 276.16);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">segmented_vector.hpp</text><text visibility="visible" transform="translate(705.9462566456384,421.52281315477813)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 705.946, 421.523);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">shared_buffer.hpp</text><text visibility="visible" transform="translate(687.2370062889704,133.63742505882257)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 687.237, 133.637);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">two_level_array.hpp</text><text visibility="visible" transform="translate(898.6300816185096,421.21125134992695)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 898.63, 421.211);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">uuid.hpp</text><text visibility="visible" transform="translate(552.5202972953502,365.0621198013492)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 552.52, 365.062);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">boost_types.hpp</text><text visibility="visible" transform="translate(791.077308714627,247.25635900917726)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 791.077, 247.256);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">socket_stream.hpp</text><text visibility="visible" transform="translate(627.6571475818321,517.7271716654354)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 627.657, 517.727);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">socket_stream.cc</text><text visibility="visible" transform="translate(604.4063552688295,204.3192416827734)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 604.406, 204.319);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http_job.hpp</text><text visibility="visible" transform="translate(894.2716096741442,310.3492833787897)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 894.272, 310.349);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http_runner.hpp</text><text visibility="visible" transform="translate(595.6577581625892,508.3266432515729)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 595.658, 508.327);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">js_runner.hpp</text><text visibility="visible" transform="translate(874.272170111291,178.17654012340302)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 874.272, 178.177);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">utf8.hpp</text><text visibility="visible" transform="translate(866.5653842885757,517.867095031279)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 866.565, 517.867);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filter.hpp</text><text visibility="visible" transform="translate(529.5760608797884,276.28861134245403)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 529.576, 276.289);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filter.cc</text><text visibility="visible" transform="translate(814.0484330659541,287.9787160361901)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 814.048, 287.979);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pprint.hpp</text><text visibility="visible" transform="translate(713.9211801836486,552.46269854151)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 713.921, 552.463);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rapidjson.h</text><text visibility="visible" transform="translate(724.6673159417097,133.54545147911008)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 724.667, 133.545);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">changefeed.hpp</text><text visibility="visible" transform="translate(950.9515298824464,382.1547946562389)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 950.952, 382.155);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">datumspec.hpp</text><text visibility="visible" transform="translate(538.2006189679773,433.683621406548)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 538.201, 433.684);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">erase_range.hpp</text><text visibility="visible" transform="translate(829.7368133530563,252.7493527012087)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 829.737, 252.749);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">error.hpp</text><text visibility="visible" transform="translate(788.6883405076464,555.0280688580337)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 788.688, 555.028);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">func.hpp</text><text visibility="visible" transform="translate(571.3886208741777,207.4873158324279)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 571.389, 207.487);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">order_util.hpp</text><text visibility="visible" transform="translate(938.0968881919671,266.2366887930615)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 938.097, 266.237);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">profile.hpp</text><text visibility="visible" transform="translate(668.0465363750607,466.4931514213726)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 668.046, 466.493);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">protocol.hpp</text><text visibility="visible" transform="translate(799.3027386358257,138.8944424152127)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 799.303, 138.894);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">term_storage.hpp</text><text visibility="visible" transform="translate(917.9823254740421,454.0143443593205)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 917.982, 454.014);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">datum.cc</text><text visibility="visible" transform="translate(518.9012515234691,357.3620021621653)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 518.901, 357.362);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">profile.cc</text><text visibility="visible" transform="translate(917.7142817579786,339.7345360931194)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 917.714, 339.735);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pseudo_binary.cc</text><text visibility="visible" transform="translate(696.3772038740984,510.12122467974484)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 696.377, 510.121);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pseudo_time.cc</text><text visibility="visible" transform="translate(645.8668412404518,150.25788444688243)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 645.867, 150.258);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">shards.cc</text><text visibility="visible" transform="translate(942.0103119346783,300.9449323892193)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 942.01, 300.945);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">logging.h</text><text visibility="visible" transform="translate(657.9163921602865,499.664924186561)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 657.916, 499.665);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">strutil.cc</text><text visibility="visible" transform="translate(901.7084501709768,208.54620843567892)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 901.708, 208.546);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">exactfloat.cc</text><text visibility="visible" transform="translate(828.7183649538492,539.1728039945518)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 828.718, 539.173);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">serialize_macros.hpp</text><text visibility="visible" transform="translate(550.2602140219263,239.3522793331269)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 550.26, 239.352);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">buf_ptr.hpp</text><text visibility="visible" transform="translate(871.4231753249123,247.29912438094226)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 871.423, 247.299);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">merger.cc</text><text visibility="visible" transform="translate(729.9385704874295,499.9500930298786)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 729.939, 499.95);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">data_block_manager.cc</text><text visibility="visible" transform="translate(760.9324595243454,132.93391777829038)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 760.932, 132.934);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">metablock_manager.cc</text><text visibility="visible" transform="translate(937.9671775188709,420.8363173255957)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 937.967, 420.836);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">mock_file.hpp</text><text visibility="visible" transform="translate(531.7413033813257,396.38861941145643)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 531.741, 396.389);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rdb_env.hpp</text><text visibility="visible" transform="translate(855.0792189101941,286.65093974967607)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 855.079, 286.651);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">fifo_enforcer.cc</text><text visibility="visible" transform="translate(747.7885094132854,560.8085516246451)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 747.789, 560.809);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">options_test.cc</text></g></g></svg>
|
data/exe/cpp_dependency_graph
CHANGED
@@ -37,8 +37,11 @@ doc = <<DOCOPT
|
|
37
37
|
Cpp Dependency Graph
|
38
38
|
|
39
39
|
Usage:
|
40
|
-
cpp_dependency_graph
|
41
|
-
cpp_dependency_graph
|
40
|
+
cpp_dependency_graph visualise_component --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
|
41
|
+
cpp_dependency_graph visualise_project --root_dir <argument> [--output_file <file>] [--output_format <format>]
|
42
|
+
cpp_dependency_graph visualise_component_includes --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
|
43
|
+
cpp_dependency_graph visualise_header_includes --root_dir <argument> --header <header> [--output_file <file>] [--output_format <format>]
|
44
|
+
cpp_dependency_graph visualise_project_includes --root_dir <argument> [--output_file <file>] [--output_format <format>]
|
42
45
|
cpp_dependency_graph visualise_components --root_dir <argument> [--output_file <file>] [--output_format <format>]
|
43
46
|
cpp_dependency_graph visualise_cyclic_deps --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
|
44
47
|
cpp_dependency_graph -h | --help | -v | --version
|
@@ -47,9 +50,10 @@ doc = <<DOCOPT
|
|
47
50
|
-h --help show this help message and exit
|
48
51
|
-v --version show version and exit
|
49
52
|
-r --root_dir dir top level root directory of C/C++ project
|
50
|
-
-c --component component component generate visualisation for (case sensitive!)
|
51
53
|
-o --output_file file name of output file to be generated [default: deps.html]
|
52
54
|
-f --output_format format format of output file (dot, html, graphml, json) [default: html]
|
55
|
+
--component component component generate visualisation for (case sensitive!)
|
56
|
+
--header file header file to generate visualisation for (case sensitive!)
|
53
57
|
DOCOPT
|
54
58
|
|
55
59
|
begin
|
@@ -67,18 +71,16 @@ begin
|
|
67
71
|
Kernel.exit(1)
|
68
72
|
end
|
69
73
|
|
70
|
-
if args['
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
elsif args['
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
generate_project_include_graph(project_dir, args['--output_format'], args['--output_file'])
|
81
|
-
end
|
74
|
+
if args['visualise_component']
|
75
|
+
generate_component_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
|
76
|
+
elsif args['visualise_project']
|
77
|
+
generate_project_graph(project_dir, args['--output_format'], args['--output_file'])
|
78
|
+
elsif args['visualise_component_includes']
|
79
|
+
generate_component_include_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
|
80
|
+
elsif args['visualise_header_includes']
|
81
|
+
generate_file_include_graph(project_dir, args['--header'], args['--output_format'], args['--output_file'])
|
82
|
+
elsif args['visualise_project_includes']
|
83
|
+
generate_project_include_graph(project_dir, args['--output_format'], args['--output_file'])
|
82
84
|
elsif args['visualise_components']
|
83
85
|
generate_enclosure_diagram(project_dir, args['--output_file'])
|
84
86
|
elsif args['visualise_cyclic_deps']
|
data/lib/cpp_dependency_graph.rb
CHANGED
@@ -5,7 +5,8 @@ require_relative 'cpp_dependency_graph/component_dependency_graph'
|
|
5
5
|
require_relative 'cpp_dependency_graph/dir_tree'
|
6
6
|
require_relative 'cpp_dependency_graph/graph_to_dot_visualiser'
|
7
7
|
require_relative 'cpp_dependency_graph/graph_to_html_visualiser'
|
8
|
-
require_relative 'cpp_dependency_graph/
|
8
|
+
require_relative 'cpp_dependency_graph/include_component_dependency_graph'
|
9
|
+
require_relative 'cpp_dependency_graph/include_file_dependency_graph'
|
9
10
|
require_relative 'cpp_dependency_graph/project'
|
10
11
|
require_relative 'cpp_dependency_graph/version'
|
11
12
|
|
@@ -25,16 +26,23 @@ module CppDependencyGraph
|
|
25
26
|
generate_visualisation(deps, format, output_file)
|
26
27
|
end
|
27
28
|
|
29
|
+
def generate_file_include_graph(project_dir, file_name, format, output_file)
|
30
|
+
project = Project.new(project_dir)
|
31
|
+
graph = IncludeFileDependencyGraph.new(project)
|
32
|
+
deps = graph.links(file_name)
|
33
|
+
generate_visualisation(deps, format, output_file)
|
34
|
+
end
|
35
|
+
|
28
36
|
def generate_component_include_graph(project_dir, component_name, format, output_file)
|
29
37
|
project = Project.new(project_dir)
|
30
|
-
graph =
|
38
|
+
graph = IncludeComponentDependencyGraph.new(project)
|
31
39
|
deps = graph.links(component_name)
|
32
40
|
generate_visualisation(deps, format, output_file)
|
33
41
|
end
|
34
42
|
|
35
43
|
def generate_project_include_graph(project_dir, format, output_file)
|
36
44
|
project = Project.new(project_dir)
|
37
|
-
graph =
|
45
|
+
graph = IncludeComponentDependencyGraph.new(project)
|
38
46
|
deps = graph.all_links
|
39
47
|
generate_visualisation(deps, format, output_file)
|
40
48
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'graphviz'
|
3
|
+
require 'ruby-graphviz'
|
4
4
|
|
5
|
-
# Outputs a `dot`
|
5
|
+
# Outputs a `dot` language representation of a dependency graph
|
6
6
|
class GraphToDotVisualiser
|
7
7
|
def generate(deps, file)
|
8
|
-
@g =
|
8
|
+
@g = GraphViz.new('dependency_graph')
|
9
9
|
nodes = create_nodes(deps)
|
10
10
|
connect_nodes(deps, nodes)
|
11
|
-
|
11
|
+
@g.output(:dot => file)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
@@ -22,16 +22,18 @@ class GraphToDotVisualiser
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def create_node(name)
|
25
|
-
node = @g.add_node(name)
|
26
|
-
node.attributes[:shape] = 'box3d'
|
25
|
+
node = @g.add_node(name, :shape => 'box3d')
|
27
26
|
node
|
28
27
|
end
|
29
28
|
|
30
29
|
def connect_nodes(deps, nodes)
|
31
30
|
deps.each do |source, links|
|
32
31
|
links.each do |link|
|
33
|
-
|
34
|
-
|
32
|
+
if link.cyclic?
|
33
|
+
@g.add_edges(source, link.target, :color => 'red')
|
34
|
+
else
|
35
|
+
@g.add_edges(source, link.target)
|
36
|
+
end
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
data/lib/cpp_dependency_graph/{include_dependency_graph.rb → include_component_dependency_graph.rb}
RENAMED
@@ -5,7 +5,7 @@ require_relative 'link'
|
|
5
5
|
require_relative 'cycle_detector'
|
6
6
|
|
7
7
|
# Returns a hash of intra-component include links
|
8
|
-
class
|
8
|
+
class IncludeComponentDependencyGraph
|
9
9
|
def initialize(project)
|
10
10
|
@project = project
|
11
11
|
end
|
@@ -14,9 +14,8 @@ class IncludeDependencyGraph
|
|
14
14
|
components = @project.source_components
|
15
15
|
all_source_files = components.values.flat_map(&:source_files)
|
16
16
|
all_source_files.map do |file|
|
17
|
-
|
18
|
-
|
19
|
-
[source, links]
|
17
|
+
links = file.includes.map { |inc| Link.new(file.basename, inc, false) }
|
18
|
+
[file.basename, links]
|
20
19
|
end.to_h
|
21
20
|
end
|
22
21
|
|
@@ -30,10 +29,9 @@ class IncludeDependencyGraph
|
|
30
29
|
external_includes = @project.external_includes(component)
|
31
30
|
source_files.map do |file|
|
32
31
|
# TODO: Very inefficient
|
33
|
-
source = file.basename
|
34
32
|
internal_includes = file.includes.reject { |inc| external_includes.any?(inc) }
|
35
|
-
links = internal_includes.map { |inc| Link.new(
|
36
|
-
[
|
33
|
+
links = internal_includes.map { |inc| Link.new(file.basename, inc, false) }
|
34
|
+
[file.basename, links]
|
37
35
|
end.to_h
|
38
36
|
end
|
39
37
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'project'
|
4
|
+
require_relative 'link'
|
5
|
+
require_relative 'cycle_detector'
|
6
|
+
|
7
|
+
# Returns a hash of individual file include links
|
8
|
+
class IncludeFileDependencyGraph
|
9
|
+
def initialize(project)
|
10
|
+
@project = project
|
11
|
+
end
|
12
|
+
|
13
|
+
def all_links
|
14
|
+
# TODO: Implement
|
15
|
+
{}
|
16
|
+
end
|
17
|
+
|
18
|
+
def all_cyclic_links
|
19
|
+
# TODO: Implement
|
20
|
+
end
|
21
|
+
|
22
|
+
def links(file_name)
|
23
|
+
components = @project.source_components
|
24
|
+
all_source_files = components.values.flat_map(&:source_files)
|
25
|
+
files = all_source_files.select do |file|
|
26
|
+
file.includes.include?(file_name)
|
27
|
+
end
|
28
|
+
files.map do |file|
|
29
|
+
links = [Link.new(file.basename, file_name, false)]
|
30
|
+
[file.basename, links]
|
31
|
+
end.to_h
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cpp_dependency_graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shreyas Balakrishna
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -25,61 +25,47 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: graphviz
|
28
|
+
name: ruby-graphviz
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: json
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 2.3.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: parallel
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.12'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.12'
|
54
|
+
version: 2.3.0
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: bundler
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
59
|
- - "~>"
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: '1
|
61
|
+
version: '2.1'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1
|
68
|
+
version: '2.1'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: debase
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,84 +86,84 @@ dependencies:
|
|
100
86
|
requirements:
|
101
87
|
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
89
|
+
version: '13.0'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
96
|
+
version: '13.0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: rspec
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
101
|
- - "~>"
|
116
102
|
- !ruby/object:Gem::Version
|
117
|
-
version: '3.
|
103
|
+
version: '3.9'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
108
|
- - "~>"
|
123
109
|
- !ruby/object:Gem::Version
|
124
|
-
version: '3.
|
110
|
+
version: '3.9'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: rubocop
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
115
|
- - "~>"
|
130
116
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0.
|
117
|
+
version: '0.81'
|
132
118
|
type: :development
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
122
|
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0.
|
124
|
+
version: '0.81'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
126
|
name: ruby-debug-ide
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
129
|
- - "~>"
|
144
130
|
- !ruby/object:Gem::Version
|
145
|
-
version: '0.
|
131
|
+
version: '0.7'
|
146
132
|
type: :development
|
147
133
|
prerelease: false
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
149
135
|
requirements:
|
150
136
|
- - "~>"
|
151
137
|
- !ruby/object:Gem::Version
|
152
|
-
version: '0.
|
138
|
+
version: '0.7'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: ruby-prof
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
143
|
- - "~>"
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version: '0.
|
145
|
+
version: '0.18'
|
160
146
|
type: :development
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
150
|
- - "~>"
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version: '0.
|
152
|
+
version: '0.18'
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
154
|
name: simplecov
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
170
156
|
requirements:
|
171
157
|
- - "~>"
|
172
158
|
- !ruby/object:Gem::Version
|
173
|
-
version: '0.
|
159
|
+
version: '0.18'
|
174
160
|
type: :development
|
175
161
|
prerelease: false
|
176
162
|
version_requirements: !ruby/object:Gem::Requirement
|
177
163
|
requirements:
|
178
164
|
- - "~>"
|
179
165
|
- !ruby/object:Gem::Version
|
180
|
-
version: '0.
|
166
|
+
version: '0.18'
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
168
|
name: simplecov-console
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -224,6 +210,7 @@ files:
|
|
224
210
|
- docs/examples/leveldb_overall_d3.png
|
225
211
|
- docs/examples/leveldb_overall_d3.svg
|
226
212
|
- docs/examples/rethinkdb_cyclic_deps.svg
|
213
|
+
- docs/examples/rethinkdb_errors_header_include.svg
|
227
214
|
- docs/examples/rethinkdb_queue_component.png
|
228
215
|
- docs/examples/rethinkdb_queue_component.svg
|
229
216
|
- docs/examples/rethinkdb_queue_component_d3.png
|
@@ -248,7 +235,8 @@ files:
|
|
248
235
|
- lib/cpp_dependency_graph/graph_to_dot_visualiser.rb
|
249
236
|
- lib/cpp_dependency_graph/graph_to_graphml_visualiser.rb
|
250
237
|
- lib/cpp_dependency_graph/graph_to_html_visualiser.rb
|
251
|
-
- lib/cpp_dependency_graph/
|
238
|
+
- lib/cpp_dependency_graph/include_component_dependency_graph.rb
|
239
|
+
- lib/cpp_dependency_graph/include_file_dependency_graph.rb
|
252
240
|
- lib/cpp_dependency_graph/include_to_component_resolver.rb
|
253
241
|
- lib/cpp_dependency_graph/link.rb
|
254
242
|
- lib/cpp_dependency_graph/project.rb
|
@@ -270,15 +258,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
270
258
|
requirements:
|
271
259
|
- - ">="
|
272
260
|
- !ruby/object:Gem::Version
|
273
|
-
version: 2.
|
261
|
+
version: 2.7.0
|
274
262
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
275
263
|
requirements:
|
276
264
|
- - ">="
|
277
265
|
- !ruby/object:Gem::Version
|
278
266
|
version: '0'
|
279
267
|
requirements: []
|
280
|
-
|
281
|
-
rubygems_version: 2.7.6
|
268
|
+
rubygems_version: 3.1.2
|
282
269
|
signing_key:
|
283
270
|
specification_version: 4
|
284
271
|
summary: CppDependencyGraph is a program that generates dependency visualisations
|