coverband 5.1.0.rcmailer.1 → 5.2.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/diagram.yml +16 -0
- data/.github/workflows/main.yml +5 -5
- data/Gemfile +2 -5
- data/README.md +33 -1
- data/changes.md +19 -66
- data/coverband.gemspec +16 -4
- data/diagram.svg +1 -0
- data/lib/coverband/adapters/base.rb +8 -7
- data/lib/coverband/adapters/file_store.rb +1 -1
- data/lib/coverband/adapters/hash_redis_store.rb +1 -1
- data/lib/coverband/adapters/null_store.rb +42 -0
- data/lib/coverband/adapters/redis_store.rb +1 -1
- data/lib/coverband/at_exit.rb +3 -0
- data/lib/coverband/collectors/coverage.rb +19 -1
- data/lib/coverband/collectors/view_tracker.rb +27 -20
- data/lib/coverband/collectors/view_tracker_service.rb +3 -3
- data/lib/coverband/configuration.rb +9 -2
- data/lib/coverband/integrations/background.rb +6 -3
- data/lib/coverband/reporters/base.rb +1 -1
- data/lib/coverband/reporters/web.rb +4 -4
- data/lib/coverband/utils/dead_methods.rb +63 -0
- data/lib/coverband/utils/method_definition_scanner.rb +96 -0
- data/lib/coverband/utils/railtie.rb +3 -2
- data/lib/coverband/utils/result.rb +1 -1
- data/lib/coverband/utils/source_file.rb +2 -2
- data/lib/coverband/utils/tasks.rb +17 -3
- data/lib/coverband/version.rb +2 -2
- data/lib/coverband.rb +1 -0
- data/public/dependencies.js +4 -4
- data/roadmap.md +56 -0
- data/test/coverband/adapters/null_store_test.rb +39 -0
- data/test/coverband/configuration_test.rb +5 -5
- data/test/coverband/utils/dead_methods_test.rb +53 -0
- data/test/coverband/utils/method_definition_scanner_test.rb +85 -0
- data/test/fixtures/casting_invitor.rb +60 -0
- data/test/forked/rails_full_stack_test.rb +1 -1
- data/test/integration/full_stack_deferred_eager_test.rb +51 -0
- data/test/test_helper.rb +1 -0
- data/test/unique_files.rb +3 -3
- data/views/file_list.erb +2 -2
- metadata +25 -4
data/diagram.svg
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
<svg width="1000" height="1000" style="background:white;font-family:sans-serif;overflow:visible" xmlns="http://www.w3.org/2000/svg"><defs><filter id="glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="4" result="coloredBlur"></feGaussianBlur><feMerge><feMergeNode in="coloredBlur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter></defs><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(319.99422221520257, 687.2164700211342)"><circle r="41.02921418068235" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(661.4377379675747, 565.1941312103406)"><circle r="305.5618666214336" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#89e051;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(288.8905634421281, 583.3369571703405)"><circle r="51.43203365598711" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(198.2622918656833, 337.650139496829)"><circle r="194.43813337856645" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(208.84229622707048, 675.5867014055564)"><circle r="54.712402162993705" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(467.6116292400953, 199.49715021934765)"><circle r="92.27512036255078" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(310.03350878582086, 685.7453349516641)"><circle style="transition:all 0.5s ease-out" r="13.30180606880021" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(345.959434313262, 685.9068702798954)"><circle style="transition:all 0.5s ease-out" r="12.030997111439614" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(328.8897152183017, 706.7783546079727)"><circle style="transition:all 0.5s ease-out" r="11.746091118173574" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(328.97908581034545, 668.1974072999602)"><circle style="transition:all 0.5s ease-out" r="9.31783640763901" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(309.00647670688085, 660.3234640997664)"><circle style="transition:all 0.5s ease-out" r="8.978150192553253" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(305.70723567837626, 710.3828616614179)"><circle style="transition:all 0.5s ease-out" r="8.51267696816497" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(345.64899473131675, 666.4312437404108)"><circle style="transition:all 0.5s ease-out" r="4.245373231470868" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(344.7614849724372, 702.5671111663205)"><circle style="transition:all 0.5s ease-out" r="1.4748603506155034" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(703.8101203273987, 527.1527369126792)"><circle style="transition:all 0.5s ease-out" r="16.536485579985868" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(778.8592125527111, 570.0827446562124)"><circle r="61.702355060114236" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(717.5459367246649, 693.1394072463729)"><circle r="61.862375247277605" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(725.4752043456411, 443.3464320959712)"><circle r="61.702355060114215" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(815.9230212367876, 665.2141060036499)"><circle r="26.458426135215838" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(830.9853756043558, 473.38933293249397)"><circle r="34.078018549283044" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(896.5990215299141, 619.8107385171486)"><circle r="52.169847346054155" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(853.6296143526785, 527.4139968947751)"><circle style="transition:all 0.5s ease-out" r="15.96473679592113" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(526.6706855709276, 561.9800413946193)"><circle r="155.78797315176226" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(917.8131106864573, 514.6120585177536)"><circle r="41.24428624341126" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(856.6122524498119, 560.7951755125868)"><circle style="transition:all 0.5s ease-out" r="8.027979530205487" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(871.1970555375348, 548.2846838240425)"><circle style="transition:all 0.5s ease-out" r="8.008602288503555" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(851.9429346996435, 574.2987540814191)"><circle style="transition:all 0.5s ease-out" r="3.073538603630714" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(718.5679782589528, 611.3698533832043)"><circle style="transition:all 0.5s ease-out" r="2.798350763171706" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(792.2638950596225, 498.56989406564423)"><circle style="transition:all 0.5s ease-out" r="2.391171864237444" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(728.3549015220763, 518.0377980239389)"><circle style="transition:all 0.5s ease-out" r="2.1733199888659107" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000080;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(271.08448903099156, 583.3369571703405)"><circle r="29.927708660521365" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#000080;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(320.6673973948141, 583.3369571703405)"><circle style="transition:all 0.5s ease-out" r="15.956949118971922" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#89e051;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(304.5764790203213, 600.9996183033574)"><circle style="transition:all 0.5s ease-out" r="4.238047301540488" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(24.105806761514003, 337.650139496829)"><circle style="transition:all 0.5s ease-out" r="16.58339769006793" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(216.69481484791584, 337.650139496829)"><circle r="172.30735981200468" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(39.162976295998305, 354.5129730018694)"><circle style="transition:all 0.5s ease-out" r="2.3252866839051953" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(181.62212425820078, 668.7863787424532)"><circle style="transition:all 0.5s ease-out" r="23.65563559346268" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(235.26760587143946, 666.1470864897661)"><circle style="transition:all 0.5s ease-out" r="23.651694410707957" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(210.5705714922894, 709.4694568808314)"><circle r="17.7855978043505" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(217.6116626371666, 634.3547232001796)"><circle style="transition:all 0.5s ease-out" r="9.558187498701981" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(196.05568390646692, 636.9792930631887)"><circle style="transition:all 0.5s ease-out" r="8.051170660454732" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(207.8399724900223, 655.6862952725725)"><circle style="transition:all 0.5s ease-out" r="2.5907693827582245" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(183.99483991335063, 698.1094000508928)"><circle style="transition:all 0.5s ease-out" r="2.5787471861822056" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(235.88363383674653, 695.5452960269216)"><circle style="transition:all 0.5s ease-out" r="2.5666686786275803" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(211.908778416179, 648.3920329970198)"><circle style="transition:all 0.5s ease-out" r="2.554533061334901" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(203.60667185089102, 648.4904756803166)"><circle style="transition:all 0.5s ease-out" r="2.5300872065332993" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(209.03249951101728, 679.2091076479431)"><circle style="transition:all 0.5s ease-out" r="2.517775273583543" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#f1e05a;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(414.80683990819495, 225.22631291636873)"><circle style="transition:all 0.5s ease-out" r="30.53556308233156" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#563d7c;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(512.4571013879283, 234.7504090693131)"><circle style="transition:all 0.5s ease-out" r="30.53250998398045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(458.95943358587135, 257.86354977626803)"><circle style="transition:all 0.5s ease-out" r="21.235647871647426" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#f1e05a;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(463.6210275819494, 209.8535735427391)"><circle style="transition:all 0.5s ease-out" r="17.643810882955766" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(429.94733392039217, 163.4979749857882)"><circle r="24.555665603024796" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(500.15832910431885, 164.94941980931233)"><circle r="31.81109874052291" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(450.82558698952977, 229.51694765004308)"><circle style="transition:all 0.5s ease-out" r="2.6146479463642924" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(476.36476833146503, 237.3603736814449)"><circle style="transition:all 0.5s ease-out" r="2.5787471861822056" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(469.25318530535196, 232.60526691231775)"><circle style="transition:all 0.5s ease-out" r="2.5666686786275803" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(431.98218614958677, 257.18271848114114)"><circle style="transition:all 0.5s ease-out" r="2.554533061334901" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(476.7622353670526, 229.04803927125838)"><circle style="transition:all 0.5s ease-out" r="2.5423395164804927" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(320.00958704794687, 807.6027914744386)"><circle style="transition:all 0.5s ease-out" r="30.542685791623068" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(392.2829724508863, 809.1010151493219)"><circle style="transition:all 0.5s ease-out" r="29.284693676112123" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(363.6278477646056, 856.1133193551365)"><circle style="transition:all 0.5s ease-out" r="14.43556062491978" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(363.9956151092209, 763.9617920796633)"><circle style="transition:all 0.5s ease-out" r="13.862342373087381" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(334.36240795245504, 763.5676255543302)"><circle style="transition:all 0.5s ease-out" r="12.57652827630675" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(356.42058836474627, 830.2653182750355)"><circle style="transition:all 0.5s ease-out" r="9.163144868295092" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#cb171e;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(394.101138686625, 767.2374341210409)"><circle style="transition:all 0.5s ease-out" r="8.94347200119149" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(357.28628156982023, 788.3481569001303)"><circle style="transition:all 0.5s ease-out" r="8.226797702990359" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#199f4b;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(340.7950570880013, 844.0206887635807)"><circle style="transition:all 0.5s ease-out" r="8.192732141744557" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(407.97194652908416, 776.0621710493327)"><circle style="transition:all 0.5s ease-out" r="4.556067100895268" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000000;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(386.9380834496869, 845.3891973459426)"><circle style="transition:all 0.5s ease-out" r="4.193822989078803" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(380.9155009052245, 775.2363751349797)"><circle style="transition:all 0.5s ease-out" r="3.278988774042822" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(316.7170549122837, 770.7364911636618)"><circle style="transition:all 0.5s ease-out" r="3.2694981932865566" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(370.2613660354364, 836.6846955612831)"><circle style="transition:all 0.5s ease-out" r="2.8965682269362802" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(377.8131348332271, 841.1437681171224)"><circle style="transition:all 0.5s ease-out" r="2.6734114171599117" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#083fa1;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(345.4861052581486, 780.9530665231163)"><circle style="transition:all 0.5s ease-out" r="2.4929690009061694" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(369.0034548279796, 783.7991864393258)"><circle style="transition:all 0.5s ease-out" r="1.1424219151830952" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(753.5559755983531, 535.6383459642083)"><circle style="transition:all 0.5s ease-out" r="15.962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(798.6609077135887, 548.1162537815725)"><circle r="19.78767480101326" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(766.2855715465157, 588.9585035139102)"><circle r="36.022171625965505" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(769.033752156919, 545.452076252546)"><circle style="transition:all 0.5s ease-out" r="3.7560365250643617" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(778.6722029258943, 548.3675857775355)"><circle style="transition:all 0.5s ease-out" r="3.113717284145656" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(696.0196659934778, 656.031536614714)"><circle style="transition:all 0.5s ease-out" r="15.962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(737.4982567413759, 671.8403077091855)"><circle r="20.305200179760106" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(703.4860447237852, 711.1549469088552)"><circle r="36.00979919102366" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(711.4735153029711, 668.6361656914793)"><circle style="transition:all 0.5s ease-out" r="3.7560365250643617" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(719.0705565267546, 673.3684832311789)"><circle style="transition:all 0.5s ease-out" r="1.9943752007249353" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(700.1719673912833, 408.902033403967)"><circle style="transition:all 0.5s ease-out" r="15.962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(745.2768995065188, 421.3799412213313)"><circle r="19.78767480101326" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(712.9015633394456, 462.22219095366887)"><circle r="36.022171625965505" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(715.6497439498492, 418.7157636923048)"><circle style="transition:all 0.5s ease-out" r="3.7560365250643617" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(725.2881947188245, 421.6312732172943)"><circle style="transition:all 0.5s ease-out" r="3.113717284145656" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(803.6629517499538, 665.2141060036499)"><circle style="transition:all 0.5s ease-out" r="10.500106064052844" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(828.2722525930051, 665.2141060036499)"><circle style="transition:all 0.5s ease-out" r="10.410944194669167" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(814.8800858543933, 471.897689164889)"><circle style="transition:all 0.5s ease-out" r="14.205549002058543" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(842.9440722815704, 471.897689164889)"><circle style="transition:all 0.5s ease-out" r="10.160186840789294" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(832.661460831498, 493.57006181085046)"><circle style="transition:all 0.5s ease-out" r="10.129556120373689" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(832.4662202804312, 451.8354846024064)"><circle style="transition:all 0.5s ease-out" r="8.775109236080548" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(884.8885008614398, 619.8120754407543)"><circle r="37.45932660126524" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(936.6056848227626, 619.8667324149177)"><circle style="transition:all 0.5s ease-out" r="9.163144868295092" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(931.2305356359143, 633.1132579937947)"><circle style="transition:all 0.5s ease-out" r="3.0634115955276804" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(930.7486071074376, 607.9335001134996)"><circle style="transition:all 0.5s ease-out" r="2.2297792607303717" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(927.9980069013866, 601.2877698794412)"><circle style="transition:all 0.5s ease-out" r="1.7627952858286047" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(927.1404461478616, 639.8248825812485)"><circle style="transition:all 0.5s ease-out" r="1.5962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(924.6824086343264, 596.1941403218046)"><circle style="transition:all 0.5s ease-out" r="1.1148896303651858" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(509.4171044352229, 562.1917603192146)"><circle style="transition:all 0.5s ease-out" r="16.915488168942034" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(594.3062912083872, 565.9804397585089)"><circle r="57.33320972162033" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(458.0816638954804, 593.1265242233236)"><circle r="35.253566773238525" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(414.8758296553668, 523.3580839612646)"><circle r="34.5097190001014" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(524.6060115057035, 653.8840051120144)"><circle r="42.501117020807236" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(504.2518553343613, 488.50593912578586)"><circle r="49.116129162646736" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(582.9945078259908, 639.9750511944035)"><circle style="transition:all 0.5s ease-out" r="9.751301704081884" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(527.645184289383, 545.4441904397316)"><circle style="transition:all 0.5s ease-out" r="4.670575926218484" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(907.9855335666233, 514.4888056134556)"><circle style="transition:all 0.5s ease-out" r="26.694564923045178" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#89e051;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(946.8511951339568, 512.6689056384696)"><circle style="transition:all 0.5s ease-out" r="9.002345443872255" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#89e051;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(941.3447532984862, 531.7563265483296)"><circle style="transition:all 0.5s ease-out" r="7.663599184004703" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(934.2800492399537, 492.76665548351286)"><circle style="transition:all 0.5s ease-out" r="4.201226036304242" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(937.4378773274523, 501.8054636583465)"><circle style="transition:all 0.5s ease-out" r="2.1733199888659107" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000000;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(930.2147611372303, 536.0271700744597)"><circle style="transition:all 0.5s ease-out" r="1.0576771714971624" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000080;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(259.50639450702926, 583.3369571703405)"><circle style="transition:all 0.5s ease-out" r="14.651363552229816" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000080;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(287.58497787538596, 583.3369571703405)"><circle style="transition:all 0.5s ease-out" r="9.728969231797723" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000080;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(277.22350397684926, 598.6848047757594)"><circle style="transition:all 0.5s ease-out" r="5.090786757724965" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#000080;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(276.7363407435365, 571.9340420987187)"><circle style="transition:all 0.5s ease-out" r="2.3118843435500898" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(145.35236821742998, 347.7474478059432)"><circle style="transition:all 0.5s ease-out" r="23.12825035332259" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(238.23521648313155, 347.7474478059432)"><circle r="66.05634732804975" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(150.4169405380807, 415.6211520126936)"><circle r="41.235894079982856" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(157.3145013973165, 295.9731192592728)"><circle r="26.311750131346653" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(227.16624740950257, 461.3906122075975)"><circle r="44.42635886927701" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(207.21743410746618, 225.65633483009964)"><circle r="56.21501227668346" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(127.82674597229911, 318.6174108341751)"><circle style="transition:all 0.5s ease-out" r="7.169182450913925" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(248.7929608681725, 274.51189920246037)"><circle style="transition:all 0.5s ease-out" r="4.238047301540488" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(207.42735027885925, 708.6951437921741)"><circle style="transition:all 0.5s ease-out" r="2.5666686786275803" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(215.47903071613914, 710.7959504080628)"><circle style="transition:all 0.5s ease-out" r="2.554533061334901" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(209.65086356217867, 716.7010906461754)"><circle style="transition:all 0.5s ease-out" r="2.5423395164804927" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(213.27078732811043, 702.8052905566826)"><circle style="transition:all 0.5s ease-out" r="2.5300872065332993" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(200.05401611132078, 704.918139868741)"><circle style="transition:all 0.5s ease-out" r="2.517775273583543" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ff9900;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(201.60209235444364, 714.5682369155626)"><circle style="transition:all 0.5s ease-out" r="2.505402838641701" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(221.2273660037037, 704.881707944755)"><circle style="transition:all 0.5s ease-out" r="2.4929690009061694" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(425.61239936026266, 162.4669254658571)"><circle style="transition:all 0.5s ease-out" r="2.638310401036352" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(434.07418614729835, 162.69627082756668)"><circle style="transition:all 0.5s ease-out" r="2.626505821014262" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(429.65936745343845, 169.8908278163945)"><circle style="transition:all 0.5s ease-out" r="2.6146479463642924" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(430.0534273707054, 155.28793263010792)"><circle style="transition:all 0.5s ease-out" r="2.602736048667291" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(421.66455565447404, 155.01311229583553)"><circle style="transition:all 0.5s ease-out" r="2.5907693827582245" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(421.26817543265906, 169.67626507318604)"><circle style="transition:all 0.5s ease-out" r="2.5787471861822056" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(438.4196387930949, 155.51486555860424)"><circle style="transition:all 0.5s ease-out" r="2.5666686786275803" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(438.2848073939843, 169.94261520585496)"><circle style="transition:all 0.5s ease-out" r="2.554533061334901" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(417.2409010633938, 162.07509360910962)"><circle style="transition:all 0.5s ease-out" r="2.5423395164804927" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(412.9748066708989, 169.16265189912102)"><circle style="transition:all 0.5s ease-out" r="2.5300872065332993" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(442.4181410393257, 162.77026434518692)"><circle style="transition:all 0.5s ease-out" r="2.517775273583543" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(446.54717626459643, 169.88164440616796)"><circle style="transition:all 0.5s ease-out" r="2.505402838641701" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(434.4660771243392, 148.26311788184591)"><circle style="transition:all 0.5s ease-out" r="2.4929690009061694" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(495.69864839840363, 164.911732467699)"><circle style="transition:all 0.5s ease-out" r="23.653008211259493" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(525.5799944005257, 164.911732467699)"><circle style="transition:all 0.5s ease-out" r="2.5300872065332993" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(524.2789683300209, 173.5480254541209)"><circle style="transition:all 0.5s ease-out" r="2.505402838641701" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#CED6E0;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(524.2701789343807, 156.28934442256914)"><circle style="transition:all 0.5s ease-out" r="2.4929690009061694" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(794.3084562792575, 548.3854730785346)"><circle style="transition:all 0.5s ease-out" r="4.480413936180172" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(806.0881115981031, 549.4862011247503)"><circle style="transition:all 0.5s ease-out" r="4.149127329614881" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#cb171e;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(799.6692309728492, 557.8113160642935)"><circle style="transition:all 0.5s ease-out" r="3.1632230473934895" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(801.3106644221552, 540.1970430747616)"><circle style="transition:all 0.5s ease-out" r="3.0936931710817444" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(788.3053319464401, 539.7033112712119)"><circle style="transition:all 0.5s ease-out" r="2.8750321049524312" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(788.303653801866, 556.6435953096267)"><circle style="transition:all 0.5s ease-out" r="2.5300872065332993" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(809.9338169638595, 540.5944554233872)"><circle style="transition:all 0.5s ease-out" r="2.338612218120313" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(749.1091628976864, 588.9585035139102)"><circle r="9.230311457880166" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(780.3236087640239, 588.9585035139102)"><circle r="12.368682889201382" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(729.4358967297371, 672.5389209403234)"><circle style="transition:all 0.5s ease-out" r="7.059989617883471" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(748.6692945611723, 671.6151231199971)"><circle style="transition:all 0.5s ease-out" r="6.131892967008523" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(740.2355641600319, 682.4369272267728)"><circle style="transition:all 0.5s ease-out" r="4.389324864074795" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(739.2438885164338, 661.9889698879966)"><circle style="transition:all 0.5s ease-out" r="4.141631158488443" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(730.0618618918625, 660.3003604587748)"><circle style="transition:all 0.5s ease-out" r="1.9943752007249353" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(686.3220085098977, 711.1549469088552)"><circle r="9.230311457880166" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(717.5240819412934, 711.1549469088552)"><circle r="12.356310454259537" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(740.9244480721876, 421.6491605182933)"><circle style="transition:all 0.5s ease-out" r="4.480413936180172" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(752.7041033910331, 422.74988856450926)"><circle style="transition:all 0.5s ease-out" r="4.149127329614881" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#cb171e;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(746.2852227657792, 431.07500350405235)"><circle style="transition:all 0.5s ease-out" r="3.1632230473934895" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(747.9266562150855, 413.4607305145205)"><circle style="transition:all 0.5s ease-out" r="3.0936931710817444" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(734.9213237393701, 412.96699871097064)"><circle style="transition:all 0.5s ease-out" r="2.8750321049524312" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(734.9196455947963, 429.9072827493856)"><circle style="transition:all 0.5s ease-out" r="2.5300872065332993" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(756.5498087567897, 413.85814286314627)"><circle style="transition:all 0.5s ease-out" r="2.338612218120313" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(695.7251546906163, 462.22219095366887)"><circle r="9.230311457880166" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(726.9396005569538, 462.22219095366887)"><circle r="12.368682889201382" style="transition:all 0.5s ease-out" stroke="#290819" stroke-opacity="0.2" stroke-width="1" fill="white"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(867.0843739634756, 619.8120754407543)"><circle style="transition:all 0.5s ease-out" r="15.956949118971922" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(902.6945752725762, 619.8120754407543)"><circle style="transition:all 0.5s ease-out" r="15.955001605799483" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(580.3921342375612, 567.2474605155954)"><circle style="transition:all 0.5s ease-out" r="16.95585494070716" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(615.54892688306, 566.37871912528)"><circle style="transition:all 0.5s ease-out" r="15.01173115851441" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(600.5734521957364, 595.8771650857434)"><circle style="transition:all 0.5s ease-out" r="14.870304104377505" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(599.0992384024407, 539.319530037255)"><circle style="transition:all 0.5s ease-out" r="13.455105908985864" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(569.3599637413832, 535.6535804473974)"><circle style="transition:all 0.5s ease-out" r="13.308812551281742" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(568.5244202732299, 596.4863140404705)"><circle style="transition:all 0.5s ease-out" r="11.399712396789143" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(626.753582025773, 539.41027774004)"><circle style="transition:all 0.5s ease-out" r="10.991703594232959" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(628.5358085380284, 591.6520052855279)"><circle style="transition:all 0.5s ease-out" r="10.202915360879704" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(552.5611494147806, 555.9905907971399)"><circle style="transition:all 0.5s ease-out" r="9.865355894352863" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(553.1602794516452, 578.2747490953171)"><circle style="transition:all 0.5s ease-out" r="9.223985303352826" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(639.3473345839908, 557.3479863732003)"><circle style="transition:all 0.5s ease-out" r="7.242493290932592" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(639.1246071510704, 574.523032088991)"><circle style="transition:all 0.5s ease-out" r="6.731016302446656" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(443.11852020517836, 589.7061140661632)"><circle style="transition:all 0.5s ease-out" r="16.206216060894253" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(476.1697056182889, 589.7061140661632)"><circle style="transition:all 0.5s ease-out" r="13.14671876788706" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(462.3362705869451, 613.5349054762272)"><circle style="transition:all 0.5s ease-out" r="10.708165221380808" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(461.998157027928, 570.4602367727)"><circle style="transition:all 0.5s ease-out" r="7.055586755205241" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(405.5569452888239, 526.6696537563533)"><circle style="transition:all 0.5s ease-out" r="10.372069357046513" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(436.4581111318186, 522.2683524858188)"><circle style="transition:all 0.5s ease-out" r="9.899943702394749" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(423.59805599010997, 540.2158287803786)"><circle style="transition:all 0.5s ease-out" r="8.988527560909425" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(419.1712671192247, 509.1287181175611)"><circle style="transition:all 0.5s ease-out" r="8.625096314857295" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(399.71836680738704, 506.0361139356462)"><circle style="transition:all 0.5s ease-out" r="7.87162610656824" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(408.69643698319004, 542.8905072124011)"><circle style="transition:all 0.5s ease-out" r="2.9497207012310076" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(506.4152745337826, 644.0376483763788)"><circle style="transition:all 0.5s ease-out" r="18.118242858878073" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(544.6778071963926, 644.0376483763788)"><circle style="transition:all 0.5s ease-out" r="16.446039219402664" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(527.1805505560818, 676.130185923027)"><circle style="transition:all 0.5s ease-out" r="16.40820609080209" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(485.9645741559032, 488.27286157520666)"><circle style="transition:all 0.5s ease-out" r="19.06428668533753" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(534.2710102313399, 486.01623661763927)"><circle style="transition:all 0.5s ease-out" r="15.993906812563338" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(513.5447027152892, 512.4774473579608)"><circle style="transition:all 0.5s ease-out" r="14.42694752115482" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(511.18965205826174, 467.8165092578682)"><circle style="transition:all 0.5s ease-out" r="10.209004836420863" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(490.8248310327502, 456.4771465535253)"><circle style="transition:all 0.5s ease-out" r="9.899943702394749" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(488.9832878541166, 517.9124219808067)"><circle style="transition:all 0.5s ease-out" r="7.528601283641565" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(218.9824466882351, 348.9466077434991)"><circle style="transition:all 0.5s ease-out" r="23.243510355019925" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(263.98404318009864, 348.9466077434991)"><circle style="transition:all 0.5s ease-out" r="18.059835552514407" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(245.84326807751088, 379.18120248548524)"><circle style="transition:all 0.5s ease-out" r="13.501216756645386" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(245.7250379645878, 319.989741465146)"><circle style="transition:all 0.5s ease-out" r="12.474812894971882" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(219.25469799242958, 309.82336084319115)"><circle style="transition:all 0.5s ease-out" r="12.182433222257409" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(217.90124581810235, 387.9636481031643)"><circle style="transition:all 0.5s ease-out" r="12.090257119538382" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(273.59528142323325, 316.69966685628435)"><circle style="transition:all 0.5s ease-out" r="11.89070428940816" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(274.16382958716224, 380.23064505792473)"><circle style="transition:all 0.5s ease-out" r="11.14053149344311" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(195.0090358034781, 320.1976263658228)"><circle style="transition:all 0.5s ease-out" r="10.491223976408802" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(194.75710912532176, 376.74506745475134)"><circle style="transition:all 0.5s ease-out" r="9.93128263390653" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(239.87084856109337, 294.95334306980504)"><circle style="transition:all 0.5s ease-out" r="9.53866104828" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(236.5441426781616, 402.3310725581411)"><circle style="transition:all 0.5s ease-out" r="7.748282408725701" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(286.98479259284227, 333.5401600578917)"><circle style="transition:all 0.5s ease-out" r="5.925719667943881" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(286.00346040738305, 364.24480437869096)"><circle style="transition:all 0.5s ease-out" r="5.054029693844222" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(132.79498340086212, 415.6211520126936)"><circle style="transition:all 0.5s ease-out" r="19.91568635843506" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(172.18175218868038, 415.6211520126936)"><circle style="transition:all 0.5s ease-out" r="15.772831845053968" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(155.73997633638484, 439.31790794192233)"><circle style="transition:all 0.5s ease-out" r="9.371043614765634" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(155.3293871665507, 397.23825020062196)"><circle style="transition:all 0.5s ease-out" r="5.46750786500527" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(149.1246518624414, 295.9338023462044)"><circle style="transition:all 0.5s ease-out" r="10.209004836420863" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(169.96307846973517, 295.9338023462044)"><circle style="transition:all 0.5s ease-out" r="6.93117118654369" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(162.48791101368582, 311.28836827561685)"><circle style="transition:all 0.5s ease-out" r="6.448072874907293" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(162.14944317520576, 283.21671059769596)"><circle style="transition:all 0.5s ease-out" r="4.296304980474843" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(151.32885629641498, 278.2533460262186)"><circle style="transition:all 0.5s ease-out" r="3.9100690941617127" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(205.3788627196585, 457.96021668739337)"><circle style="transition:all 0.5s ease-out" r="18.67232117479714" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(243.0441599324174, 457.96021668739337)"><circle style="transition:all 0.5s ease-out" r="15.294725453632486" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(227.3688952539737, 487.59010779397755)"><circle style="transition:all 0.5s ease-out" r="14.527828990069725" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(227.0896061854986, 432.07593786623744)"><circle style="transition:all 0.5s ease-out" r="11.41333375712294" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(195.49180936598424, 225.25900365043145)"><circle style="transition:all 0.5s ease-out" r="19.713379956279145" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(237.16007674882795, 225.25900365043145)"><circle style="transition:all 0.5s ease-out" r="18.256636842235327" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(217.7222880177454, 259.31448187655974)"><circle style="transition:all 0.5s ease-out" r="17.2573967196631" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(217.63941821360382, 194.0136925297257)"><circle style="transition:all 0.5s ease-out" r="14.887012316506791" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(187.069289677189, 190.6941828566019)"><circle style="transition:all 0.5s ease-out" r="12.164564793037087" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(190.03551238186506, 255.21124380971486)"><circle style="transition:all 0.5s ease-out" r="7.033531100254954" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(242.8599969610752, 197.0561738403739)"><circle style="transition:all 0.5s ease-out" r="6.818167672278506" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(745.6662674888516, 587.1321655686634)"><circle style="transition:all 0.5s ease-out" r="1.6347490966432783" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#2b2b2b;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(752.5955461931113, 587.1321655686634)"><circle style="transition:all 0.5s ease-out" r="1.5962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ece2a9;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(749.1687121807647, 592.9943436825869)"><circle style="transition:all 0.5s ease-out" r="1.4957814005437016" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(775.9567081982758, 588.9585035139102)"><circle style="transition:all 0.5s ease-out" r="4.30353173912401" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(786.4762657953125, 588.9585035139102)"><circle style="transition:all 0.5s ease-out" r="2.517775273583543" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(682.879113101063, 709.3286089636084)"><circle style="transition:all 0.5s ease-out" r="1.6347490966432783" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#2b2b2b;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(689.8083918053227, 709.3286089636084)"><circle style="transition:all 0.5s ease-out" r="1.5962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ece2a9;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(686.3815577929761, 715.1907870775319)"><circle style="transition:all 0.5s ease-out" r="1.4957814005437016" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(713.1695538104871, 711.1549469088552)"><circle style="transition:all 0.5s ease-out" r="4.30353173912401" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(723.676738972582, 711.1549469088552)"><circle style="transition:all 0.5s ease-out" r="2.505402838641701" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(692.2822592817815, 460.3958530084221)"><circle style="transition:all 0.5s ease-out" r="1.6347490966432783" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#2b2b2b;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(699.2115379860412, 460.3958530084221)"><circle style="transition:all 0.5s ease-out" r="1.5962790232871045" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#ece2a9;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(695.7847039736946, 466.2580311223456)"><circle style="transition:all 0.5s ease-out" r="1.4957814005437016" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(722.5726999912057, 462.22219095366887)"><circle style="transition:all 0.5s ease-out" r="4.30353173912401" stroke-width="0" stroke="#374151"></circle></g><g style="fill:#701516;transition:transform 0s ease-out, fill 0.1s ease-out" transform="translate(733.0922575882424, 462.22219095366887)"><circle style="transition:all 0.5s ease-out" r="2.517775273583543" stroke-width="0" stroke="#374151"></circle></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(319.99422221520257, 687.2164700211342)"><path fill="none" d="M 0 46.02921418068235 A 46.02921418068235 46.02921418068235 0 0 1 0 -46.02921418068235 A 46.02921418068235 46.02921418068235 0 0 1 0 46.02921418068235" id="CircleText--1" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--1" startOffset="50%">views</textPath></text><path fill="none" d="M 0 46.02921418068235 A 46.02921418068235 46.02921418068235 0 0 1 0 -46.02921418068235 A 46.02921418068235 46.02921418068235 0 0 1 0 46.02921418068235" id="CircleText--2" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--2" startOffset="50%">views</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(661.4377379675747, 565.1941312103406)"><path fill="none" d="M 0 310.5618666214336 A 310.5618666214336 310.5618666214336 0 0 1 0 -310.5618666214336 A 310.5618666214336 310.5618666214336 0 0 1 0 310.5618666214336" id="CircleText--3" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--3" startOffset="50%">test</textPath></text><path fill="none" d="M 0 310.5618666214336 A 310.5618666214336 310.5618666214336 0 0 1 0 -310.5618666214336 A 310.5618666214336 310.5618666214336 0 0 1 0 310.5618666214336" id="CircleText--4" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--4" startOffset="50%">test</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(288.8905634421281, 583.3369571703405)"><path fill="none" d="M 0 56.43203365598711 A 56.43203365598711 56.43203365598711 0 0 1 0 -56.43203365598711 A 56.43203365598711 56.43203365598711 0 0 1 0 56.43203365598711" id="CircleText--5" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--5" startOffset="50%">lua</textPath></text><path fill="none" d="M 0 56.43203365598711 A 56.43203365598711 56.43203365598711 0 0 1 0 -56.43203365598711 A 56.43203365598711 56.43203365598711 0 0 1 0 56.43203365598711" id="CircleText--6" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--6" startOffset="50%">lua</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(198.2622918656833, 337.650139496829)"><path fill="none" d="M 0 199.43813337856645 A 199.43813337856645 199.43813337856645 0 0 1 0 -199.43813337856645 A 199.43813337856645 199.43813337856645 0 0 1 0 199.43813337856645" id="CircleText--7" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--7" startOffset="50%">lib</textPath></text><path fill="none" d="M 0 199.43813337856645 A 199.43813337856645 199.43813337856645 0 0 1 0 -199.43813337856645 A 199.43813337856645 199.43813337856645 0 0 1 0 199.43813337856645" id="CircleText--8" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--8" startOffset="50%">lib</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(208.84229622707048, 675.5867014055564)"><path fill="none" d="M 0 59.7124021629937 A 59.7124021629937 59.7124021629937 0 0 1 0 -59.7124021629937 A 59.7124021629937 59.7124021629937 0 0 1 0 59.7124021629937" id="CircleText--9" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--9" startOffset="50%">docs</textPath></text><path fill="none" d="M 0 59.7124021629937 A 59.7124021629937 59.7124021629937 0 0 1 0 -59.7124021629937 A 59.7124021629937 59.7124021629937 0 0 1 0 59.7124021629937" id="CircleText--10" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--10" startOffset="50%">docs</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(467.6116292400953, 199.49715021934765)"><path fill="none" d="M 0 97.27512036255078 A 97.27512036255078 97.27512036255078 0 0 1 0 -97.27512036255078 A 97.27512036255078 97.27512036255078 0 0 1 0 97.27512036255078" id="CircleText--11" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--11" startOffset="50%">public</textPath></text><path fill="none" d="M 0 97.27512036255078 A 97.27512036255078 97.27512036255078 0 0 1 0 -97.27512036255078 A 97.27512036255078 97.27512036255078 0 0 1 0 97.27512036255078" id="CircleText--12" transform="rotate(1)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:15px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--12" startOffset="50%">public</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(778.8592125527111, 570.0827446562124)"><path fill="none" d="M 0 62.70235506011423 A 62.70235506011423 62.70235506011423 0 0 1 0 -62.70235506011423 A 62.70235506011423 62.70235506011423 0 0 1 0 62.70235506011423" id="CircleText--13" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--13" startOffset="50%">rails6_dummy</textPath></text><path fill="none" d="M 0 62.70235506011423 A 62.70235506011423 62.70235506011423 0 0 1 0 -62.70235506011423 A 62.70235506011423 62.70235506011423 0 0 1 0 62.70235506011423" id="CircleText--14" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--14" startOffset="50%">rails6_dummy</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(717.5459367246649, 693.1394072463729)"><path fill="none" d="M 0 62.86237524727761 A 62.86237524727761 62.86237524727761 0 0 1 0 -62.86237524727761 A 62.86237524727761 62.86237524727761 0 0 1 0 62.86237524727761" id="CircleText--15" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--15" startOffset="50%">rails5_dummy</textPath></text><path fill="none" d="M 0 62.86237524727761 A 62.86237524727761 62.86237524727761 0 0 1 0 -62.86237524727761 A 62.86237524727761 62.86237524727761 0 0 1 0 62.86237524727761" id="CircleText--16" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--16" startOffset="50%">rails5_dummy</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(725.4752043456411, 443.3464320959712)"><path fill="none" d="M 0 62.702355060114215 A 62.702355060114215 62.702355060114215 0 0 1 0 -62.702355060114215 A 62.702355060114215 62.702355060114215 0 0 1 0 62.702355060114215" id="CircleText--17" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--17" startOffset="50%">rails4_dummy</textPath></text><path fill="none" d="M 0 62.702355060114215 A 62.702355060114215 62.702355060114215 0 0 1 0 -62.702355060114215 A 62.702355060114215 62.702355060114215 0 0 1 0 62.702355060114215" id="CircleText--18" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--18" startOffset="50%">rails4_dummy</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(815.9230212367876, 665.2141060036499)"><path fill="none" d="M 0 27.458426135215838 A 27.458426135215838 27.458426135215838 0 0 1 0 -27.458426135215838 A 27.458426135215838 27.458426135215838 0 0 1 0 27.458426135215838" id="CircleText--19" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--19" startOffset="50%">integration</textPath></text><path fill="none" d="M 0 27.458426135215838 A 27.458426135215838 27.458426135215838 0 0 1 0 -27.458426135215838 A 27.458426135215838 27.458426135215838 0 0 1 0 27.458426135215838" id="CircleText--20" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--20" startOffset="50%">integration</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(830.9853756043558, 473.38933293249397)"><path fill="none" d="M 0 35.078018549283044 A 35.078018549283044 35.078018549283044 0 0 1 0 -35.078018549283044 A 35.078018549283044 35.078018549283044 0 0 1 0 35.078018549283044" id="CircleText--21" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--21" startOffset="50%">forked</textPath></text><path fill="none" d="M 0 35.078018549283044 A 35.078018549283044 35.078018549283044 0 0 1 0 -35.078018549283044 A 35.078018549283044 35.078018549283044 0 0 1 0 35.078018549283044" id="CircleText--22" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--22" startOffset="50%">forked</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(896.5990215299141, 619.8107385171486)"><path fill="none" d="M 0 53.169847346054155 A 53.169847346054155 53.169847346054155 0 0 1 0 -53.169847346054155 A 53.169847346054155 53.169847346054155 0 0 1 0 53.169847346054155" id="CircleText--23" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--23" startOffset="50%">fixtures</textPath></text><path fill="none" d="M 0 53.169847346054155 A 53.169847346054155 53.169847346054155 0 0 1 0 -53.169847346054155 A 53.169847346054155 53.169847346054155 0 0 1 0 53.169847346054155" id="CircleText--24" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--24" startOffset="50%">fixtures</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(526.6706855709276, 561.9800413946193)"><path fill="none" d="M 0 156.78797315176226 A 156.78797315176226 156.78797315176226 0 0 1 0 -156.78797315176226 A 156.78797315176226 156.78797315176226 0 0 1 0 156.78797315176226" id="CircleText--25" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--25" startOffset="50%">coverband</textPath></text><path fill="none" d="M 0 156.78797315176226 A 156.78797315176226 156.78797315176226 0 0 1 0 -156.78797315176226 A 156.78797315176226 156.78797315176226 0 0 1 0 156.78797315176226" id="CircleText--26" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--26" startOffset="50%">coverband</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(917.8131106864573, 514.6120585177536)"><path fill="none" d="M 0 42.24428624341126 A 42.24428624341126 42.24428624341126 0 0 1 0 -42.24428624341126 A 42.24428624341126 42.24428624341126 0 0 1 0 42.24428624341126" id="CircleText--27" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--27" startOffset="50%">benchmarks</textPath></text><path fill="none" d="M 0 42.24428624341126 A 42.24428624341126 42.24428624341126 0 0 1 0 -42.24428624341126 A 42.24428624341126 42.24428624341126 0 0 1 0 42.24428624341126" id="CircleText--28" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--28" startOffset="50%">benchmarks</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(271.08448903099156, 583.3369571703405)"><path fill="none" d="M 0 30.92770866052136 A 30.92770866052136 30.92770866052136 0 0 1 0 -30.92770866052136 A 30.92770866052136 30.92770866052136 0 0 1 0 30.92770866052136" id="CircleText--29" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--29" startOffset="50%">test</textPath></text><path fill="none" d="M 0 30.92770866052136 A 30.92770866052136 30.92770866052136 0 0 1 0 -30.92770866052136 A 30.92770866052136 30.92770866052136 0 0 1 0 30.92770866052136" id="CircleText--30" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--30" startOffset="50%">test</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(216.69481484791584, 337.650139496829)"><path fill="none" d="M 0 173.30735981200468 A 173.30735981200468 173.30735981200468 0 0 1 0 -173.30735981200468 A 173.30735981200468 173.30735981200468 0 0 1 0 173.30735981200468" id="CircleText--31" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--31" startOffset="50%">coverband</textPath></text><path fill="none" d="M 0 173.30735981200468 A 173.30735981200468 173.30735981200468 0 0 1 0 -173.30735981200468 A 173.30735981200468 173.30735981200468 0 0 1 0 173.30735981200468" id="CircleText--32" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--32" startOffset="50%">coverband</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(429.94733392039217, 163.4979749857882)"><path fill="none" d="M 0 25.555665603024792 A 25.555665603024792 25.555665603024792 0 0 1 0 -25.555665603024792 A 25.555665603024792 25.555665603024792 0 0 1 0 25.555665603024792" id="CircleText--33" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--33" startOffset="50%">images</textPath></text><path fill="none" d="M 0 25.555665603024792 A 25.555665603024792 25.555665603024792 0 0 1 0 -25.555665603024792 A 25.555665603024792 25.555665603024792 0 0 1 0 25.555665603024792" id="CircleText--34" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--34" startOffset="50%">images</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(500.15832910431885, 164.94941980931233)"><path fill="none" d="M 0 32.81109874052291 A 32.81109874052291 32.81109874052291 0 0 1 0 -32.81109874052291 A 32.81109874052291 32.81109874052291 0 0 1 0 32.81109874052291" id="CircleText--35" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--35" startOffset="50%">colorbox</textPath></text><path fill="none" d="M 0 32.81109874052291 A 32.81109874052291 32.81109874052291 0 0 1 0 -32.81109874052291 A 32.81109874052291 32.81109874052291 0 0 1 0 32.81109874052291" id="CircleText--36" transform="rotate(2)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:14px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--36" startOffset="50%">colorbox</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(798.6609077135887, 548.1162537815725)"><path fill="none" d="M 0 20 A 20 20 0 0 1 0 -20 A 20 20 0 0 1 0 20" id="CircleText--37" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--37" startOffset="50%">config</textPath></text><path fill="none" d="M 0 20 A 20 20 0 0 1 0 -20 A 20 20 0 0 1 0 20" id="CircleText--38" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--38" startOffset="50%">config</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(766.2855715465157, 588.9585035139102)"><path fill="none" d="M 0 33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 -33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 33.022171625965505" id="CircleText--39" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--39" startOffset="50%">app</textPath></text><path fill="none" d="M 0 33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 -33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 33.022171625965505" id="CircleText--40" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--40" startOffset="50%">app</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(737.4982567413759, 671.8403077091855)"><path fill="none" d="M 0 20 A 20 20 0 0 1 0 -20 A 20 20 0 0 1 0 20" id="CircleText--41" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--41" startOffset="50%">config</textPath></text><path fill="none" d="M 0 20 A 20 20 0 0 1 0 -20 A 20 20 0 0 1 0 20" id="CircleText--42" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--42" startOffset="50%">config</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(703.4860447237852, 711.1549469088552)"><path fill="none" d="M 0 33.00979919102366 A 33.00979919102366 33.00979919102366 0 0 1 0 -33.00979919102366 A 33.00979919102366 33.00979919102366 0 0 1 0 33.00979919102366" id="CircleText--43" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--43" startOffset="50%">app</textPath></text><path fill="none" d="M 0 33.00979919102366 A 33.00979919102366 33.00979919102366 0 0 1 0 -33.00979919102366 A 33.00979919102366 33.00979919102366 0 0 1 0 33.00979919102366" id="CircleText--44" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--44" startOffset="50%">app</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(745.2768995065188, 421.3799412213313)"><path fill="none" d="M 0 20 A 20 20 0 0 1 0 -20 A 20 20 0 0 1 0 20" id="CircleText--45" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--45" startOffset="50%">config</textPath></text><path fill="none" d="M 0 20 A 20 20 0 0 1 0 -20 A 20 20 0 0 1 0 20" id="CircleText--46" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--46" startOffset="50%">config</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(712.9015633394456, 462.22219095366887)"><path fill="none" d="M 0 33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 -33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 33.022171625965505" id="CircleText--47" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--47" startOffset="50%">app</textPath></text><path fill="none" d="M 0 33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 -33.022171625965505 A 33.022171625965505 33.022171625965505 0 0 1 0 33.022171625965505" id="CircleText--48" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--48" startOffset="50%">app</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(884.8885008614398, 619.8120754407543)"><path fill="none" d="M 0 34.45932660126524 A 34.45932660126524 34.45932660126524 0 0 1 0 -34.45932660126524 A 34.45932660126524 34.45932660126524 0 0 1 0 34.45932660126524" id="CircleText--49" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--49" startOffset="50%">app</textPath></text><path fill="none" d="M 0 34.45932660126524 A 34.45932660126524 34.45932660126524 0 0 1 0 -34.45932660126524 A 34.45932660126524 34.45932660126524 0 0 1 0 34.45932660126524" id="CircleText--50" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--50" startOffset="50%">app</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(594.3062912083872, 565.9804397585089)"><path fill="none" d="M 0 54.333209721620335 A 54.333209721620335 54.333209721620335 0 0 1 0 -54.333209721620335 A 54.333209721620335 54.333209721620335 0 0 1 0 54.333209721620335" id="CircleText--51" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--51" startOffset="50%">utils</textPath></text><path fill="none" d="M 0 54.333209721620335 A 54.333209721620335 54.333209721620335 0 0 1 0 -54.333209721620335 A 54.333209721620335 54.333209721620335 0 0 1 0 54.333209721620335" id="CircleText--52" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--52" startOffset="50%">utils</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(458.0816638954804, 593.1265242233236)"><path fill="none" d="M 0 32.253566773238525 A 32.253566773238525 32.253566773238525 0 0 1 0 -32.253566773238525 A 32.253566773238525 32.253566773238525 0 0 1 0 32.253566773238525" id="CircleText--53" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--53" startOffset="50%">reporters</textPath></text><path fill="none" d="M 0 32.253566773238525 A 32.253566773238525 32.253566773238525 0 0 1 0 -32.253566773238525 A 32.253566773238525 32.253566773238525 0 0 1 0 32.253566773238525" id="CircleText--54" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--54" startOffset="50%">reporters</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(414.8758296553668, 523.3580839612646)"><path fill="none" d="M 0 31.5097190001014 A 31.5097190001014 31.5097190001014 0 0 1 0 -31.5097190001014 A 31.5097190001014 31.5097190001014 0 0 1 0 31.5097190001014" id="CircleText--55" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--55" startOffset="50%">integrations</textPath></text><path fill="none" d="M 0 31.5097190001014 A 31.5097190001014 31.5097190001014 0 0 1 0 -31.5097190001014 A 31.5097190001014 31.5097190001014 0 0 1 0 31.5097190001014" id="CircleText--56" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--56" startOffset="50%">integrations</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(524.6060115057035, 653.8840051120144)"><path fill="none" d="M 0 39.501117020807236 A 39.501117020807236 39.501117020807236 0 0 1 0 -39.501117020807236 A 39.501117020807236 39.501117020807236 0 0 1 0 39.501117020807236" id="CircleText--57" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--57" startOffset="50%">collectors</textPath></text><path fill="none" d="M 0 39.501117020807236 A 39.501117020807236 39.501117020807236 0 0 1 0 -39.501117020807236 A 39.501117020807236 39.501117020807236 0 0 1 0 39.501117020807236" id="CircleText--58" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--58" startOffset="50%">collectors</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(504.2518553343613, 488.50593912578586)"><path fill="none" d="M 0 46.116129162646736 A 46.116129162646736 46.116129162646736 0 0 1 0 -46.116129162646736 A 46.116129162646736 46.116129162646736 0 0 1 0 46.116129162646736" id="CircleText--59" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--59" startOffset="50%">adapters</textPath></text><path fill="none" d="M 0 46.116129162646736 A 46.116129162646736 46.116129162646736 0 0 1 0 -46.116129162646736 A 46.116129162646736 46.116129162646736 0 0 1 0 46.116129162646736" id="CircleText--60" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--60" startOffset="50%">adapters</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(238.23521648313155, 347.7474478059432)"><path fill="none" d="M 0 63.05634732804975 A 63.05634732804975 63.05634732804975 0 0 1 0 -63.05634732804975 A 63.05634732804975 63.05634732804975 0 0 1 0 63.05634732804975" id="CircleText--61" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--61" startOffset="50%">utils</textPath></text><path fill="none" d="M 0 63.05634732804975 A 63.05634732804975 63.05634732804975 0 0 1 0 -63.05634732804975 A 63.05634732804975 63.05634732804975 0 0 1 0 63.05634732804975" id="CircleText--62" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--62" startOffset="50%">utils</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(150.4169405380807, 415.6211520126936)"><path fill="none" d="M 0 38.235894079982856 A 38.235894079982856 38.235894079982856 0 0 1 0 -38.235894079982856 A 38.235894079982856 38.235894079982856 0 0 1 0 38.235894079982856" id="CircleText--63" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--63" startOffset="50%">reporters</textPath></text><path fill="none" d="M 0 38.235894079982856 A 38.235894079982856 38.235894079982856 0 0 1 0 -38.235894079982856 A 38.235894079982856 38.235894079982856 0 0 1 0 38.235894079982856" id="CircleText--64" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--64" startOffset="50%">reporters</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(157.3145013973165, 295.9731192592728)"><path fill="none" d="M 0 23.311750131346656 A 23.311750131346656 23.311750131346656 0 0 1 0 -23.311750131346656 A 23.311750131346656 23.311750131346656 0 0 1 0 23.311750131346656" id="CircleText--65" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--65" startOffset="50%">integrations</textPath></text><path fill="none" d="M 0 23.311750131346656 A 23.311750131346656 23.311750131346656 0 0 1 0 -23.311750131346656 A 23.311750131346656 23.311750131346656 0 0 1 0 23.311750131346656" id="CircleText--66" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--66" startOffset="50%">integrations</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(227.16624740950257, 461.3906122075975)"><path fill="none" d="M 0 41.42635886927701 A 41.42635886927701 41.42635886927701 0 0 1 0 -41.42635886927701 A 41.42635886927701 41.42635886927701 0 0 1 0 41.42635886927701" id="CircleText--67" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--67" startOffset="50%">collectors</textPath></text><path fill="none" d="M 0 41.42635886927701 A 41.42635886927701 41.42635886927701 0 0 1 0 -41.42635886927701 A 41.42635886927701 41.42635886927701 0 0 1 0 41.42635886927701" id="CircleText--68" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--68" startOffset="50%">collectors</textPath></text></g><g style="pointer-events:none;transition:all 0.5s ease-out" transform="translate(207.21743410746618, 225.65633483009964)"><path fill="none" d="M 0 53.21501227668347 A 53.21501227668347 53.21501227668347 0 0 1 0 -53.21501227668347 A 53.21501227668347 53.21501227668347 0 0 1 0 53.21501227668347" id="CircleText--69" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151" stroke="white" stroke-width="6"><textPath href="#CircleText--69" startOffset="50%">adapters</textPath></text><path fill="none" d="M 0 53.21501227668347 A 53.21501227668347 53.21501227668347 0 0 1 0 -53.21501227668347 A 53.21501227668347 53.21501227668347 0 0 1 0 53.21501227668347" id="CircleText--70" transform="rotate(3)" style="pointer-events:none"></path><text text-anchor="middle" style="font-size:13px;transition:all 0.5s ease-out" fill="#374151"><textPath href="#CircleText--70" startOffset="50%">adapters</textPath></text></g><g style="fill:#CED6E0;transition:transform 0s ease-out" transform="translate(181.62212425820078, 668.7863787424532)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">coverban...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">coverban...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">coverban...</text></g><g style="fill:#CED6E0;transition:transform 0s ease-out" transform="translate(235.26760587143946, 666.1470864897661)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">coverban...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">coverban...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">coverban...</text></g><g style="fill:#f1e05a;transition:transform 0s ease-out" transform="translate(414.80683990819495, 225.22631291636873)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">dependenci...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">dependenci...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">dependenci...</text></g><g style="fill:#563d7c;transition:transform 0s ease-out" transform="translate(512.4571013879283, 234.7504090693131)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">applicatio...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">applicatio...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">applicatio...</text></g><g style="fill:#083fa1;transition:transform 0s ease-out" transform="translate(320.00958704794687, 807.6027914744386)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">README.md</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">README.md</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">README.md</text></g><g style="fill:#083fa1;transition:transform 0s ease-out" transform="translate(392.2829724508863, 809.1010151493219)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">changes.md</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">changes.md</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">changes.md</text></g><g style="fill:#701516;transition:transform 0s ease-out" transform="translate(907.9855335666233, 514.4888056134556)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">benchmark...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">benchmark...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">benchmark...</text></g><g style="fill:#701516;transition:transform 0s ease-out" transform="translate(145.35236821742998, 347.7474478059432)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">configur...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">configur...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">configur...</text></g><g style="fill:#CED6E0;transition:transform 0s ease-out" transform="translate(495.69864839840363, 164.911732467699)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">loading.gif</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">loading.gif</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">loading.gif</text></g><g style="fill:#701516;transition:transform 0s ease-out" transform="translate(218.9824466882351, 348.9466077434991)"><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;transition:all 0.5s ease-out" fill="#4B5563" text-anchor="middle" dominant-baseline="middle" stroke="white" stroke-width="3" stroke-linejoin="round">source_f...</text><text style="pointer-events:none;opacity:1;font-size:14px;font-weight:500;transition:all 0.5s ease-out" text-anchor="middle" dominant-baseline="middle">source_f...</text><text style="pointer-events:none;opacity:0.9;font-size:14px;font-weight:500;mix-blend-mode:color-burn;transition:all 0.5s ease-out" fill="#110101" text-anchor="middle" dominant-baseline="middle">source_f...</text></g><g transform="translate(940, 740)"><g transform="translate(0, 0)"><circle r="5" fill="#563d7c"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.css</text></g><g transform="translate(0, 15)"><circle r="5" fill="#701516"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.erb</text></g><g transform="translate(0, 30)"><circle r="5" fill="#701516"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.gemspec</text></g><g transform="translate(0, 45)"><circle r="5" fill="#000000"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.gitignore</text></g><g transform="translate(0, 60)"><circle r="5" fill="#ece2a9"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.haml</text></g><g transform="translate(0, 75)"><circle r="5" fill="#f1e05a"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.js</text></g><g transform="translate(0, 90)"><circle r="5" fill="#000080"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.lua</text></g><g transform="translate(0, 105)"><circle r="5" fill="#083fa1"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.md</text></g><g transform="translate(0, 120)"><circle r="5" fill="#701516"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.rake</text></g><g transform="translate(0, 135)"><circle r="5" fill="#701516"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.rb</text></g><g transform="translate(0, 150)"><circle r="5" fill="#701516"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.ru</text></g><g transform="translate(0, 165)"><circle r="5" fill="#89e051"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.sh</text></g><g transform="translate(0, 180)"><circle r="5" fill="#2b2b2b"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.slim</text></g><g transform="translate(0, 195)"><circle r="5" fill="#ff9900"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.svg</text></g><g transform="translate(0, 210)"><circle r="5" fill="#199f4b"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.txt</text></g><g transform="translate(0, 225)"><circle r="5" fill="#cb171e"></circle><text x="10" style="font-size:14px;font-weight:300" dominant-baseline="middle">.yml</text></g><g fill="#9CA3AF" style="font-weight:300;font-style:italic;font-size:12px">each dot sized by file size</g></g></svg>
|
@@ -52,8 +52,9 @@ module Coverband
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def get_coverage_report
|
55
|
-
|
56
|
-
data
|
55
|
+
coverage_cache = {}
|
56
|
+
data = Coverband.configuration.store.split_coverage(Coverband::TYPES, coverage_cache)
|
57
|
+
data.merge(Coverband::MERGED_TYPE => Coverband.configuration.store.merged_coverage(Coverband::TYPES, coverage_cache))
|
57
58
|
end
|
58
59
|
|
59
60
|
def covered_files
|
@@ -66,12 +67,12 @@ module Coverband
|
|
66
67
|
|
67
68
|
protected
|
68
69
|
|
69
|
-
def split_coverage(types)
|
70
|
+
def split_coverage(types, coverage_cache)
|
70
71
|
types.reduce({}) do |data, type|
|
71
72
|
if type == Coverband::RUNTIME_TYPE && Coverband.configuration.simulate_oneshot_lines_coverage
|
72
|
-
data.update(type => simulated_runtime_coverage)
|
73
|
+
data.update(type => coverage_cache[type] ||= simulated_runtime_coverage)
|
73
74
|
else
|
74
|
-
data.update(type => coverage(type))
|
75
|
+
data.update(type => coverage_cache[type] ||= coverage(type))
|
75
76
|
end
|
76
77
|
end
|
77
78
|
end
|
@@ -85,9 +86,9 @@ module Coverband
|
|
85
86
|
merge_reports(runtime_data, eager_data, skip_expansion: true)
|
86
87
|
end
|
87
88
|
|
88
|
-
def merged_coverage(types)
|
89
|
+
def merged_coverage(types, coverage_cache)
|
89
90
|
types.reduce({}) do |data, type|
|
90
|
-
merge_reports(data, coverage(type), skip_expansion: true)
|
91
|
+
merge_reports(data, coverage_cache[type] ||= coverage(type), skip_expansion: true)
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -14,7 +14,7 @@ module Coverband
|
|
14
14
|
#
|
15
15
|
# View Reports:
|
16
16
|
# Using this assumes you are syncing the coverage files
|
17
|
-
# to some shared storage that is
|
17
|
+
# to some shared storage that is accessible outside of the production server
|
18
18
|
# download files to a system where you want to view the reports..
|
19
19
|
# When viewing coverage from the filestore adapter it merges all coverage
|
20
20
|
# files matching the path pattern, in this case `log/coverage.log.*`
|
@@ -9,7 +9,7 @@ module Coverband
|
|
9
9
|
FILE_LENGTH_KEY = "file_length"
|
10
10
|
META_DATA_KEYS = [DATA_KEY, FIRST_UPDATED_KEY, LAST_UPDATED_KEY, FILE_HASH].freeze
|
11
11
|
###
|
12
|
-
# This key isn't related to the coverband version, but to the
|
12
|
+
# This key isn't related to the coverband version, but to the internal format
|
13
13
|
# used to store data to redis. It is changed only when breaking changes to our
|
14
14
|
# redis format are required.
|
15
15
|
###
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Coverband
|
4
|
+
module Adapters
|
5
|
+
###
|
6
|
+
# NullStore is for benchmarking the impacts of calculating
|
7
|
+
# and storing coverage data independent of Coverband/Coverage
|
8
|
+
#
|
9
|
+
# Usage:
|
10
|
+
# config.store = Coverband::Adapters::NullStore.new
|
11
|
+
###
|
12
|
+
class NullStore < Base
|
13
|
+
def initialize(_opts = {})
|
14
|
+
super()
|
15
|
+
end
|
16
|
+
|
17
|
+
def clear!
|
18
|
+
# NOOP
|
19
|
+
end
|
20
|
+
|
21
|
+
def size
|
22
|
+
0
|
23
|
+
end
|
24
|
+
|
25
|
+
def migrate!
|
26
|
+
raise NotImplementedError, "NullStore doesn't support migrations"
|
27
|
+
end
|
28
|
+
|
29
|
+
def coverage(_local_type = nil)
|
30
|
+
{}
|
31
|
+
end
|
32
|
+
|
33
|
+
def save_report(report)
|
34
|
+
# NOOP
|
35
|
+
end
|
36
|
+
|
37
|
+
def raw_store
|
38
|
+
raise NotImplementedError, "NullStore doesn't support raw_store"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -7,7 +7,7 @@ module Coverband
|
|
7
7
|
###
|
8
8
|
class RedisStore < Base
|
9
9
|
###
|
10
|
-
# This key isn't related to the coverband version, but to the
|
10
|
+
# This key isn't related to the coverband version, but to the internal format
|
11
11
|
# used to store data to redis. It is changed only when breaking changes to our
|
12
12
|
# redis format are required.
|
13
13
|
###
|
data/lib/coverband/at_exit.rb
CHANGED
@@ -20,6 +20,9 @@ module Coverband
|
|
20
20
|
# skip reporting
|
21
21
|
else
|
22
22
|
Coverband.report_coverage
|
23
|
+
# to ensure we track mailer views we now need to report views tracking
|
24
|
+
# at exit as well for rake tasks and background tasks that can trigger email
|
25
|
+
Coverband.configuration.view_tracker&.report_views_tracked
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
@@ -46,12 +46,30 @@ module Coverband
|
|
46
46
|
@store.type = old_coverage_type
|
47
47
|
end
|
48
48
|
|
49
|
+
def toggle_eager_loading
|
50
|
+
old_coverage_type = @store.type
|
51
|
+
eager_loading!
|
52
|
+
yield
|
53
|
+
ensure
|
54
|
+
@store.type = old_coverage_type
|
55
|
+
end
|
56
|
+
|
49
57
|
def report_coverage
|
50
58
|
@semaphore.synchronize do
|
51
59
|
raise "no Coverband store set" unless @store
|
52
60
|
|
53
61
|
files_with_line_usage = filtered_files(Delta.results)
|
54
|
-
@store.
|
62
|
+
if @store.type == Coverband::EAGER_TYPE && Coverband.configuration.defer_eager_loading_data?
|
63
|
+
@deferred_eager_loading_data = files_with_line_usage
|
64
|
+
else
|
65
|
+
if @deferred_eager_loading_data && Coverband.configuration.defer_eager_loading_data?
|
66
|
+
toggle_eager_loading do
|
67
|
+
@store.save_report(@deferred_eager_loading_data)
|
68
|
+
@deferred_eager_loading_data = nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
@store.save_report(files_with_line_usage)
|
72
|
+
end
|
55
73
|
end
|
56
74
|
rescue => e
|
57
75
|
@logger&.error "coverage failed to store"
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "set"
|
3
4
|
require "singleton"
|
4
5
|
|
5
6
|
module Coverband
|
@@ -12,7 +13,7 @@ module Coverband
|
|
12
13
|
# https://github.com/livingsocial/flatfoot
|
13
14
|
###
|
14
15
|
class ViewTracker
|
15
|
-
attr_accessor :target
|
16
|
+
attr_accessor :target
|
16
17
|
attr_reader :logger, :roots, :store, :ignore_patterns
|
17
18
|
|
18
19
|
def initialize(options = {})
|
@@ -29,8 +30,16 @@ module Coverband
|
|
29
30
|
@roots = @roots.split(",") if @roots.is_a?(String)
|
30
31
|
@one_time_timestamp = false
|
31
32
|
|
32
|
-
@logged_views =
|
33
|
-
@views_to_record =
|
33
|
+
@logged_views = Set.new
|
34
|
+
@views_to_record = Set.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def logged_views
|
38
|
+
@logged_views.to_a
|
39
|
+
end
|
40
|
+
|
41
|
+
def views_to_record
|
42
|
+
@views_to_record.to_a
|
34
43
|
end
|
35
44
|
|
36
45
|
###
|
@@ -40,8 +49,8 @@ module Coverband
|
|
40
49
|
def track_views(_name, _start, _finish, _id, payload)
|
41
50
|
if (file = payload[:identifier])
|
42
51
|
if newly_seen_file?(file)
|
43
|
-
logged_views << file
|
44
|
-
views_to_record << file if track_file?(file)
|
52
|
+
@logged_views << file
|
53
|
+
@views_to_record << file if track_file?(file)
|
45
54
|
end
|
46
55
|
end
|
47
56
|
|
@@ -54,8 +63,8 @@ module Coverband
|
|
54
63
|
return unless (layout_file = payload[:layout])
|
55
64
|
return unless newly_seen_file?(layout_file)
|
56
65
|
|
57
|
-
logged_views << layout_file
|
58
|
-
views_to_record << layout_file if track_file?(layout_file, layout: true)
|
66
|
+
@logged_views << layout_file
|
67
|
+
@views_to_record << layout_file if track_file?(layout_file, layout: true)
|
59
68
|
end
|
60
69
|
|
61
70
|
def used_views
|
@@ -81,16 +90,17 @@ module Coverband
|
|
81
90
|
all_views.uniq
|
82
91
|
end
|
83
92
|
|
84
|
-
def unused_views
|
85
|
-
recently_used_views = used_views.keys
|
86
|
-
unused_views = all_views
|
93
|
+
def unused_views(used_views = nil)
|
94
|
+
recently_used_views = (used_views || self.used_views).keys
|
95
|
+
unused_views = all_views - recently_used_views
|
87
96
|
# since layouts don't include format we count them used if they match with ANY formats
|
88
97
|
unused_views.reject { |view| view.match(/\/layouts\//) && recently_used_views.any? { |used_view| view.include?(used_view) } }
|
89
98
|
end
|
90
99
|
|
91
100
|
def as_json
|
101
|
+
used_views = self.used_views
|
92
102
|
{
|
93
|
-
unused_views: unused_views,
|
103
|
+
unused_views: unused_views(used_views),
|
94
104
|
used_views: used_views
|
95
105
|
}.to_json
|
96
106
|
end
|
@@ -113,17 +123,17 @@ module Coverband
|
|
113
123
|
|
114
124
|
filename = "#{@project_directory}/#{filename}"
|
115
125
|
redis_store.hdel(tracker_key, filename)
|
116
|
-
logged_views.delete(filename)
|
126
|
+
@logged_views.delete(filename)
|
117
127
|
end
|
118
128
|
|
119
129
|
def report_views_tracked
|
120
130
|
redis_store.set(tracker_time_key, Time.now.to_i) unless @one_time_timestamp || tracker_time_key_exists?
|
121
131
|
@one_time_timestamp = true
|
122
132
|
reported_time = Time.now.to_i
|
123
|
-
views_to_record.each do |file|
|
133
|
+
@views_to_record.each do |file|
|
124
134
|
redis_store.hset(tracker_key, file, reported_time)
|
125
135
|
end
|
126
|
-
|
136
|
+
@views_to_record.clear
|
127
137
|
rescue => e
|
128
138
|
# we don't want to raise errors if Coverband can't reach redis.
|
129
139
|
# This is a nice to have not a bring the system down
|
@@ -137,15 +147,12 @@ module Coverband
|
|
137
147
|
protected
|
138
148
|
|
139
149
|
def newly_seen_file?(file)
|
140
|
-
|
141
|
-
|
142
|
-
true
|
150
|
+
!@logged_views.include?(file)
|
143
151
|
end
|
144
152
|
|
145
153
|
def track_file?(file, options = {})
|
146
|
-
|
147
|
-
file.include?(pattern)
|
148
|
-
end && (file.start_with?(@project_directory) || options[:layout])
|
154
|
+
(file.start_with?(@project_directory) || options[:layout]) &&
|
155
|
+
@ignore_patterns.none? { |pattern| file.include?(pattern) }
|
149
156
|
end
|
150
157
|
|
151
158
|
private
|