Files
the-biergarten-app/docs/pipeline/diagrams/current/output/activity.svg
2026-06-21 21:58:03 -04:00

1 line
55 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="ACTIVITY" height="3008px" preserveAspectRatio="none" style="width:5015px;height:3008px;background:#FAFCF9;" version="1.1" viewBox="0 0 5015 3008" width="5015px" zoomAndPan="magnify"><?plantuml 1.2026.3?><defs/><g><rect fill="#FAFCF9" height="3008" style="stroke:none;stroke-width:1;" width="5015" x="0" y="0"/><g class="title" data-source-line="20"><text fill="#28342A" font-family="'Volkhov'" font-size="20" font-weight="700" lengthAdjust="spacing" textLength="642.86" x="2185.2407" y="39.42">The Biergarten Data Pipeline (Current &#8212; Synchronous Data Path)</text></g><rect fill="none" height="18.228" style="stroke:none;stroke-width:1;" width="4944.2034" x="20" y="64.64"/><rect fill="#F2F6F0" height="2922.676" style="stroke:#F2F6F0;stroke-width:1;" width="745.0757" x="20" y="64.64"/><ellipse cx="254.8274" cy="97.868" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="335.3924" x="87.1312" y="127.868"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="315.3924" x="97.1312" y="151.756">Create BoundedChannel&lt;LogEntry&gt; log_channel</text><path d="M378.2758,176.096 L378.2758,213.552 L358.2758,217.552 L378.2758,221.552 L378.2758,259.008 A0,0 0 0 0 378.2758,259.008 L721.3779,259.008 A0,0 0 0 0 721.3779,259.008 L721.3779,186.096 L711.3779,176.096 L378.2758,176.096 A0,0 0 0 0 378.2758,176.096" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M711.3779,176.096 L711.3779,186.096 L721.3779,186.096 L711.3779,176.096" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="290.791" x="384.2758" y="194.984">The only concurrency in the current pipeline:</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="279.6993" x="384.2758" y="213.212">a dedicated thread drains log_channel and</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="287.8688" x="384.2758" y="231.44">forwards entries to spdlog for the entire run.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="322.1021" x="384.2758" y="249.668">Joined during shutdown after log_channel closes.</text><rect fill="#FAFCF9" height="56.456" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="206.8969" x="151.379" y="189.324"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.8969" x="161.379" y="213.212">Spawn log dispatcher thread</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.4392" x="161.379" y="231.44">(LogDispatcher::Run())</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="200.4815" x="154.5866" y="279.008"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="180.4815" x="164.5866" y="302.896">ParseArguments(argc, argv)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="158.5409" x="175.5569" y="388.35"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.5409" x="185.5569" y="412.238">Log error / usage info</text><ellipse cx="254.8274" cy="463.964" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="254.8274" cy="463.964" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><polygon fill="#FAFCF9" points="186.2972,337.236,323.3575,337.236,335.3575,349.236,323.3575,361.236,186.2972,361.236,174.2972,349.236,186.2972,337.236" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="258.8274" y="375.124">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="137.0603" x="186.2972" y="354.01">Are arguments valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="335.3575" y="344.896">yes</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="329.3164" x="90.1692" y="516.964"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="309.3164" x="100.1692" y="540.852">Init OpenSSL global state &amp; LlamaBackendState</text><path d="M350.1234,565.192 L350.1234,593.534 L330.1234,597.534 L350.1234,601.534 L350.1234,629.876 A0,0 0 0 0 350.1234,629.876 L706.389,629.876 A0,0 0 0 0 706.389,629.876 L706.389,575.192 L696.389,565.192 L350.1234,565.192 A0,0 0 0 0 350.1234,565.192" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M696.389,565.192 L696.389,575.192 L706.389,575.192 L696.389,565.192" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="324.4892" x="356.1234" y="584.08">Binds ILogger, IEnrichmentService, DataGenerator,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="335.2655" x="356.1234" y="602.308">IExportService, IPromptFormatter, WebClient based</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="252.8225" x="356.1234" y="620.536">on --mocked vs. model-backed mode.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="150.5921" x="179.5313" y="578.42"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="130.5921" x="189.5313" y="602.308">di::make_injector(...)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="457.6548" x="26" y="649.876"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="437.6548" x="36" y="673.764">injector.create&lt;std::unique_ptr&lt;BiergartenPipelineOrchestrator&gt;&gt;()</text><path d="M406.0361,703.99 L406.0361,723.218 L386.0361,727.218 L406.0361,731.218 L406.0361,750.446 A0,0 0 0 0 406.0361,750.446 L760.0757,750.446 A0,0 0 0 0 760.0757,750.446 L760.0757,713.99 L750.0757,703.99 L406.0361,703.99 A0,0 0 0 0 406.0361,703.99" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M750.0757,703.99 L750.0757,713.99 L760.0757,713.99 L750.0757,703.99" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.0396" x="412.0361" y="722.878">Run() itself is synchronous &#8212; sampling, enrichment,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="314.5316" x="412.0361" y="741.106">generation, and export all happen on this thread.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="262.4174" x="123.6187" y="708.104"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="242.4174" x="133.6187" y="731.992">BiergartenPipelineOrchestrator::Run()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="139.4621" x="185.0963" y="2790.632"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="119.4621" x="195.0963" y="2814.52">Close log_channel</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="190.3838" x="159.6355" y="2848.86"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="170.3838" x="169.6355" y="2872.748">Join log dispatcher thread</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="76.287" x="216.6839" y="2907.088"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="56.287" x="226.6839" y="2930.976">Return 0</text><ellipse cx="254.8274" cy="2976.316" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="254.8274" cy="2976.316" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><line style="stroke:#547461;stroke-width:0.3;" x1="20" x2="20" y1="64.64" y2="2987.316"/><rect fill="#EAF0E8" height="2922.676" style="stroke:#EAF0E8;stroke-width:1;" width="875.186" x="765.0757" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="165.1697" x="1093.6321" y="770.446"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.1697" x="1103.6321" y="794.334">Initialize SQLite export</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="201.2686" x="1075.5826" y="998.042"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="181.2686" x="1085.5826" y="1021.93">QueryCitiesWithCountries()</text><polygon fill="#FAFCF9" points="1128.9773,1340.026,1223.4565,1340.026,1235.4565,1352.026,1223.4565,1364.026,1128.9773,1364.026,1116.9773,1352.026,1128.9773,1340.026" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="94.4791" x="1128.9773" y="1356.8">Lookup failed?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1094.2028" y="1347.686">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1235.4565" y="1347.686">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="158.7404" x="967.7944" y="1374.026"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.7404" x="977.7944" y="1397.914">Log warning, skip city</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="317.469" x="1146.5348" y="1374.026"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="297.469" x="1156.5348" y="1397.914">Store EnrichedCity{Location, region_context}</text><polygon fill="#FAFCF9" points="1176.2169,1418.254,1188.2169,1430.254,1176.2169,1442.254,1164.2169,1430.254,1176.2169,1418.254" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1084.5553,1172.726,1267.8785,1172.726,1279.8785,1184.726,1267.8785,1196.726,1084.5553,1196.726,1072.5553,1184.726,1084.5553,1172.726" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="1180.2169" y="1210.614">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.3233" x="1084.5553" y="1189.5">For each sampled Location?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="1038.6333" y="1180.386">Done</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="256.6633" x="1047.8853" y="1484.254"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.6633" x="1057.8853" y="1508.142">GenerateBreweries(enriched_cities)</text><polygon fill="#FAFCF9" points="1099.9325,2228.036,1252.5013,2228.036,1264.5013,2240.036,1252.5013,2252.036,1099.9325,2252.036,1087.9325,2240.036,1099.9325,2228.036" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.5688" x="1099.9325" y="2244.81">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1065.158" y="2235.696">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1264.5013" y="2235.696">no</text><path d="M1029.6372,2561.834 L1029.6372,2581.062 L1009.6372,2585.062 L1029.6372,2589.062 L1029.6372,2608.29 A0,0 0 0 0 1029.6372,2608.29 L1274.893,2608.29 A0,0 0 0 0 1274.893,2608.29 L1274.893,2571.834 L1264.893,2561.834 L1029.6372,2561.834 A0,0 0 0 0 1029.6372,2561.834" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1264.893,2561.834 L1264.893,2571.834 L1274.893,2571.834 L1264.893,2561.834" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="224.2558" x="1035.6372" y="2580.722">Data loss is prevented per-record.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.7788" x="1035.6372" y="2598.95">The pipeline continues running.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="238.5615" x="771.0757" y="2565.948"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="218.5615" x="781.0757" y="2589.836">Log warning "SQLite export failed"</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="290.3687" x="1316.893" y="2272.036"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="270.3687" x="1326.893" y="2295.924">Log warning "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="1176.2169,2662.29,1188.2169,2674.29,1176.2169,2686.29,1164.2169,2674.29,1176.2169,2662.29" style="stroke:#628A5B;stroke-width:0.5;"/><line style="stroke:#547461;stroke-width:0.3;" x1="765.0757" x2="765.0757" y1="64.64" y2="2987.316"/><rect fill="#E0EAE0" height="2922.676" style="stroke:#E0EAE0;stroke-width:1;" width="950.6377" x="1640.2617" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="353.7568" x="1915.9881" y="828.674"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.7568" x="1925.9881" y="852.562">GetUtcTimestamp() from SystemDateTimeProvider</text><path d="M2154.0586,876.902 L2154.0586,923.472 L2134.0586,927.472 L2154.0586,931.472 L2154.0586,978.042 A0,0 0 0 0 2154.0586,978.042 L2585.8994,978.042 A0,0 0 0 0 2585.8994,978.042 L2585.8994,886.902 L2575.8994,876.902 L2154.0586,876.902 A0,0 0 0 0 2154.0586,876.902" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2575.8994,876.902 L2575.8994,886.902 L2585.8994,886.902 L2575.8994,876.902" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="410.8409" x="2160.0586" y="895.79">Builds a fresh biergarten_seed_&lt;UTC datetime&gt;.sqlite filename</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="370.0484" x="2160.0586" y="914.018">Appends a numeric suffix if the timestamp already exists</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.689" x="2160.0586" y="932.246">Opens DB Connection</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.6175" x="2160.0586" y="950.474">Executes Schema DDL</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.8503" x="2160.0586" y="968.702">Begins Transaction</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="82.3841" x="2051.6745" y="908.358"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="62.3841" x="2061.6745" y="932.246">Initialize()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="251.3364" x="1681.3379" y="2272.036"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="231.3364" x="1691.3379" y="2295.924">ProcessRecord(GeneratedBrewery)</text><polygon fill="#FAFCF9" points="1745.8767,2330.264,1868.1354,2330.264,1880.1354,2342.264,1868.1354,2354.264,1745.8767,2354.264,1733.8767,2342.264,1745.8767,2330.264" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.2587" x="1745.8767" y="2347.038">Location in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1711.1022" y="2337.924">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1880.1354" y="2337.924">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="136.6096" x="1646.2617" y="2364.264"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="116.6096" x="1656.2617" y="2388.152">Reuse location_id</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="193.1487" x="1802.8713" y="2364.264"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.1487" x="1812.8713" y="2388.152">Insert Location &amp; Cache ID</text><polygon fill="#FAFCF9" points="1807.0061,2408.492,1819.0061,2420.492,1807.0061,2432.492,1795.0061,2420.492,1807.0061,2408.492" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="223.8088" x="1695.1016" y="2452.492"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="203.8088" x="1705.1016" y="2476.38">Insert Brewery (FK: location_id)</text><polygon fill="#FAFCF9" points="1703.7804,2510.72,1910.2318,2510.72,1922.2318,2522.72,1910.2318,2534.72,1703.7804,2534.72,1691.7804,2522.72,1703.7804,2510.72" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1811.0061" y="2548.608">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="206.4514" x="1703.7804" y="2527.494">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1922.2318" y="2518.38">no</text><polygon fill="#FAFCF9" points="1807.0061,2628.29,1819.0061,2640.29,1807.0061,2652.29,1795.0061,2640.29,1807.0061,2628.29" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M2151.7521,2724.176 L2151.7521,2743.404 L2131.7521,2747.404 L2151.7521,2751.404 L2151.7521,2770.632 A0,0 0 0 0 2151.7521,2770.632 L2360.9577,2770.632 A0,0 0 0 0 2360.9577,2770.632 L2360.9577,2734.176 L2350.9577,2724.176 L2151.7521,2724.176 A0,0 0 0 0 2151.7521,2724.176" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2350.9577,2724.176 L2350.9577,2734.176 L2360.9577,2734.176 L2350.9577,2724.176" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.3947" x="2157.7521" y="2743.064">Commits Transaction</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.2056" x="2157.7521" y="2761.292">Closes Database Connection</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="77.7711" x="2053.981" y="2728.29"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="57.7711" x="2063.981" y="2752.178">Finalize()</text><line style="stroke:#547461;stroke-width:0.3;" x1="1640.2617" x2="1640.2617" y1="64.64" y2="2987.316"/><rect fill="#E2EBDC" height="2922.676" style="stroke:#E2EBDC;stroke-width:1;" width="614.2944" x="2590.8994" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="304.169" x="2622.3374" y="1056.27"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.169" x="2632.3374" y="1080.158">JsonLoader::LoadLocations("locations.json")</text><path d="M2971.9445,1119.498 L2971.9445,1129.612 L2951.9445,1133.612 L2971.9445,1137.612 L2971.9445,1147.726 A0,0 0 0 0 2971.9445,1147.726 L3200.1938,1147.726 A0,0 0 0 0 3200.1938,1147.726 L3200.1938,1129.498 L3190.1938,1119.498 L2971.9445,1119.498 A0,0 0 0 0 2971.9445,1119.498" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3190.1938,1119.498 L3190.1938,1129.498 L3200.1938,1129.498 L3190.1938,1119.498" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="207.2494" x="2977.9445" y="1138.386">--location-count defaults to 10.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="355.045" x="2596.8994" y="1114.498"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="335.045" x="2606.8994" y="1138.386">std::ranges::sample(all_locations, --location-count)</text><line style="stroke:#547461;stroke-width:0.3;" x1="2590.8994" x2="2590.8994" y1="64.64" y2="2987.316"/><rect fill="#DCE8D8" height="2922.676" style="stroke:#DCE8D8;stroke-width:1;" width="611.4314" x="3205.1938" y="64.64"/><path d="M3413.8321,1222.114 L3413.8321,1259.57 L3393.8321,1263.57 L3413.8321,1267.57 L3413.8321,1305.026 A0,0 0 0 0 3413.8321,1305.026 L3811.6252,1305.026 A0,0 0 0 0 3811.6252,1305.026 L3811.6252,1232.114 L3801.6252,1222.114 L3413.8321,1222.114 A0,0 0 0 0 3413.8321,1222.114" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3801.6252,1222.114 L3801.6252,1232.114 L3811.6252,1232.114 L3801.6252,1222.114" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="302.502" x="3419.8321" y="1241.002">WikipediaEnrichmentService fetches a generic</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="323.5059" x="3419.8321" y="1259.23">"brewing" extract and a "beer in {country}" extract</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="376.7932" x="3419.8321" y="1277.458">(not a city/region-specific page). MockEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="289.6849" x="3419.8321" y="1295.686">(--mocked) returns an empty string instead.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="182.6382" x="3211.1938" y="1244.456"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="162.6382" x="3221.1938" y="1268.344">GetLocationContext(loc)</text><line style="stroke:#547461;stroke-width:0.3;" x1="3205.1938" x2="3205.1938" y1="64.64" y2="2987.316"/><rect fill="#E5EDE1" height="2922.676" style="stroke:#E5EDE1;stroke-width:1;" width="1146.7161" x="3816.6252" y="64.64"/><polygon fill="#FAFCF9" points="4089.7168,1601.87,4196.5789,1601.87,4208.5789,1613.87,4196.5789,1625.87,4089.7168,1625.87,4077.7168,1613.87,4089.7168,1601.87" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="106.8621" x="4089.7168" y="1618.644">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="3976.2481" y="1609.53">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="4208.5789" y="1609.53">LlamaGenerator</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="203.7782" x="3849.6252" y="1635.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.7782" x="3859.6252" y="1659.758">DeterministicHash &amp; Format</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="166.7972" x="4251.3827" y="1635.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="146.7972" x="4261.3827" y="1659.758">PrepareRegionContext</text><path d="M4540.0701,1699.098 L4540.0701,1709.212 L4520.0701,1713.212 L4540.0701,1717.212 L4540.0701,1727.326 A0,0 0 0 0 4540.0701,1727.326 L4958.3414,1727.326 A0,0 0 0 0 4958.3414,1727.326 L4958.3414,1709.098 L4948.3414,1699.098 L4540.0701,1699.098 A0,0 0 0 0 4540.0701,1699.098" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4948.3414,1699.098 L4948.3414,1709.098 L4958.3414,1709.098 L4948.3414,1699.098" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="397.2713" x="4546.0701" y="1717.986">Resolves to BREWERY_GENERATION.md inside --prompt-dir.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="370.5777" x="4149.4924" y="1694.098"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="350.5777" x="4159.4924" y="1717.986">prompt_directory_-&gt;Load("BREWERY_GENERATION")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="502.7556" x="4083.4035" y="1796.326"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="482.7556" x="4093.4035" y="1820.214">Infer(system_prompt, user_prompt, max_tokens, kBreweryJsonGrammar)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="250.5106" x="4209.526" y="1854.554"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="230.5106" x="4219.526" y="1878.442">ValidateBreweryJson(raw, brewery)</text><path d="M4393.2578,1902.782 L4393.2578,1949.238 L4652.7306,1949.238 L4652.7306,1912.782 L4642.7306,1902.782 L4393.2578,1902.782" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4642.7306,1902.782 L4642.7306,1912.782 L4652.7306,1912.782 L4642.7306,1902.782" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="238.4728" x="4399.2578" y="1921.67">max_tokens is fixed across retries &#8212;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.1969" x="4399.2578" y="1939.898">it is not raised on truncation.</text><polygon fill="#FAFCF9" points="4288.3047,1949.238,4381.2578,1949.238,4393.2578,1961.238,4381.2578,1973.238,4288.3047,1973.238,4276.3047,1961.238,4288.3047,1949.238" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.9531" x="4288.3047" y="1966.012">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4253.5302" y="1956.898">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="4393.2578" y="1956.898">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="90.3536" x="4376.9561" y="1983.238"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="4386.9561" y="2007.126">Attempt++</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="279.4065" x="4282.4296" y="2041.466"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="259.4065" x="4292.4296" y="2065.354">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="4334.7813,1752.326,4346.7813,1764.326,4334.7813,1776.326,4322.7813,1764.326,4334.7813,1752.326" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4291.9325,2110.036,4377.6301,2110.036,4389.6301,2122.036,4377.6301,2134.036,4291.9325,2134.036,4279.9325,2122.036,4291.9325,2110.036" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="85.6976" x="4291.9325" y="2126.81">Attempt &lt; 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4389.6301" y="2117.696">yes</text><polygon fill="#FAFCF9" points="4334.7813,2154.036,4346.7813,2166.036,4334.7813,2178.036,4322.7813,2166.036,4334.7813,2154.036" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4143.1478,2184.036,4155.1478,2196.036,4143.1478,2208.036,4131.1478,2196.036,4143.1478,2184.036" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4067.5004,1542.482,4218.7952,1542.482,4230.7952,1554.482,4218.7952,1566.482,4067.5004,1566.482,4055.5004,1554.482,4067.5004,1542.482" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="4147.1478" y="1580.37">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.2948" x="4067.5004" y="1559.256">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="4021.5785" y="1550.142">Done</text><line style="stroke:#547461;stroke-width:0.3;" x1="3816.6252" x2="3816.6252" y1="64.64" y2="2987.316"/><line style="stroke:#547461;stroke-width:0.3;" x1="4963.3414" x2="4963.3414" y1="64.64" y2="2987.316"/><polygon fill="#628A5B" points="4976.3414,2099.694,4980.3414,2089.694,4984.3414,2099.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="107.868" y2="127.868"/><polygon fill="#628A5B" points="250.8274,117.868,258.8274,117.868,254.8274,127.868" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="166.096" y2="189.324"/><polygon fill="#628A5B" points="250.8274,179.324,258.8274,179.324,254.8274,189.324" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="245.78" y2="279.008"/><polygon fill="#628A5B" points="250.8274,269.008,258.8274,269.008,254.8274,279.008" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="426.578" y2="452.964"/><polygon fill="#628A5B" points="250.8274,442.964,258.8274,442.964,254.8274,452.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="361.236" y2="388.35"/><polygon fill="#628A5B" points="250.8274,378.35,258.8274,378.35,254.8274,388.35" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="335.3575" x2="347.3575" y1="349.236" y2="349.236"/><polygon fill="#628A5B" points="343.3575,422.964,351.3575,422.964,347.3575,432.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="347.3575" x2="347.3575" y1="349.236" y2="496.964"/><line style="stroke:#628A5B;stroke-width:1;" x1="347.3575" x2="254.8274" y1="496.964" y2="496.964"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="496.964" y2="516.964"/><polygon fill="#628A5B" points="250.8274,506.964,258.8274,506.964,254.8274,516.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="317.236" y2="337.236"/><polygon fill="#628A5B" points="250.8274,327.236,258.8274,327.236,254.8274,337.236" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="555.192" y2="578.42"/><polygon fill="#628A5B" points="250.8274,568.42,258.8274,568.42,254.8274,578.42" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="616.648" y2="649.876"/><polygon fill="#628A5B" points="250.8274,639.876,258.8274,639.876,254.8274,649.876" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="688.104" y2="708.104"/><polygon fill="#628A5B" points="250.8274,698.104,258.8274,698.104,254.8274,708.104" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="2828.86" y2="2848.86"/><polygon fill="#628A5B" points="250.8274,2838.86,258.8274,2838.86,254.8274,2848.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="2887.088" y2="2907.088"/><polygon fill="#628A5B" points="250.8274,2897.088,258.8274,2897.088,254.8274,2907.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="2945.316" y2="2965.316"/><polygon fill="#628A5B" points="250.8274,2955.316,258.8274,2955.316,254.8274,2965.316" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1116.9773" x2="1047.1646" y1="1352.026" y2="1352.026"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.1646" x2="1047.1646" y1="1352.026" y2="1374.026"/><polygon fill="#628A5B" points="1043.1646,1364.026,1051.1646,1364.026,1047.1646,1374.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1235.4565" x2="1305.2693" y1="1352.026" y2="1352.026"/><line style="stroke:#628A5B;stroke-width:1;" x1="1305.2693" x2="1305.2693" y1="1352.026" y2="1374.026"/><polygon fill="#628A5B" points="1301.2693,1364.026,1309.2693,1364.026,1305.2693,1374.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.1646" x2="1047.1646" y1="1412.254" y2="1430.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.1646" x2="1164.2169" y1="1430.254" y2="1430.254"/><polygon fill="#628A5B" points="1154.2169,1426.254,1164.2169,1430.254,1154.2169,1434.254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1305.2693" x2="1305.2693" y1="1412.254" y2="1430.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1305.2693" x2="1188.2169" y1="1430.254" y2="1430.254"/><polygon fill="#628A5B" points="1198.2169,1426.254,1188.2169,1430.254,1198.2169,1434.254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1442.254" y2="1452.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1621.2617" y1="1452.254" y2="1452.254"/><polygon fill="#628A5B" points="1617.2617,1321.07,1621.2617,1311.07,1625.2617,1321.07" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1621.2617" x2="1621.2617" y1="1184.726" y2="1452.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1621.2617" x2="1279.8785" y1="1184.726" y2="1184.726"/><polygon fill="#628A5B" points="1289.8785,1180.726,1279.8785,1184.726,1289.8785,1188.726" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1072.5553" x2="945.7944" y1="1184.726" y2="1184.726"/><polygon fill="#628A5B" points="941.7944,1307.07,949.7944,1307.07,945.7944,1317.07" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="945.7944" x2="945.7944" y1="1184.726" y2="1464.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="945.7944" x2="1176.2169" y1="1464.254" y2="1464.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1464.254" y2="1484.254"/><polygon fill="#628A5B" points="1172.2169,1474.254,1180.2169,1474.254,1176.2169,1484.254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1264.5013" x2="1462.0774" y1="2240.036" y2="2240.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="1462.0774" x2="1462.0774" y1="2240.036" y2="2272.036"/><polygon fill="#628A5B" points="1458.0774,2262.036,1466.0774,2262.036,1462.0774,2272.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1462.0774" x2="1462.0774" y1="2310.264" y2="2674.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1462.0774" x2="1188.2169" y1="2674.29" y2="2674.29"/><polygon fill="#628A5B" points="1198.2169,2670.29,1188.2169,2674.29,1198.2169,2678.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="2092.8665" y1="866.902" y2="908.358"/><polygon fill="#628A5B" points="2088.8665,898.358,2096.8665,898.358,2092.8665,908.358" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1733.8767" x2="1714.5665" y1="2342.264" y2="2342.264"/><line style="stroke:#628A5B;stroke-width:1;" x1="1714.5665" x2="1714.5665" y1="2342.264" y2="2364.264"/><polygon fill="#628A5B" points="1710.5665,2354.264,1718.5665,2354.264,1714.5665,2364.264" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1880.1354" x2="1899.4456" y1="2342.264" y2="2342.264"/><line style="stroke:#628A5B;stroke-width:1;" x1="1899.4456" x2="1899.4456" y1="2342.264" y2="2364.264"/><polygon fill="#628A5B" points="1895.4456,2354.264,1903.4456,2354.264,1899.4456,2364.264" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1714.5665" x2="1714.5665" y1="2402.492" y2="2420.492"/><line style="stroke:#628A5B;stroke-width:1;" x1="1714.5665" x2="1795.0061" y1="2420.492" y2="2420.492"/><polygon fill="#628A5B" points="1785.0061,2416.492,1795.0061,2420.492,1785.0061,2424.492" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1899.4456" x2="1899.4456" y1="2402.492" y2="2420.492"/><line style="stroke:#628A5B;stroke-width:1;" x1="1899.4456" x2="1819.0061" y1="2420.492" y2="2420.492"/><polygon fill="#628A5B" points="1829.0061,2416.492,1819.0061,2420.492,1829.0061,2424.492" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2310.264" y2="2330.264"/><polygon fill="#628A5B" points="1803.0061,2320.264,1811.0061,2320.264,1807.0061,2330.264" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2432.492" y2="2452.492"/><polygon fill="#628A5B" points="1803.0061,2442.492,1811.0061,2442.492,1807.0061,2452.492" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1922.2318" x2="2201.5426" y1="2522.72" y2="2522.72"/><polygon fill="#628A5B" points="2197.5426,2575.062,2205.5426,2575.062,2201.5426,2585.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2201.5426" x2="2201.5426" y1="2522.72" y2="2640.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="2201.5426" x2="1819.0061" y1="2640.29" y2="2640.29"/><polygon fill="#628A5B" points="1829.0061,2636.29,1819.0061,2640.29,1829.0061,2644.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2490.72" y2="2510.72"/><polygon fill="#628A5B" points="1803.0061,2500.72,1811.0061,2500.72,1807.0061,2510.72" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.422" x2="2774.422" y1="1094.498" y2="1114.498"/><polygon fill="#628A5B" points="2770.422,1104.498,2778.422,1104.498,2774.422,1114.498" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="1674.098" y2="1694.098"/><polygon fill="#628A5B" points="4330.7813,1684.098,4338.7813,1684.098,4334.7813,1694.098" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="1834.554" y2="1854.554"/><polygon fill="#628A5B" points="4330.7813,1844.554,4338.7813,1844.554,4334.7813,1854.554" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4422.1329" x2="4422.1329" y1="2021.466" y2="2041.466"/><polygon fill="#628A5B" points="4418.1329,2031.466,4426.1329,2031.466,4422.1329,2041.466" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4276.3047" x2="4247.4296" y1="1961.238" y2="1961.238"/><line style="stroke:#628A5B;stroke-width:1;" x1="4247.4296" x2="4247.4296" y1="1961.238" y2="2166.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="4247.4296" x2="4322.7813" y1="2166.036" y2="2166.036"/><polygon fill="#628A5B" points="4312.7813,2162.036,4322.7813,2166.036,4312.7813,2170.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4393.2578" x2="4422.1329" y1="1961.238" y2="1961.238"/><line style="stroke:#628A5B;stroke-width:1;" x1="4422.1329" x2="4422.1329" y1="1961.238" y2="1983.238"/><polygon fill="#628A5B" points="4418.1329,1973.238,4426.1329,1973.238,4422.1329,1983.238" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4422.1329" x2="4422.1329" y1="2079.694" y2="2084.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="4422.1329" x2="4334.7813" y1="2084.694" y2="2084.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="2084.694" y2="2110.036"/><polygon fill="#628A5B" points="4330.7813,2100.036,4338.7813,2100.036,4334.7813,2110.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="1892.782" y2="1949.238"/><polygon fill="#628A5B" points="4330.7813,1939.238,4338.7813,1939.238,4334.7813,1949.238" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="1776.326" y2="1796.326"/><polygon fill="#628A5B" points="4330.7813,1786.326,4338.7813,1786.326,4334.7813,1796.326" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4389.6301" x2="4664.7306" y1="2122.036" y2="2122.036"/><polygon fill="#628A5B" points="4660.7306,1938.51,4664.7306,1928.51,4668.7306,1938.51" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4664.7306" x2="4664.7306" y1="1764.326" y2="2122.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="4664.7306" x2="4346.7813" y1="1764.326" y2="1764.326"/><polygon fill="#628A5B" points="4356.7813,1760.326,4346.7813,1764.326,4356.7813,1768.326" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="2134.036" y2="2154.036"/><polygon fill="#628A5B" points="4330.7813,2144.036,4338.7813,2144.036,4334.7813,2154.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="1732.326" y2="1752.326"/><polygon fill="#628A5B" points="4330.7813,1742.326,4338.7813,1742.326,4334.7813,1752.326" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4077.7168" x2="3951.5144" y1="1613.87" y2="1613.87"/><line style="stroke:#628A5B;stroke-width:1;" x1="3951.5144" x2="3951.5144" y1="1613.87" y2="1635.87"/><polygon fill="#628A5B" points="3947.5144,1625.87,3955.5144,1625.87,3951.5144,1635.87" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4208.5789" x2="4334.7813" y1="1613.87" y2="1613.87"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="1613.87" y2="1635.87"/><polygon fill="#628A5B" points="4330.7813,1625.87,4338.7813,1625.87,4334.7813,1635.87" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3951.5144" x2="3951.5144" y1="1674.098" y2="2196.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="3951.5144" x2="4131.1478" y1="2196.036" y2="2196.036"/><polygon fill="#628A5B" points="4121.1478,2192.036,4131.1478,2196.036,4121.1478,2200.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4334.7813" y1="2178.036" y2="2196.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="4334.7813" x2="4155.1478" y1="2196.036" y2="2196.036"/><polygon fill="#628A5B" points="4165.1478,2192.036,4155.1478,2196.036,4165.1478,2200.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4143.1478" x2="4143.1478" y1="1566.482" y2="1601.87"/><polygon fill="#628A5B" points="4139.1478,1591.87,4147.1478,1591.87,4143.1478,1601.87" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4055.5004" x2="3835.6252" y1="1554.482" y2="1554.482"/><polygon fill="#628A5B" points="3831.6252,2101.4725,3839.6252,2101.4725,3835.6252,2111.4725" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3835.6252" x2="3835.6252" y1="1554.482" y2="2713.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="3835.6252" x2="2092.8665" y1="2713.29" y2="2713.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="2092.8665" y1="2713.29" y2="2728.29"/><polygon fill="#628A5B" points="2088.8665,2718.29,2096.8665,2718.29,2092.8665,2728.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="746.332" y2="755.446"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="1176.2169" y1="755.446" y2="755.446"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="755.446" y2="770.446"/><polygon fill="#628A5B" points="1172.2169,760.446,1180.2169,760.446,1176.2169,770.446" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="808.674" y2="813.674"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="2092.8665" y1="813.674" y2="813.674"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="2092.8665" y1="813.674" y2="828.674"/><polygon fill="#628A5B" points="2088.8665,818.674,2096.8665,818.674,2092.8665,828.674" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="2092.8665" y1="946.586" y2="979.814"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="1176.2169" y1="979.814" y2="979.814"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="979.814" y2="998.042"/><polygon fill="#628A5B" points="1172.2169,988.042,1180.2169,988.042,1176.2169,998.042" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1036.27" y2="1041.27"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="2774.422" y1="1041.27" y2="1041.27"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.422" x2="2774.422" y1="1041.27" y2="1056.27"/><polygon fill="#628A5B" points="2770.422,1046.27,2778.422,1046.27,2774.422,1056.27" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3302.5129" x2="3302.5129" y1="1282.684" y2="1311.355"/><line style="stroke:#628A5B;stroke-width:1;" x1="3302.5129" x2="1176.2169" y1="1311.355" y2="1311.355"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1311.355" y2="1340.026"/><polygon fill="#628A5B" points="1172.2169,1330.026,1180.2169,1330.026,1176.2169,1340.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1196.726" y2="1217.114"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="3302.5129" y1="1217.114" y2="1217.114"/><line style="stroke:#628A5B;stroke-width:1;" x1="3302.5129" x2="3302.5129" y1="1217.114" y2="1244.456"/><polygon fill="#628A5B" points="3298.5129,1234.456,3306.5129,1234.456,3302.5129,1244.456" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.422" x2="2774.422" y1="1152.726" y2="1157.726"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.422" x2="1176.2169" y1="1157.726" y2="1157.726"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1157.726" y2="1172.726"/><polygon fill="#628A5B" points="1172.2169,1162.726,1180.2169,1162.726,1176.2169,1172.726" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2534.72" y2="2550.334"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="890.3565" y1="2550.334" y2="2550.334"/><line style="stroke:#628A5B;stroke-width:1;" x1="890.3565" x2="890.3565" y1="2550.334" y2="2565.948"/><polygon fill="#628A5B" points="886.3565,2555.948,894.3565,2555.948,890.3565,2565.948" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="890.3565" x2="890.3565" y1="2604.176" y2="2613.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="890.3565" x2="1807.0061" y1="2613.29" y2="2613.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2613.29" y2="2628.29"/><polygon fill="#628A5B" points="1803.0061,2618.29,1811.0061,2618.29,1807.0061,2628.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1087.9325" x2="1075.9325" y1="2240.036" y2="2240.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="1075.9325" x2="1075.9325" y1="2240.036" y2="2258.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="1075.9325" x2="1807.0061" y1="2258.036" y2="2258.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2258.036" y2="2272.036"/><polygon fill="#628A5B" points="1803.0061,2262.036,1811.0061,2262.036,1807.0061,2272.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1807.0061" y1="2652.29" y2="2656.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1807.0061" x2="1146.2169" y1="2656.29" y2="2656.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1146.2169" x2="1146.2169" y1="2656.29" y2="2674.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1146.2169" x2="1164.2169" y1="2674.29" y2="2674.29"/><polygon fill="#628A5B" points="1154.2169,2670.29,1164.2169,2674.29,1154.2169,2678.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4143.1478" x2="4143.1478" y1="2208.036" y2="2213.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="4143.1478" x2="1176.2169" y1="2213.036" y2="2213.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="2213.036" y2="2228.036"/><polygon fill="#628A5B" points="1172.2169,2218.036,1180.2169,2218.036,1176.2169,2228.036" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="2686.29" y2="2696.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="4980.3414" y1="2696.29" y2="2696.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="4980.3414" x2="4980.3414" y1="1554.482" y2="2696.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="4980.3414" x2="4230.7952" y1="1554.482" y2="1554.482"/><polygon fill="#628A5B" points="4240.7952,1550.482,4230.7952,1554.482,4240.7952,1558.482" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1522.482" y2="1527.482"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="4143.1478" y1="1527.482" y2="1527.482"/><line style="stroke:#628A5B;stroke-width:1;" x1="4143.1478" x2="4143.1478" y1="1527.482" y2="1542.482"/><polygon fill="#628A5B" points="4139.1478,1532.482,4147.1478,1532.482,4143.1478,1542.482" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="2092.8665" y1="2766.518" y2="2775.632"/><line style="stroke:#628A5B;stroke-width:1;" x1="2092.8665" x2="254.8274" y1="2775.632" y2="2775.632"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="2775.632" y2="2790.632"/><polygon fill="#628A5B" points="250.8274,2780.632,258.8274,2780.632,254.8274,2790.632" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="50.26" x="367.4078" y="78.528">main.cc</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.9644" x="1101.6865" y="78.528">BiergartenPipelineOrchestrator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3512" x="2051.905" y="78.528">SqliteExportService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="2860.2536" y="78.528">JsonLoader</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="125.6712" x="3448.0739" y="78.528">IEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="96.6737" x="4341.6465" y="78.528">DataGenerator</text><?plantuml-src dLVRRYCt4dtNLnGqG20XikBnNDOh6RFGpLxFEfw9vSnWWGK4khiaCUucEoJRjX85o4Vi5-wNx26xM_SuCva7ZPii5gjEdRhGtakL2IDIicwHC7wDZ5oU9ZMxsebvAlB4dMlbhaNAL1z-JsEXRFsmp5Z-mlJozSQcaoxXzV5FEhcVwuVw8Obm-EHuO-jEHFSpetCL3tIY3RquxvqFplz--EvIvEJqrUkJtY7zVoJGCqO_bfjlJqvxR_eRczVQSN_NZ57l_7XqkYkbJSocb7Zp-c-ltxxSl2Hoya6wHVzFNLf9Vf6-eHIfLl6NgwqER6hVytfjxH-AZ1zbcWZr9svlIztEPNIls5ewRh-grK9aw7REr9TiPi8uLZGKJj17cN4Y5LDZa1l3oj7_VlylZHSgcXkjT6vBCU7cpLfj-UByvFpj-V4o5LAresXPimxAQfs1OU6WtUF2yM0kbEBax4hFHigPnJjAz6mI5QlTMcUSYKVbroYMDXCkchCXDuUE-3-gWLF3rNAdSvEhHhFPhIb4deoSpLsDWYjQ9GkAj8g2uT62f88IfgXq92jTwq1UWB-nZ61ZN5v4iO4FTjCo4Yg6x5IRHs5YIr1Y95joccmMUtEn5Qx0ZZIm9bTj77YlSGiKvaQg6Tbvxc8D_yJKmQrD_L6YBTjsZLLCtfrQvwCmbdjcbgTGQHl2pA8MuVS13iifDNguHLJRz20I6V-ZwKrGr52wYSixW8iOYMNeEygjc35mcEekjgpJMOqJY-0ks3RzjN9QgtKkbNJq8MCr7b_HBD5t8e6iZzytT9M8L7YEGtZirn2kM7OwgRZdYLG_SUIqQRJRxTs8zAK2P9UmPiQcHPSZXHetztQFsJp8Y5k1IHUis0ZeQE7CvUWfqsOjSFdHw3H3ZJ6fSCwh-SntWqJwQDu9opuwMj7HKQfXO4mFjasfZZavylKB2_vZ4zxAu7OK-7bcNTpfv4h-dFCaS-PidGrL7dmmO1tgipVntRi6lEmyBrGIT0UDi4RIMKwc92tPZOJo2MP5ca7Jh0KgLJXvH6O5F5AhbcSZSG28H9BGN6G8cVVVpQ6nOF66iqZEebekdpTuMH10Wale0kCVhYJiBkxf1YN7ezxeU3d-ES76Le1myeBTZowwbIcqmGNuE4N8K2-iunJnPR-5A3v85A7kvarx4FLpcO0n0XhOpkbkPVJ4CiUJinzl1nH3euF6TsqRpA6fJ5YXl-5ypyCH52Ya1q0acq-dyecGDpv7NMKaqFDGBU2ajCxYgES-2bkV1Xfv6NcuiJfwuYXtoFSnm4e53OTNtaoU-J9nQz2BHI7wLo3_8MUp600Cjf-bcmzGA4DnyR1uDIUZ_d2mV6-rkj82sE78-gFJyVzVwIWmmpRgIVLd-oS8rJrB0xLXv8njfnFenGtGPh8IRI5lge-ZoD-_6v7T_QhdXmhuylWlSUrnZeXH0obDBA9vGNnaQkKCgXd8tBXXtr5y-Om2HhwoBLyC1wFJuUbolvOiVU435oijYAFZ9zU0_KrV-RRS8leixs5SBCMU8fgoRpEUHI7rP1GErEyCFyAQEZW3Jo8Nab5WdL7IqMT-3G2PnMyhYN0EDHcYteV5TmR40P8suqXEmSuCfRdPfkzHklRCA0vNTQr9Xbrkm3gXY54G5s5Y13XWeWjPJxIAXGVg2uD1FZVGN_Lzdj5K83BhRh8eG2yR2XgW2kK90qOM_F6m5hsaw3iG74CfK-4CcZw4Vgq2qgB2_KbKHEQtRc4o-Wz-Ir8CjUBcroHHsJouZ-Xmo1ukBv-Kj2cIwSreE7gvt6et-qpSjFiP5dh4LbeGlPWhn7maLpib94D6sqgXmpeP_LEWhdr3HJjRunTQxEx1ZuOnn_5DGAsaSxVOoa9JdCIOE7mlMqoEtlboqAZtRqQVHpV_dboChaStlTlB3zVrPd5cX__eHsnryb3CCll7scdigOMQZHfGN7U4wzhXy0RH257Dq4XBfQZkKpOD6uh_f3ZNmWp2PlMHYgU9qnWcK7xkYx0jV5sxmCYQ2bEQ2rMV_6Yp2csGQHZnsAAxOc4bwUDnQUdz-CCrVTgQXrOCzlzmJDoNNzkq3TVrC5x0m6-_xMwiXOPI35c1nELO1SYGZsP1XLFLYOBDQr2e95YfcixeLKchbM5xOLd3umNHl50PHMGqvdP_fHy-CIrKdZilv2iC9bSCGs4Km0XQPDnUiCffxwlBmyLg1453ZIAy8QPviW_oyuD2oMdjZzzmX3T9fPVZ_bP4YufK-E0hQuJSv4CnxTmmg4LLYvh8k52m6rsm4Wnqgmw331nudNGvxDQs0rU9bXQXEFohitc1BoULZQEdYBEWBn8v8bYD-pAeE6JmL-2-MtUflZMNbRMwNb5lZqTKlD8IJnnm93FyWEO2YcHiZap0lxqIzM-dwctatqzEgXn40vFyrUqrlTTflurn1U1EEzYoVuD5XV55Aydy3UrsVTqE0au72_QXHl7SR7ekrU59Sw3J5AFurWo7rV0O2y3vjyNcBBWvv-m-U3lXtCw3rhy03xzdiNaJcZaTTslXGVP_?></g></svg>