Files
the-biergarten-app/pipeline/diagrams/future_possible_architecture.svg
Aaron Po 915301fccb add svgs
2026-04-20 16:53:35 -04:00

1 line
156 KiB
XML

<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="CLASS" height="1930px" preserveAspectRatio="none" style="width:8359px;height:1930px;background:#FAFCF9;" version="1.1" viewBox="0 0 8359 1930" width="8359px" zoomAndPan="magnify"><title>The Biergarten Data Pipeline &#8212; Architecture</title><defs/><g><rect fill="#FAFCF9" height="1930" style="stroke:none;stroke-width:1;" width="8359" x="0" y="0"/><g class="title" data-source-line="31"><text fill="#28342A" font-family="'Volkhov'" font-size="20" font-weight="bold" lengthAdjust="spacing" textLength="440.6" x="3952.2" y="29.42">The Biergarten Data Pipeline &#8212; Architecture</text></g><!--cluster Domain: Value Objects & Contracts--><g class="cluster" data-qualified-name="Domain. Value Objects . Contracts" data-source-line="36" id="ent0002"><polygon fill="#F2F6F0" points="16,176.13,264.7044,176.13,271.7044,200.358,2375,200.358,2375,852.94,16,852.94,16,176.13" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="16" x2="271.7044" y1="200.358" y2="200.358"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="242.7044" x="20" y="192.018">Domain: Value Objects &amp; Contracts</text></g><!--cluster Domain Policy--><g class="cluster" data-qualified-name="Domain Policy" data-source-line="172" id="ent0026"><polygon fill="#F2F6F0" points="5691,1482.87,5794.233,1482.87,5801.233,1507.098,8342,1507.098,8342,1923.06,5691,1923.06,5691,1482.87" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="5691" x2="5801.233" y1="1507.098" y2="1507.098"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="97.233" x="5695" y="1498.758">Domain Policy</text></g><!--cluster Infrastructure: Enrichment--><g class="cluster" data-qualified-name="Infrastructure. Enrichment" data-source-line="246" id="ent0045"><polygon fill="#F2F6F0" points="4904,655.46,5093.3914,655.46,5100.3914,679.688,5667,679.688,5667,1886.6,4904,1886.6,4904,655.46" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="4904" x2="5100.3914" y1="679.688" y2="679.688"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="183.3914" x="4908" y="671.348">Infrastructure: Enrichment</text></g><!--cluster Infrastructure: Generation--><g class="cluster" data-qualified-name="Infrastructure. Generation" data-source-line="280" id="ent0053"><polygon fill="#F2F6F0" points="3232,555.2,3418.9764,555.2,3425.9764,579.428,4071,579.428,4071,1886.6,3232,1886.6,3232,555.2" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="3232" x2="3425.9764" y1="579.428" y2="579.428"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="180.9764" x="3236" y="571.088">Infrastructure: Generation</text></g><!--cluster Infrastructure: Pipeline Channel--><g class="cluster" data-qualified-name="Infrastructure. Pipeline Channel" data-source-line="345" id="ent0063"><polygon fill="#F2F6F0" points="5513,148.78,5737.1676,148.78,5744.1676,173.008,6061,173.008,6061,410.06,5513,410.06,5513,148.78" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="5513" x2="5744.1676" y1="173.008" y2="173.008"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="218.1676" x="5517" y="164.668">Infrastructure: Pipeline Channel</text></g><!--cluster Infrastructure: Export--><g class="cluster" data-qualified-name="Infrastructure. Export" data-source-line="372" id="ent0068"><polygon fill="#F2F6F0" points="4095,609.89,4250.2623,609.89,4257.2623,634.118,4880,634.118,4880,1877.49,4095,1877.49,4095,609.89" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="4095" x2="4257.2623" y1="634.118" y2="634.118"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="149.2623" x="4099" y="625.778">Infrastructure: Export</text></g><!--cluster Orchestration--><g class="cluster" data-qualified-name="Orchestration" data-source-line="429" id="ent0076"><polygon fill="#F2F6F0" points="2399,53.64,2501.754,53.64,2508.754,77.868,3208,77.868,3208,799.37,2399,799.37,2399,53.64" style="stroke:#547461;stroke-width:1.5;"/><line style="stroke:#547461;stroke-width:1.5;" x1="2399" x2="2508.754" y1="77.868" y2="77.868"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="96.754" x="2403" y="69.528">Orchestration</text></g><!--class Location--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.Location" data-source-line="38" id="ent0003"><rect fill="#FAFCF9" height="190.052" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="288.1796" x="1132.91" y="646.89"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="288.1796" x="1132.91" y="646.89"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="288.1796" x="1132.91" y="672.618"/><rect fill="none" height="190.052" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="288.1796" x="1132.91" y="646.89"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="56.4726" x="1248.7635" y="665.778">Location</text><line style="stroke:#547461;stroke-width:0.5;" x1="1133.91" x2="1420.0896" y1="675.118" y2="675.118"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="689.732" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="98.7283" x="1151.91" y="693.006">city : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="707.96" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.8874" x="1151.91" y="711.234">state_province : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="726.188" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="140.3328" x="1151.91" y="729.462">iso3166_2 : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="744.416" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="124.9119" x="1151.91" y="747.69">country : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="762.644" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="136.6333" x="1151.91" y="765.918">iso3166_1 : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="780.872" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="263.1796" x="1151.91" y="784.146">local_languages : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="799.1" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.0526" x="1151.91" y="802.374">latitude : double</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1143.91" cy="817.328" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="116.0916" x="1151.91" y="820.602">longitude : double</text><line style="stroke:#547461;stroke-width:0.5;" x1="1133.91" x2="1420.0896" y1="828.942" y2="828.942"/></g><!--class LocationContext--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.LocationContext" data-source-line="49" id="ent0004"><rect fill="#FAFCF9" height="171.824" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="221.5496" x="1456.23" y="656"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="221.5496" x="1456.23" y="656"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="221.5496" x="1456.23" y="681.728"/><rect fill="none" height="171.824" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="221.5496" x="1456.23" y="656"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="108.7207" x="1512.6445" y="674.888">LocationContext</text><line style="stroke:#547461;stroke-width:0.5;" x1="1457.23" x2="1676.7796" y1="684.228" y2="684.228"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1467.23" cy="698.842" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="99.9708" x="1475.23" y="702.116">text : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1467.23" cy="717.07" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="196.5496" x="1475.23" y="720.344">completeness : Completeness</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1467.23" cy="735.298" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="125.6922" x="1475.23" y="738.572">char_count : size_t</text><line style="stroke:#547461;stroke-width:1;" x1="1457.23" x2="1676.7796" y1="746.912" y2="746.912"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="147.021" x="1462.23" y="764.8">&#171;enum&#187; Completeness</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="21.763" x="1462.23" y="783.028">Full</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="40.4986" x="1462.23" y="801.256">Partial</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="46.571" x="1462.23" y="819.484">Absent</text></g><!--class EnrichedCity--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.EnrichedCity" data-source-line="60" id="ent0005"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="194.2043" x="1469.9" y="249.58"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="194.2043" x="1469.9" y="249.58"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="194.2043" x="1469.9" y="275.308"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="194.2043" x="1469.9" y="249.58"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="83.9196" x="1525.0423" y="268.468">EnrichedCity</text><line style="stroke:#547461;stroke-width:0.5;" x1="1470.9" x2="1663.1043" y1="277.808" y2="277.808"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1480.9" cy="292.422" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="118.9687" x="1488.9" y="295.696">location : Location</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1480.9" cy="310.65" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="169.2043" x="1488.9" y="313.924">context : LocationContext</text><line style="stroke:#547461;stroke-width:0.5;" x1="1470.9" x2="1663.1043" y1="322.264" y2="322.264"/></g><!--class BeerStyle--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.BeerStyle" data-source-line="65" id="ent0006"><rect fill="#FAFCF9" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="173.3408" x="32.33" y="213.13"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="173.3408" x="32.33" y="213.13"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="173.3408" x="32.33" y="238.858"/><rect fill="none" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="173.3408" x="32.33" y="213.13"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="61.9991" x="88.0009" y="232.018">BeerStyle</text><line style="stroke:#547461;stroke-width:0.5;" x1="33.33" x2="204.6708" y1="241.358" y2="241.358"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="43.33" cy="255.972" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="110.1767" x="51.33" y="259.246">name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="43.33" cy="274.2" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="148.3408" x="51.33" y="277.474">description : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="43.33" cy="292.428" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="96.4286" x="51.33" y="295.702">min_abv : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="43.33" cy="310.656" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="99.6136" x="51.33" y="313.93">max_abv : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="43.33" cy="328.884" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="80.388" x="51.33" y="332.158">min_ibu : int</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="43.33" cy="347.112" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="83.573" x="51.33" y="350.386">max_ibu : int</text><line style="stroke:#547461;stroke-width:0.5;" x1="33.33" x2="204.6708" y1="358.726" y2="358.726"/></g><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GMN7" data-source-line="74" id="ent0008"><path d="M240.99,221.13 L240.99,358.726 L507.0008,358.726 L507.0008,231.13 L497.0008,221.13 L240.99,221.13" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M497.0008,221.13 L497.0008,231.13 L507.0008,231.13 L497.0008,221.13" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="187.4113" x="246.99" y="240.018">Loaded once at startup from</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="209.5384" x="246.99" y="258.246">beer-styles.json via JsonLoader.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="245.0108" x="246.99" y="276.474">Passed as std::span&lt;const BeerStyle&gt;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="168.8544" x="246.99" y="294.702">to IBeerSelectionStrategy.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="210.0668" x="246.99" y="312.93">Generator receives the selected</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.7789" x="246.99" y="331.158">style as a parameter &#8212; it never</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="168.0458" x="246.99" y="349.386">reads the palette directly.</text></g><!--class BreweryResult--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.BreweryResult" data-source-line="83" id="ent0010"><rect fill="#FAFCF9" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="212.7578" x="885.62" y="683.34"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="212.7578" x="885.62" y="683.34"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="212.7578" x="885.62" y="709.068"/><rect fill="none" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="212.7578" x="885.62" y="683.34"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="93.1072" x="945.4453" y="702.228">BreweryResult</text><line style="stroke:#547461;stroke-width:0.5;" x1="886.62" x2="1097.3778" y1="711.568" y2="711.568"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="896.62" cy="726.182" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="135.4047" x="904.62" y="729.456">name_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="896.62" cy="744.41" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.5688" x="904.62" y="747.684">description_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="896.62" cy="762.638" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="149.5937" x="904.62" y="765.912">name_local : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="896.62" cy="780.866" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="187.7578" x="904.62" y="784.14">description_local : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="886.62" x2="1097.3778" y1="792.48" y2="792.48"/></g><!--class BeerResult--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.BeerResult" data-source-line="90" id="ent0011"><rect fill="#FAFCF9" height="171.824" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="212.7578" x="1712.62" y="656"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="212.7578" x="1712.62" y="656"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="212.7578" x="1712.62" y="681.728"/><rect fill="none" height="171.824" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="212.7578" x="1712.62" y="656"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.4681" x="1784.2648" y="674.888">BeerResult</text><line style="stroke:#547461;stroke-width:0.5;" x1="1713.62" x2="1924.3778" y1="684.228" y2="684.228"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="698.842" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="135.4047" x="1731.62" y="702.116">name_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="717.07" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.5688" x="1731.62" y="720.344">description_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="735.298" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="149.5937" x="1731.62" y="738.572">name_local : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="753.526" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="187.7578" x="1731.62" y="756.8">description_local : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="771.754" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.4798" x="1731.62" y="775.028">style : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="789.982" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="63.3292" x="1731.62" y="793.256">abv : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1723.62" cy="808.21" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="47.2886" x="1731.62" y="811.484">ibu : int</text><line style="stroke:#547461;stroke-width:0.5;" x1="1713.62" x2="1924.3778" y1="819.824" y2="819.824"/></g><!--class UserResult--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.UserResult" data-source-line="100" id="ent0012"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="165.5884" x="442.21" y="692.46"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="165.5884" x="442.21" y="692.46"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="165.5884" x="442.21" y="718.188"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="165.5884" x="442.21" y="692.46"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.2791" x="490.3646" y="711.348">UserResult</text><line style="stroke:#547461;stroke-width:0.5;" x1="443.21" x2="606.7984" y1="720.688" y2="720.688"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="453.21" cy="735.302" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.3658" x="461.21" y="738.576">username : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="453.21" cy="753.53" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="94.5283" x="461.21" y="756.804">bio : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="453.21" cy="771.758" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="140.5884" x="461.21" y="775.032">activity_weight : float</text><line style="stroke:#547461;stroke-width:0.5;" x1="443.21" x2="606.7984" y1="783.372" y2="783.372"/></g><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GMN13" data-source-line="106" id="ent0014"><path d="M642.9,691.34 L642.9,792.48 L851.0908,792.48 L851.0908,701.34 L841.0908,691.34 L642.9,691.34" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M841.0908,691.34 L841.0908,701.34 L851.0908,701.34 L841.0908,691.34" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="182.6373" x="648.9" y="710.228">activity_weight assigned by</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="187.1908" x="648.9" y="728.456">ICheckinDistributionStrategy</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="157.2064" x="648.9" y="746.684">after the full user pool is</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="174.1847" x="648.9" y="764.912">committed. Drives J-curve</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="161.7457" x="648.9" y="783.14">checkin volume per user.</text></g><!--class CheckinResult--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.CheckinResult" data-source-line="113" id="ent0016"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="197.8722" x="1960.06" y="701.57"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="197.8722" x="1960.06" y="701.57"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="197.8722" x="1960.06" y="727.298"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="197.8722" x="1960.06" y="701.57"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.4246" x="2012.7838" y="720.458">CheckinResult</text><line style="stroke:#547461;stroke-width:0.5;" x1="1961.06" x2="2156.9322" y1="729.798" y2="729.798"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1971.06" cy="744.412" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.8722" x="1979.06" y="747.686">checked_in_at : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1971.06" cy="762.64" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="103.8733" x="1979.06" y="765.914">note : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="1961.06" x2="2156.9322" y1="774.254" y2="774.254"/></g><!--class RatingResult--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.RatingResult" data-source-line="118" id="ent0017"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="128.8733" x="2197.56" y="701.57"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="128.8733" x="2197.56" y="701.57"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="128.8733" x="2197.56" y="727.298"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="128.8733" x="2197.56" y="701.57"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="80.5527" x="2221.7203" y="720.458">RatingResult</text><line style="stroke:#547461;stroke-width:0.5;" x1="2198.56" x2="2325.4333" y1="729.798" y2="729.798"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2208.56" cy="744.412" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.0377" x="2216.56" y="747.686">score : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2208.56" cy="762.64" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="103.8733" x="2216.56" y="765.914">note : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="2198.56" x2="2325.4333" y1="774.254" y2="774.254"/></g><!--class GeneratedBrewery--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GeneratedBrewery" data-source-line="123" id="ent0018"><rect fill="#FAFCF9" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="395.3738" x="1039.31" y="222.24"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="395.3738" x="1039.31" y="222.24"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="395.3738" x="1039.31" y="247.968"/><rect fill="none" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="395.3738" x="1039.31" y="222.24"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.7382" x="1175.6278" y="241.128">GeneratedBrewery</text><line style="stroke:#547461;stroke-width:0.5;" x1="1040.31" x2="1433.6838" y1="250.468" y2="250.468"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1050.31" cy="265.082" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.5466" x="1058.31" y="268.356">brewery_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1050.31" cy="283.31" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="118.9687" x="1058.31" y="286.584">location : Location</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1050.31" cy="301.538" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="156.8774" x="1058.31" y="304.812">brewery : BreweryResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1050.31" cy="319.766" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="370.3738" x="1058.31" y="323.04">context_completeness : LocationContext::Completeness</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1050.31" cy="337.994" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.2088" x="1058.31" y="341.268">generated_at : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="1040.31" x2="1433.6838" y1="349.608" y2="349.608"/></g><!--class GeneratedBeer--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GeneratedBeer" data-source-line="131" id="ent0019"><rect fill="#FAFCF9" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="197.5466" x="1699.23" y="222.24"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="197.5466" x="1699.23" y="222.24"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="197.5466" x="1699.23" y="247.968"/><rect fill="none" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="197.5466" x="1699.23" y="222.24"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="99.0991" x="1748.4538" y="241.128">GeneratedBeer</text><line style="stroke:#547461;stroke-width:0.5;" x1="1700.23" x2="1895.7766" y1="250.468" y2="250.468"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1710.23" cy="265.082" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="148.9075" x="1718.23" y="268.356">beer_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1710.23" cy="283.31" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.5466" x="1718.23" y="286.584">brewery_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1710.23" cy="301.538" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="118.9687" x="1718.23" y="304.812">location : Location</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1710.23" cy="319.766" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="109.5992" x="1718.23" y="323.04">beer : BeerResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1710.23" cy="337.994" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.2088" x="1718.23" y="341.268">generated_at : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="1700.23" x2="1895.7766" y1="349.608" y2="349.608"/></g><!--class GeneratedUser--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GeneratedUser" data-source-line="139" id="ent0020"><rect fill="#FAFCF9" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="188.2088" x="541.9" y="231.35"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="188.2088" x="541.9" y="231.35"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="188.2088" x="541.9" y="257.078"/><rect fill="none" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="188.2088" x="541.9" y="231.35"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="98.9101" x="586.5493" y="250.238">GeneratedUser</text><line style="stroke:#547461;stroke-width:0.5;" x1="542.9" x2="729.1088" y1="259.578" y2="259.578"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="552.9" cy="274.192" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="147.2381" x="560.9" y="277.466">user_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="552.9" cy="292.42" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="118.9687" x="560.9" y="295.694">location : Location</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="552.9" cy="310.648" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="107.7407" x="560.9" y="313.922">user : UserResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="552.9" cy="328.876" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.2088" x="560.9" y="332.15">generated_at : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="542.9" x2="729.1088" y1="340.49" y2="340.49"/></g><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GMN21" data-source-line="146" id="ent0022"><path d="M765.37,257.58 L765.37,322.264 L1004.6305,322.264 L1004.6305,267.58 L994.6305,257.58 L765.37,257.58" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M994.6305,257.58 L994.6305,267.58 L1004.6305,267.58 L994.6305,257.58" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.6912" x="771.37" y="276.468">user_id populated after SQLite</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.0989" x="771.37" y="294.696">insert. Live FK carried in pool</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="218.2605" x="771.37" y="312.924">for checkin and rating references.</text></g><!--class GeneratedCheckin--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GeneratedCheckin" data-source-line="151" id="ent0024"><rect fill="#FAFCF9" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="197.5466" x="1932.23" y="222.24"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="197.5466" x="1932.23" y="222.24"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="197.5466" x="1932.23" y="247.968"/><rect fill="none" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="197.5466" x="1932.23" y="222.24"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.0556" x="1969.9755" y="241.128">GeneratedCheckin</text><line style="stroke:#547461;stroke-width:0.5;" x1="1933.23" x2="2128.7766" y1="250.468" y2="250.468"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1943.23" cy="265.082" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="169.498" x="1951.23" y="268.356">checkin_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1943.23" cy="283.31" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="147.2381" x="1951.23" y="286.584">user_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1943.23" cy="301.538" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.5466" x="1951.23" y="304.812">brewery_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1943.23" cy="319.766" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="153.1462" x="1951.23" y="323.04">checkin : CheckinResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1943.23" cy="337.994" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.2088" x="1951.23" y="341.268">generated_at : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="1933.23" x2="2128.7766" y1="349.608" y2="349.608"/></g><!--class GeneratedRating--><g class="entity" data-qualified-name="Domain. Value Objects . Contracts.GeneratedRating" data-source-line="159" id="ent0025"><rect fill="#FAFCF9" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="194.498" x="2164.75" y="222.24"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="194.498" x="2164.75" y="222.24"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="194.498" x="2164.75" y="247.968"/><rect fill="none" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="194.498" x="2164.75" y="222.24"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="110.1837" x="2206.9072" y="241.128">GeneratedRating</text><line style="stroke:#547461;stroke-width:0.5;" x1="2165.75" x2="2358.248" y1="250.468" y2="250.468"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2175.75" cy="265.082" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="147.2381" x="2183.75" y="268.356">user_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2175.75" cy="283.31" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="148.9075" x="2183.75" y="286.584">beer_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2175.75" cy="301.538" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="169.498" x="2183.75" y="304.812">checkin_id : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2175.75" cy="319.766" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="128.2964" x="2183.75" y="323.04">rating : RatingResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2175.75" cy="337.994" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.2088" x="2183.75" y="341.268">generated_at : std::string</text><line style="stroke:#547461;stroke-width:0.5;" x1="2165.75" x2="2358.248" y1="349.608" y2="349.608"/></g><!--class IContextStrategy--><g class="entity" data-qualified-name="Domain Policy.IContextStrategy" data-source-line="174" id="ent0027"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="402.5143" x="5706.74" y="1547.21"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="402.5143" x="5706.74" y="1547.21"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="402.5143" x="5706.74" y="1591.166"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="402.5143" x="5706.74" y="1547.21"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="5872.4232" y="1566.098">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="110.866" x="5852.5642" y="1584.326">IContextStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="5707.74" x2="6108.2543" y1="1593.666" y2="1593.666"/><line style="stroke:#547461;stroke-width:0.5;" x1="5707.74" x2="6108.2543" y1="1601.666" y2="1601.666"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5717.74" cy="1616.28" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="377.5143" x="5725.74" y="1619.554">QueriesFor(loc : const Location&amp;) : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5717.74" cy="1634.508" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="176.6942" x="5725.74" y="1637.782">MaxContextChars() : size_t</text></g><!--class BreweryContextStrategy--><g class="entity" data-qualified-name="Domain Policy.BreweryContextStrategy" data-source-line="179" id="ent0028"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="402.5143" x="6144.74" y="1789.92"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="402.5143" x="6144.74" y="1789.92"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="402.5143" x="6144.74" y="1815.648"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="402.5143" x="6144.74" y="1789.92"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="160.8534" x="6265.5705" y="1808.808">BreweryContextStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="6145.74" x2="6546.2543" y1="1818.148" y2="1818.148"/><line style="stroke:#547461;stroke-width:0.5;" x1="6145.74" x2="6546.2543" y1="1826.148" y2="1826.148"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6155.74" cy="1840.762" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="377.5143" x="6163.74" y="1844.036">QueriesFor(loc : const Location&amp;) : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6155.74" cy="1858.99" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="176.6942" x="6163.74" y="1862.264">MaxContextChars() : size_t</text></g><!--class BeerContextStrategy--><g class="entity" data-qualified-name="Domain Policy.BeerContextStrategy" data-source-line="184" id="ent0029"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="402.5143" x="5706.74" y="1789.92"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="402.5143" x="5706.74" y="1789.92"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="402.5143" x="5706.74" y="1815.648"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="402.5143" x="5706.74" y="1789.92"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="137.2143" x="5839.39" y="1808.808">BeerContextStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="5707.74" x2="6108.2543" y1="1818.148" y2="1818.148"/><line style="stroke:#547461;stroke-width:0.5;" x1="5707.74" x2="6108.2543" y1="1826.148" y2="1826.148"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5717.74" cy="1840.762" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="377.5143" x="5725.74" y="1844.036">QueriesFor(loc : const Location&amp;) : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5717.74" cy="1858.99" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="176.6942" x="5725.74" y="1862.264">MaxContextChars() : size_t</text></g><!--class ISamplingStrategy--><g class="entity" data-qualified-name="Domain Policy.ISamplingStrategy" data-source-line="189" id="ent0030"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="496.3739" x="7793.81" y="1556.32"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="496.3739" x="7793.81" y="1556.32"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="496.3739" x="7793.81" y="1600.276"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="496.3739" x="7793.81" y="1556.32"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="8006.4229" y="1575.208">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="117.95" x="7983.022" y="1593.436">ISamplingStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="7794.81" x2="8289.1839" y1="1602.776" y2="1602.776"/><line style="stroke:#547461;stroke-width:0.5;" x1="7794.81" x2="8289.1839" y1="1610.776" y2="1610.776"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7804.81" cy="1625.39" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="471.3739" x="7812.81" y="1628.664">Sample(locations : const std::vector&lt;Location&gt;&amp;) : std::vector&lt;Location&gt;</text></g><!--class UniformSamplingStrategy--><g class="entity" data-qualified-name="Domain Policy.UniformSamplingStrategy" data-source-line="193" id="ent0031"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="496.3739" x="7829.81" y="1789.92"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="496.3739" x="7829.81" y="1789.92"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="496.3739" x="7829.81" y="1815.648"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="496.3739" x="7829.81" y="1789.92"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="166.0088" x="7994.9925" y="1808.808">UniformSamplingStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="7830.81" x2="8325.1839" y1="1818.148" y2="1818.148"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7837.81" y="1829.762"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.972" x="7848.81" y="1836.036">sample_size_ : size_t</text><line style="stroke:#547461;stroke-width:0.5;" x1="7830.81" x2="8325.1839" y1="1844.376" y2="1844.376"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7840.81" cy="1858.99" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="471.3739" x="7848.81" y="1862.264">Sample(locations : const std::vector&lt;Location&gt;&amp;) : std::vector&lt;Location&gt;</text></g><!--class IBeerSelectionStrategy--><g class="entity" data-qualified-name="Domain Policy.IBeerSelectionStrategy" data-source-line="198" id="ent0032"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="427.6163" x="6197.19" y="1547.21"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="427.6163" x="6197.19" y="1547.21"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="427.6163" x="6197.19" y="1591.166"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="427.6163" x="6197.19" y="1547.21"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="6375.4241" y="1566.098">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="148.764" x="6336.6161" y="1584.326">IBeerSelectionStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="6198.19" x2="6623.8063" y1="1593.666" y2="1593.666"/><line style="stroke:#547461;stroke-width:0.5;" x1="6198.19" x2="6623.8063" y1="1601.666" y2="1601.666"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6208.19" cy="1625.394" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="325.2627" x="6216.19" y="1619.554">SelectStyles(brewery : const GeneratedBrewery&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="395.1683" x="6223.638" y="1637.782">palette : std::span&lt;const BeerStyle&gt;) : std::vector&lt;BeerStyle&gt;</text></g><g class="entity" data-qualified-name="Domain Policy.GMN33" data-source-line="202" id="ent0034"><path d="M6660.08,1546.1 L6660.08,1647.24 L6915.9167,1647.24 L6915.9167,1556.1 L6905.9167,1546.1 L6660.08,1546.1" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M6905.9167,1546.1 L6905.9167,1556.1 L6915.9167,1556.1 L6905.9167,1546.1" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="232.2708" x="6666.08" y="1564.988">Decides how many beers a brewery</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="227.6719" x="6666.08" y="1583.216">gets and which styles are selected.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="182.0108" x="6666.08" y="1601.444">Count distribution and style</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="184.8283" x="6666.08" y="1619.672">deduplication logic live here,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="234.8367" x="6666.08" y="1637.9">not in the orchestrator or generator.</text></g><!--class RandomBeerSelectionStrategy--><g class="entity" data-qualified-name="Domain Policy.RandomBeerSelectionStrategy" data-source-line="209" id="ent0036"><rect fill="#FAFCF9" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="427.6163" x="6582.19" y="1762.58"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="427.6163" x="6582.19" y="1762.58"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="427.6163" x="6582.19" y="1788.308"/><rect fill="none" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="427.6163" x="6582.19" y="1762.58"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="198.8213" x="6696.5875" y="1781.468">RandomBeerSelectionStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="6583.19" x2="7008.8063" y1="1790.808" y2="1790.808"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="6590.19" y="1802.422"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="123.1442" x="6601.19" y="1808.696">rng_ : std::mt19937</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="6590.19" y="1820.65"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="128.9889" x="6601.19" y="1826.924">min_beers_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="6590.19" y="1838.878"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="132.1739" x="6601.19" y="1845.152">max_beers_ : size_t</text><line style="stroke:#547461;stroke-width:0.5;" x1="6583.19" x2="7008.8063" y1="1853.492" y2="1853.492"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6593.19" cy="1877.22" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="325.2627" x="6601.19" y="1871.38">SelectStyles(brewery : const GeneratedBrewery&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="395.1683" x="6608.638" y="1889.608">palette : std::span&lt;const BeerStyle&gt;) : std::vector&lt;BeerStyle&gt;</text></g><g class="entity" data-qualified-name="Domain Policy.GMN37" data-source-line="216" id="ent0038"><path d="M7045.14,1788.81 L7045.14,1871.722 L7300.8504,1871.722 L7300.8504,1798.81 L7290.8504,1788.81 L7045.14,1788.81" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M7290.8504,1788.81 L7290.8504,1798.81 L7300.8504,1798.81 L7290.8504,1788.81" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="234.7104" x="7051.14" y="1807.698">Draws a random count in [min, max].</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="228.9003" x="7051.14" y="1825.926">Samples without replacement from</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="210.0353" x="7051.14" y="1844.154">palette to avoid duplicate styles</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="81.9002" x="7051.14" y="1862.382">per brewery.</text></g><!--class ICheckinDistributionStrategy--><g class="entity" data-qualified-name="Domain Policy.ICheckinDistributionStrategy" data-source-line="222" id="ent0040"><rect fill="#FAFCF9" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="458.7489" x="7020.63" y="1519.87"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="458.7489" x="7020.63" y="1519.87"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="458.7489" x="7020.63" y="1563.826"/><rect fill="none" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="458.7489" x="7020.63" y="1519.87"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="7214.4304" y="1538.758">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="187.432" x="7156.2884" y="1556.986">ICheckinDistributionStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="7021.63" x2="7478.3789" y1="1566.326" y2="1566.326"/><line style="stroke:#547461;stroke-width:0.5;" x1="7021.63" x2="7478.3789" y1="1574.326" y2="1574.326"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7031.63" cy="1588.94" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="433.7489" x="7039.63" y="1592.214">AssignActivityWeights(users : std::vector&lt;GeneratedUser&gt;&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7031.63" cy="1616.282" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="305.8166" x="7039.63" y="1610.442">CheckinsForUser(user : const GeneratedUser&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="205.3172" x="7047.078" y="1628.67">brewery_count : size_t) : size_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7031.63" cy="1652.738" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="289.9755" x="7039.63" y="1646.898">TimestampFor(user : const GeneratedUser&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="164.1328" x="7047.078" y="1665.126">index : size_t) : std::string</text></g><g class="entity" data-qualified-name="Domain Policy.GMN41" data-source-line="228" id="ent0042"><path d="M7514.32,1555.21 L7514.32,1638.122 L7723.6797,1638.122 L7723.6797,1565.21 L7713.6797,1555.21 L7514.32,1555.21" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M7713.6797,1555.21 L7713.6797,1565.21 L7723.6797,1565.21 L7713.6797,1555.21" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="167.3703" x="7520.32" y="1574.098">Owns all statistical policy:</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="179.2564" x="7520.32" y="1592.326">J-curve weight assignment,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.3597" x="7520.32" y="1610.554">bursty weekend timestamps,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="165.5957" x="7520.32" y="1628.782">per-user checkin volume.</text></g><!--class JCurveCheckinStrategy--><g class="entity" data-qualified-name="Domain Policy.JCurveCheckinStrategy" data-source-line="234" id="ent0044"><rect fill="#FAFCF9" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="458.7489" x="7335.63" y="1753.46"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="458.7489" x="7335.63" y="1753.46"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="458.7489" x="7335.63" y="1779.188"/><rect fill="none" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="458.7489" x="7335.63" y="1753.46"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="153.5103" x="7488.2493" y="1772.348">JCurveCheckinStrategy</text><line style="stroke:#547461;stroke-width:0.5;" x1="7336.63" x2="7793.3789" y1="1781.688" y2="1781.688"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7343.63" y="1793.302"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="123.1442" x="7354.63" y="1799.576">rng_ : std::mt19937</text><line style="stroke:#547461;stroke-width:0.5;" x1="7336.63" x2="7793.3789" y1="1807.916" y2="1807.916"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7346.63" cy="1822.53" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="433.7489" x="7354.63" y="1825.804">AssignActivityWeights(users : std::vector&lt;GeneratedUser&gt;&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7346.63" cy="1849.872" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="305.8166" x="7354.63" y="1844.032">CheckinsForUser(user : const GeneratedUser&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="205.3172" x="7362.078" y="1862.26">brewery_count : size_t) : size_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7346.63" cy="1886.328" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="289.9755" x="7354.63" y="1880.488">TimestampFor(user : const GeneratedUser&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="164.1328" x="7362.078" y="1898.716">index : size_t) : std::string</text></g><!--class IEnrichmentService--><g class="entity" data-qualified-name="Infrastructure. Enrichment.IEnrichmentService" data-source-line="248" id="ent0046"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="383.0787" x="4929.46" y="692.46"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="383.0787" x="4929.46" y="692.46"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="383.0787" x="4929.46" y="736.416"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="383.0787" x="4929.46" y="692.46"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="5085.4254" y="711.348">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="125.692" x="5058.1534" y="729.576">IEnrichmentService</text><line style="stroke:#547461;stroke-width:0.5;" x1="4930.46" x2="5311.5387" y1="738.916" y2="738.916"/><line style="stroke:#547461;stroke-width:0.5;" x1="4930.46" x2="5311.5387" y1="746.916" y2="746.916"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4940.46" cy="770.644" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="277.5645" x="4948.46" y="764.804">GetLocationContext(loc : const Location&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="350.6307" x="4955.908" y="783.032">strategy : const IContextStrategy&amp;) : LocationContext</text></g><!--class WikipediaService--><g class="entity" data-qualified-name="Infrastructure. Enrichment.WikipediaService" data-source-line="252" id="ent0047"><rect fill="#FAFCF9" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="422.6147" x="4919.69" y="1126.56"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="422.6147" x="4919.69" y="1126.56"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="422.6147" x="4919.69" y="1152.288"/><rect fill="none" height="135.368" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="422.6147" x="4919.69" y="1126.56"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.7306" x="5075.132" y="1145.448">WikipediaService</text><line style="stroke:#547461;stroke-width:0.5;" x1="4920.69" x2="5341.3047" y1="1154.788" y2="1154.788"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4927.69" y="1166.402"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="238.9101" x="4938.69" y="1172.676">client_ : std::unique_ptr&lt;WebClient&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4927.69" y="1184.63"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="397.6147" x="4938.69" y="1190.904">extract_cache_ : std::unordered_map&lt;std::string, std::string&gt;</text><line style="stroke:#547461;stroke-width:0.5;" x1="4920.69" x2="5341.3047" y1="1199.244" y2="1199.244"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4930.69" cy="1222.972" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="277.5645" x="4938.69" y="1217.132">GetLocationContext(loc : const Location&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="350.6307" x="4946.138" y="1235.36">strategy : const IContextStrategy&amp;) : LocationContext</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4927.69" y="1247.314"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="318.5638" x="4938.69" y="1253.588">FetchExtract(query : std::string_view) : std::string</text></g><g class="entity" data-qualified-name="Infrastructure. Enrichment.GMN48" data-source-line="259" id="ent0049"><path d="M5376.92,1152.79 L5376.92,1235.702 L5651.0788,1235.702 L5651.0788,1162.79 L5641.0788,1152.79 L5376.92,1152.79" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5641.0788,1152.79 L5641.0788,1162.79 L5651.0788,1162.79 L5641.0788,1152.79" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="253.1588" x="5382.92" y="1171.678">extract_cache_ keyed by query string.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="241.2904" x="5382.92" y="1189.906">Beer pass gets near-100% cache hits</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="239.327" x="5382.92" y="1208.134">since locations were already fetched</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="160.5524" x="5382.92" y="1226.362">during the brewery pass.</text></g><!--class WebClient--><g class="entity" data-qualified-name="Infrastructure. Enrichment.WebClient" data-source-line="265" id="ent0051"><rect fill="#FAFCF9" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="4963.48" y="1547.21"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="4963.48" y="1547.21"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="4963.48" y="1591.166"/><rect fill="none" height="98.912" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="4963.48" y="1547.21"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="5095.4231" y="1566.098">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="68.222" x="5096.8861" y="1584.326">WebClient</text><line style="stroke:#547461;stroke-width:0.5;" x1="4964.48" x2="5297.5142" y1="1593.666" y2="1593.666"/><line style="stroke:#547461;stroke-width:0.5;" x1="4964.48" x2="5297.5142" y1="1601.666" y2="1601.666"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4974.48" cy="1616.28" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.8552" x="4982.48" y="1619.554">Get(url : const std::string&amp;) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4974.48" cy="1634.508" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="310.0342" x="4982.48" y="1637.782">UrlEncode(value : const std::string&amp;) : std::string</text></g><!--class CURLWebClient--><g class="entity" data-qualified-name="Infrastructure. Enrichment.CURLWebClient" data-source-line="270" id="ent0052"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="4963.48" y="1789.92"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="4963.48" y="1789.92"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="335.0342" x="4963.48" y="1815.648"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="335.0342" x="4963.48" y="1789.92"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="103.1695" x="5079.4123" y="1808.808">CURLWebClient</text><line style="stroke:#547461;stroke-width:0.5;" x1="4964.48" x2="5297.5142" y1="1818.148" y2="1818.148"/><line style="stroke:#547461;stroke-width:0.5;" x1="4964.48" x2="5297.5142" y1="1826.148" y2="1826.148"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4974.48" cy="1840.762" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="249.8552" x="4982.48" y="1844.036">Get(url : const std::string&amp;) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4974.48" cy="1858.99" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="310.0342" x="4982.48" y="1862.264">UrlEncode(value : const std::string&amp;) : std::string</text></g><!--class DataGenerator--><g class="entity" data-qualified-name="Infrastructure. Generation.DataGenerator" data-source-line="282" id="ent0054"><rect fill="#FAFCF9" height="299.42" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="374.9307" x="3247.53" y="592.2"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="374.9307" x="3247.53" y="592.2"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="374.9307" x="3247.53" y="636.156"/><rect fill="none" height="299.42" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="374.9307" x="3247.53" y="592.2"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="3399.4213" y="611.088">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="97.062" x="3386.4643" y="629.316">DataGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="3248.53" x2="3621.4607" y1="638.656" y2="638.656"/><line style="stroke:#547461;stroke-width:0.5;" x1="3248.53" x2="3621.4607" y1="646.656" y2="646.656"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.53" cy="670.384" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="291.5402" x="3266.53" y="664.544">GenerateBrewery(location : const Location&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="328.6472" x="3273.978" y="682.772">context : const LocationContext&amp;) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.53" cy="725.068" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="270.6308" x="3266.53" y="701">GenerateBeer(brewery_id : sqlite3_int64,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.3649" x="3273.978" y="719.228">location : const Location&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="222.6004" x="3273.978" y="737.456">context : const LocationContext&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="239.4564" x="3273.978" y="755.684">style : const BeerStyle&amp;) : BeerResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.53" cy="770.638" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="349.9307" x="3266.53" y="773.912">GenerateUser(location : const Location&amp;) : UserResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.53" cy="807.094" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="309.2605" x="3266.53" y="792.14">GenerateCheckin(user : const GeneratedUser&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="239.9045" x="3273.978" y="810.368">brewery : const GeneratedBrewery&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="303.5065" x="3273.978" y="828.596">timestamp : const std::string&amp;) : CheckinResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.53" cy="861.778" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="297.3886" x="3266.53" y="846.824">GenerateRating(user : const GeneratedUser&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="192.6263" x="3273.978" y="865.052">beer : const GeneratedBeer&amp;,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="265.5382" x="3273.978" y="883.28">checkin_id : sqlite3_int64) : RatingResult</text></g><g class="entity" data-qualified-name="Infrastructure. Generation.GMN55" data-source-line="290" id="ent0056"><path d="M3657.21,700.46 L3657.21,783.372 L3892.7848,783.372 L3892.7848,710.46 L3882.7848,700.46 L3657.21,700.46" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3882.7848,700.46 L3882.7848,710.46 L3892.7848,710.46 L3882.7848,700.46" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="214.5748" x="3663.21" y="719.348">GenerateBeer receives BeerStyle</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="199.8853" x="3663.21" y="737.576">as a parameter. Style selection</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="172.2002" x="3663.21" y="755.804">and count decisions live in</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="212.286" x="3663.21" y="774.032">IBeerSelectionStrategy, not here.</text></g><!--class MockGenerator--><g class="entity" data-qualified-name="Infrastructure. Generation.MockGenerator" data-source-line="296" id="ent0058"><rect fill="#FAFCF9" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="374.5106" x="3247.74" y="1117.45"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="374.5106" x="3247.74" y="1117.45"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="374.5106" x="3247.74" y="1143.178"/><rect fill="none" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="374.5106" x="3247.74" y="1117.45"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="3384.261" y="1136.338">MockGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="3248.74" x2="3621.2506" y1="1145.678" y2="1145.678"/><line style="stroke:#547461;stroke-width:0.5;" x1="3248.74" x2="3621.2506" y1="1153.678" y2="1153.678"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.74" cy="1168.292" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.0966" x="3266.74" y="1171.566">GenerateBrewery(...) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.74" cy="1186.52" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.8183" x="3266.74" y="1189.794">GenerateBeer(...) : BeerResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.74" cy="1204.748" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.4403" x="3266.74" y="1208.022">GenerateUser(...) : UserResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.74" cy="1222.976" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="234.7313" x="3266.74" y="1226.25">GenerateCheckin(...) : CheckinResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3258.74" cy="1241.204" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="210.9875" x="3266.74" y="1244.478">GenerateRating(...) : RatingResult</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3255.74" y="1256.432"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="349.5106" x="3266.74" y="1262.706">DeterministicHash(location : const Location&amp;) : size_t</text></g><!--class LlamaGenerator--><g class="entity" data-qualified-name="Infrastructure. Generation.LlamaGenerator" data-source-line="305" id="ent0059"><rect fill="#FAFCF9" height="299.42" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="397.138" x="3657.43" y="1044.54"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="397.138" x="3657.43" y="1044.54"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="397.138" x="3657.43" y="1070.268"/><rect fill="none" height="299.42" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="397.138" x="3657.43" y="1044.54"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="3803.7369" y="1063.428">LlamaGenerator</text><line style="stroke:#547461;stroke-width:0.5;" x1="3658.43" x2="4053.568" y1="1072.768" y2="1072.768"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1084.382"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.1239" x="3676.43" y="1090.656">model_ : ModelHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1102.61"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="167.0061" x="3676.43" y="1108.884">context_ : ContextHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1120.838"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="372.138" x="3676.43" y="1127.112">prompt_formatter_ : std::unique_ptr&lt;IPromptFormatter&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1139.066"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="140.2802" x="3676.43" y="1145.34">config_ : LlamaConfig</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1157.294"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="123.1442" x="3676.43" y="1163.568">rng_ : std::mt19937</text><line style="stroke:#547461;stroke-width:0.5;" x1="3658.43" x2="4053.568" y1="1171.908" y2="1171.908"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3668.43" cy="1186.522" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.0966" x="3676.43" y="1189.796">GenerateBrewery(...) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3668.43" cy="1204.75" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.8183" x="3676.43" y="1208.024">GenerateBeer(...) : BeerResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3668.43" cy="1222.978" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.4403" x="3676.43" y="1226.252">GenerateUser(...) : UserResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3668.43" cy="1241.206" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="234.7313" x="3676.43" y="1244.48">GenerateCheckin(...) : CheckinResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3668.43" cy="1259.434" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="210.9875" x="3676.43" y="1262.708">GenerateRating(...) : RatingResult</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1274.662"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="262.4725" x="3676.43" y="1280.936">Load(config : const LlamaConfig&amp;) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1302.004"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="235.6307" x="3676.43" y="1299.164">Infer(system_prompt, user_prompt,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="224.0844" x="3683.878" y="1317.392">max_tokens, grammar) : std::string</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="3665.43" y="1329.346"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="223.7098" x="3676.43" y="1335.62">ValidateModelArchitecture() : void</text></g><!--class IPromptFormatter--><g class="entity" data-qualified-name="Infrastructure. Generation.IPromptFormatter" data-source-line="321" id="ent0060"><rect fill="#FAFCF9" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="310.8771" x="3502.56" y="1538.1"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="310.8771" x="3502.56" y="1538.1"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="310.8771" x="3502.56" y="1582.056"/><rect fill="none" height="117.14" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="310.8771" x="3502.56" y="1538.1"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="3622.4245" y="1556.988">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="116.48" x="3599.7585" y="1575.216">IPromptFormatter</text><line style="stroke:#547461;stroke-width:0.5;" x1="3503.56" x2="3812.4371" y1="1584.556" y2="1584.556"/><line style="stroke:#547461;stroke-width:0.5;" x1="3503.56" x2="3812.4371" y1="1592.556" y2="1592.556"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3513.56" cy="1616.284" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="273.0074" x="3521.56" y="1610.444">Format(system_prompt : std::string_view,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="278.429" x="3529.008" y="1628.672">user_prompt : std::string_view) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3513.56" cy="1643.626" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="266.9034" x="3521.56" y="1646.9">ExpectedArchitecture() : std::string_view</text></g><!--class Gemma4JinjaPromptFormatter--><g class="entity" data-qualified-name="Infrastructure. Generation.Gemma4JinjaPromptFormatter" data-source-line="326" id="ent0061"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="291.9034" x="3512.05" y="1789.92"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="291.9034" x="3512.05" y="1789.92"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="291.9034" x="3512.05" y="1815.648"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="291.9034" x="3512.05" y="1789.92"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="202.5557" x="3556.7239" y="1808.808">Gemma4JinjaPromptFormatter</text><line style="stroke:#547461;stroke-width:0.5;" x1="3513.05" x2="3802.9534" y1="1818.148" y2="1818.148"/><line style="stroke:#547461;stroke-width:0.5;" x1="3513.05" x2="3802.9534" y1="1826.148" y2="1826.148"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3523.05" cy="1840.762" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.4089" x="3531.05" y="1844.036">Format(...) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="3523.05" cy="1858.99" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="266.9034" x="3531.05" y="1862.264">ExpectedArchitecture() : std::string_view</text></g><!--class LlamaConfig--><g class="entity" data-qualified-name="Infrastructure. Generation.LlamaConfig" data-source-line="331" id="ent0062"><rect fill="#FAFCF9" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="178.8952" x="3848.55" y="1519.87"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="178.8952" x="3848.55" y="1519.87"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="178.8952" x="3848.55" y="1545.598"/><rect fill="none" height="153.596" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="178.8952" x="3848.55" y="1519.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="80.5036" x="3897.7458" y="1538.758">LlamaConfig</text><line style="stroke:#547461;stroke-width:0.5;" x1="3849.55" x2="4026.4452" y1="1548.098" y2="1548.098"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3859.55" cy="1562.712" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="153.8952" x="3867.55" y="1565.986">model_path : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3859.55" cy="1580.94" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="121.6428" x="3867.55" y="1584.214">temperature : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3859.55" cy="1599.168" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="80.1396" x="3867.55" y="1602.442">top_p : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3859.55" cy="1617.396" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.0911" x="3867.55" y="1620.67">top_k : uint32_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3859.55" cy="1635.624" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="103.9361" x="3867.55" y="1638.898">n_ctx : uint32_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3859.55" cy="1653.852" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="58.8596" x="3867.55" y="1657.126">seed : int</text><line style="stroke:#547461;stroke-width:0.5;" x1="3849.55" x2="4026.4452" y1="1665.466" y2="1665.466"/></g><!--class BoundedChannel--><g class="entity" data-qualified-name="Infrastructure. Pipeline Channel.BoundedChannel" data-source-line="347" id="ent0064"><rect fill="#FAFCF9" height="208.28" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="266.8711" x="5528.56" y="185.78"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="266.8711" x="5528.56" y="185.78"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="266.8711" x="5528.56" y="211.508"/><rect fill="none" height="208.28" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="266.8711" x="5528.56" y="185.78"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.153" x="5600.499" y="204.668">BoundedChannel</text><rect fill="#FAFCF9" height="20.228" style="stroke:#547461;stroke-width:1;stroke-dasharray:2,2;" width="9.84" x="5788.5911" y="182.78"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="7.84" x="5789.5911" y="197.668">T</text><line style="stroke:#547461;stroke-width:0.5;" x1="5529.56" x2="5794.4311" y1="214.008" y2="214.008"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5536.56" y="225.622"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.193" x="5547.56" y="231.896">queue_ : std::queue&lt;T&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5536.56" y="243.85"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="128.233" x="5547.56" y="250.124">mutex_ : std::mutex</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5536.56" y="262.078"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="218.4282" x="5547.56" y="268.352">not_full_ : std::condition_variable</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5536.56" y="280.306"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="241.8711" x="5547.56" y="286.58">not_empty_ : std::condition_variable</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5536.56" y="298.534"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="115.6436" x="5547.56" y="304.808">capacity_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5536.56" y="316.762"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="91.217" x="5547.56" y="323.036">closed_ : bool</text><line style="stroke:#547461;stroke-width:0.5;" x1="5529.56" x2="5794.4311" y1="331.376" y2="331.376"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5539.56" cy="345.99" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="128.7896" x="5547.56" y="349.264">Send(item : T) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5539.56" cy="364.218" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="174.8077" x="5547.56" y="367.492">Receive() : std::optional&lt;T&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5539.56" cy="382.446" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="84.9696" x="5547.56" y="385.72">Close() : void</text></g><g class="entity" data-qualified-name="Infrastructure. Pipeline Channel.GMN65" data-source-line="359" id="ent0066"><path d="M5830.62,230.24 L5830.62,349.608 L6045.3767,349.608 L6045.3767,240.24 L6035.3767,230.24 L5830.62,230.24" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M6035.3767,230.24 L6035.3767,240.24 L6045.3767,240.24 L6035.3767,230.24" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="177.2894" x="5836.62" y="249.128">Used for user, brewery, and</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="146.3528" x="5836.62" y="267.356">checkin/rating phases.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="164.2166" x="5836.62" y="285.584">Beer phase uses a simple</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="193.7567" x="5836.62" y="303.812">sequential loop &#8212; enrichment</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="175.0879" x="5836.62" y="322.04">is all cache hits, no fan-out</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="52.227" x="5836.62" y="340.268">needed.</text></g><!--class IExportService--><g class="entity" data-qualified-name="Infrastructure. Export.IExportService" data-source-line="374" id="ent0069"><rect fill="#FAFCF9" height="190.052" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="475.2584" x="4111.37" y="646.89"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="475.2584" x="4111.37" y="646.89"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="475.2584" x="4111.37" y="690.846"/><rect fill="none" height="190.052" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="475.2584" x="4111.37" y="646.89"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="4313.4252" y="665.778">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="93.786" x="4302.1062" y="684.006">IExportService</text><line style="stroke:#547461;stroke-width:0.5;" x1="4112.37" x2="4585.6284" y1="693.346" y2="693.346"/><line style="stroke:#547461;stroke-width:0.5;" x1="4112.37" x2="4585.6284" y1="701.346" y2="701.346"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="715.96" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="100.4677" x="4130.37" y="719.234">Initialize() : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="734.188" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="450.2584" x="4130.37" y="737.462">ProcessBrewery(brewery : const GeneratedBrewery&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="752.416" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="379.341" x="4130.37" y="755.69">ProcessBeer(beer : const GeneratedBeer&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="770.644" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="377.2935" x="4130.37" y="773.918">ProcessUser(user : const GeneratedUser&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="788.872" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="445.8445" x="4130.37" y="792.146">ProcessCheckin(checkin : const GeneratedCheckin&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="807.1" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="349.5317" x="4130.37" y="810.374">ProcessRating(rating : const GeneratedRating&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="825.328" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="95.8547" x="4130.37" y="828.602">Finalize() : void</text></g><!--class SqliteExportService--><g class="entity" data-qualified-name="Infrastructure. Export.SqliteExportService" data-source-line="384" id="ent0070"><rect fill="#FAFCF9" height="445.244" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="475.2584" x="4111.37" y="971.62"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="475.2584" x="4111.37" y="971.62"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="475.2584" x="4111.37" y="997.348"/><rect fill="none" height="445.244" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="475.2584" x="4111.37" y="971.62"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3512" x="4285.3236" y="990.508">SqliteExportService</text><line style="stroke:#547461;stroke-width:0.5;" x1="4112.37" x2="4585.6284" y1="999.848" y2="999.848"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1011.462"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="387.0232" x="4130.37" y="1017.736">date_time_provider_ : std::unique_ptr&lt;IDateTimeProvider&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1029.69"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="233.4325" x="4130.37" y="1035.964">db_handle_ : SqliteDatabaseHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1047.918"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="308.1823" x="4130.37" y="1054.192">insert_location_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1066.146"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="309.4563" x="4130.37" y="1072.42">insert_brewery_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1084.374"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="285.8172" x="4130.37" y="1090.648">insert_beer_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1102.602"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.1477" x="4130.37" y="1108.876">insert_user_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1120.83"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="306.4077" x="4130.37" y="1127.104">insert_checkin_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1139.058"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="293.4298" x="4130.37" y="1145.332">insert_rating_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1157.286"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="164.4616" x="4130.37" y="1163.56">transaction_open_ : bool</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1175.514"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="426.7415" x="4130.37" y="1181.788">location_cache_ : std::unordered_map&lt;std::string, sqlite3_int64&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1193.742"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="428.0155" x="4130.37" y="1200.016">brewery_cache_ : std::unordered_map&lt;std::string, sqlite3_int64&gt;</text><line style="stroke:#547461;stroke-width:0.5;" x1="4112.37" x2="4585.6284" y1="1208.356" y2="1208.356"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1222.97" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="100.4677" x="4130.37" y="1226.244">Initialize() : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1241.198" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="450.2584" x="4130.37" y="1244.472">ProcessBrewery(brewery : const GeneratedBrewery&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1259.426" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="379.341" x="4130.37" y="1262.7">ProcessBeer(beer : const GeneratedBeer&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1277.654" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="377.2935" x="4130.37" y="1280.928">ProcessUser(user : const GeneratedUser&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1295.882" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="445.8445" x="4130.37" y="1299.156">ProcessCheckin(checkin : const GeneratedCheckin&amp;) : sqlite3_int64</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1314.11" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="349.5317" x="4130.37" y="1317.384">ProcessRating(rating : const GeneratedRating&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4122.37" cy="1332.338" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="95.8547" x="4130.37" y="1335.612">Finalize() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1347.566"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.6842" x="4130.37" y="1353.84">InitializeSchema() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1365.794"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="174.9303" x="4130.37" y="1372.068">PrepareStatements() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1384.022"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="223.4263" x="4130.37" y="1390.296">RollbackAndCloseNoThrow() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="4119.37" y="1402.25"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="171.4933" x="4130.37" y="1408.524">FinalizeStatements() : void</text></g><g class="entity" data-qualified-name="Infrastructure. Export.GMN71" data-source-line="409" id="ent0072"><path d="M4621.8,1143.68 L4621.8,1244.82 L4864.1965,1244.82 L4864.1965,1153.68 L4854.1965,1143.68 L4621.8,1143.68" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4854.1965,1143.68 L4854.1965,1153.68 L4864.1965,1153.68 L4854.1965,1143.68" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.9747" x="4627.8" y="1162.568">brewery_cache_ restored.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="179.4558" x="4627.8" y="1180.796">Keyed by location string for</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="176.2252" x="4627.8" y="1199.024">location deduplication, and</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.2778" x="4627.8" y="1217.252">by brewery identity for beer</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="221.3965" x="4627.8" y="1235.48">FK resolution without re-querying.</text></g><!--class IDateTimeProvider--><g class="entity" data-qualified-name="Infrastructure. Export.IDateTimeProvider" data-source-line="416" id="ent0074"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="4234.37" y="1556.32"/><rect fill="#EAF0E8" height="46.456" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="4234.37" y="1556.32"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="4234.37" y="1600.276"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="4234.37" y="1556.32"/><text fill="#28342A" font-family="DM Sans" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="71.148" x="4313.4297" y="1575.208">&#171;interface&#187;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="120.176" x="4288.9157" y="1593.436">IDateTimeProvider</text><line style="stroke:#547461;stroke-width:0.5;" x1="4235.37" x2="4462.6373" y1="1602.776" y2="1602.776"/><line style="stroke:#547461;stroke-width:0.5;" x1="4235.37" x2="4462.6373" y1="1610.776" y2="1610.776"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4245.37" cy="1625.39" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.2673" x="4253.37" y="1628.664">GetUtcTimestamp() : std::string</text></g><!--class SystemDateTimeProvider--><g class="entity" data-qualified-name="Infrastructure. Export.SystemDateTimeProvider" data-source-line="420" id="ent0075"><rect fill="#FAFCF9" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="4234.37" y="1799.03"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="4234.37" y="1799.03"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="229.2673" x="4234.37" y="1824.758"/><rect fill="none" height="62.456" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="229.2673" x="4234.37" y="1799.03"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="165.4241" x="4266.2916" y="1817.918">SystemDateTimeProvider</text><line style="stroke:#547461;stroke-width:0.5;" x1="4235.37" x2="4462.6373" y1="1827.258" y2="1827.258"/><line style="stroke:#547461;stroke-width:0.5;" x1="4235.37" x2="4462.6373" y1="1835.258" y2="1835.258"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="4245.37" cy="1849.872" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.2673" x="4253.37" y="1853.146">GetUtcTimestamp() : std::string</text></g><!--class BiergartenPipelineOrchestrator--><g class="entity" data-qualified-name="Orchestration.BiergartenPipelineOrchestrator" data-source-line="431" id="ent0077"><rect fill="#FAFCF9" height="398.56" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="470.2006" x="2414.9" y="90.64"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="470.2006" x="2414.9" y="90.64"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="470.2006" x="2414.9" y="116.368"/><rect fill="none" height="398.56" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="470.2006" x="2414.9" y="90.64"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.9644" x="2549.0181" y="109.528">BiergartenPipelineOrchestrator</text><line style="stroke:#547461;stroke-width:0.5;" x1="2415.9" x2="2884.1006" y1="118.868" y2="118.868"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="130.482"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="390.9715" x="2433.9" y="136.756">enrichment_service_ : std::unique_ptr&lt;IEnrichmentService&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="148.71"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="294.8859" x="2433.9" y="154.984">generator_ : std::unique_ptr&lt;DataGenerator&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="166.938"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.2809" x="2433.9" y="173.212">exporter_ : std::unique_ptr&lt;IExportService&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="185.166"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="422.1986" x="2433.9" y="191.44">brewery_context_strategy_ : std::unique_ptr&lt;IContextStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="203.394"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="398.5595" x="2433.9" y="209.668">beer_context_strategy_ : std::unique_ptr&lt;IContextStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="221.622"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="374.504" x="2433.9" y="227.896">sampling_strategy_ : std::unique_ptr&lt;ISamplingStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="239.85"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="445.2006" x="2433.9" y="246.124">beer_selection_strategy_ : std::unique_ptr&lt;IBeerSelectionStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="258.078"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="435.9326" x="2433.9" y="264.352">checkin_strategy_ : std::unique_ptr&lt;ICheckinDistributionStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="276.306"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="292.2783" x="2433.9" y="282.58">beer_style_palette_ : std::vector&lt;BeerStyle&gt;</text><line style="stroke:#547461;stroke-width:1;" x1="2415.9" x2="2884.1006" y1="290.92" y2="290.92"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="302.534"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="269.0068" x="2433.9" y="308.808">user_pool_ : std::vector&lt;GeneratedUser&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="320.762"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="318.1435" x="2433.9" y="327.036">brewery_pool_ : std::vector&lt;GeneratedBrewery&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="338.99"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="270.8652" x="2433.9" y="345.264">beer_pool_ : std::vector&lt;GeneratedBeer&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="357.218"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="314.4123" x="2433.9" y="363.492">checkin_pool_ : std::vector&lt;GeneratedCheckin&gt;</text><line style="stroke:#547461;stroke-width:1;" x1="2415.9" x2="2884.1006" y1="371.832" y2="371.832"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="2425.9" cy="386.446" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="73.5806" x="2433.9" y="389.72">Run() : bool</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="401.674"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="402.4938" x="2433.9" y="407.948">RunUserPhase(locations : const std::vector&lt;Location&gt;&amp;) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="419.902"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="426.3219" x="2433.9" y="426.176">RunBreweryPhase(locations : const std::vector&lt;Location&gt;&amp;) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="438.13"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="141.1902" x="2433.9" y="444.404">RunBeerPhase() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="456.358"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="164.1467" x="2433.9" y="462.632">RunCheckinPhase() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="2422.9" y="474.586"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.2748" x="2433.9" y="480.86">RunRatingPhase() : void</text></g><g class="entity" data-qualified-name="Orchestration.GMN78" data-source-line="455" id="ent0079"><path d="M2919.65,221.13 L2919.65,358.726 L3192.3531,358.726 L3192.3531,231.13 L3182.3531,221.13 L2919.65,221.13" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3182.3531,221.13 L3182.3531,231.13 L3192.3531,231.13 L3182.3531,221.13" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="219.6635" x="2925.65" y="240.018">beer_style_palette_ loaded once</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="210.7424" x="2925.65" y="258.246">at startup from beer-styles.json.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="245.0108" x="2925.65" y="276.474">Passed as std::span&lt;const BeerStyle&gt;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="251.7031" x="2925.65" y="294.702">to IBeerSelectionStrategy per brewery.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="247.8108" x="2925.65" y="312.93">RunBeerPhase() is a sequential loop &#8212;</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="234.9834" x="2925.65" y="331.158">no channels, no fan-out. Enrichment</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="220.4059" x="2925.65" y="349.386">is cache hits; LLM is the only cost.</text></g><!--class JsonLoader--><g class="entity" data-qualified-name="Orchestration.JsonLoader" data-source-line="464" id="ent0081"><rect fill="#FAFCF9" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="533.1451" x="2415.43" y="701.57"/><rect fill="#EAF0E8" height="28.228" rx="2.5" ry="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="533.1451" x="2415.43" y="701.57"/><rect fill="#EAF0E8" height="2.5" style="stroke:#EAF0E8;stroke-width:0.5;" width="533.1451" x="2415.43" y="727.298"/><rect fill="none" height="80.684" rx="2.5" ry="2.5" style="stroke:#547461;stroke-width:0.5;" width="533.1451" x="2415.43" y="701.57"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="2644.2095" y="720.458">JsonLoader</text><line style="stroke:#547461;stroke-width:0.5;" x1="2416.43" x2="2947.5751" y1="729.798" y2="729.798"/><line style="stroke:#547461;stroke-width:0.5;" x1="2416.43" x2="2947.5751" y1="737.798" y2="737.798"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="2426.43" cy="752.412" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" text-decoration="underline" textLength="497.092" x="2434.43" y="755.686">LoadLocations(filepath : const std::filesystem::path&amp;) : std::vector&lt;Location&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="2426.43" cy="770.64" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" text-decoration="underline" textLength="508.1451" x="2434.43" y="773.914">LoadBeerStyles(filepath : const std::filesystem::path&amp;) : std::vector&lt;BeerStyle&gt;</text></g><g class="entity" data-qualified-name="Orchestration.GMN82" data-source-line="469" id="ent0083"><path d="M2983.09,700.46 L2983.09,783.372 L3188.9182,783.372 L3188.9182,710.46 L3178.9182,700.46 L2983.09,700.46" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3178.9182,700.46 L3178.9182,710.46 L3188.9182,710.46 L3178.9182,700.46" fill="#EAF0E8" style="stroke:#547461;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="159.9431" x="2989.09" y="719.348">LoadBeerStyles() added.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="184.8282" x="2989.09" y="737.576">Reads beer-styles.json once</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="168.6409" x="2989.09" y="755.804">at startup into the palette</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="161.6514" x="2989.09" y="774.032">held by the orchestrator.</text></g><!--link BeerStyle to GMN7--><g class="link" data-entity-1="ent0006" data-entity-2="ent0008" data-link-type="association" data-source-line="74" id="lnk9"><path d="M206.16,289.92 C217.63,289.92 229.11,289.92 240.58,289.92" fill="none" id="BeerStyle-GMN7" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link UserResult to GMN13--><g class="link" data-entity-1="ent0012" data-entity-2="ent0014" data-link-type="association" data-source-line="106" id="lnk15"><path d="M608.25,741.91 C619.72,741.91 631.19,741.91 642.67,741.91" fill="none" id="UserResult-GMN13" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GeneratedUser to GMN21--><g class="link" data-entity-1="ent0020" data-entity-2="ent0022" data-link-type="association" data-source-line="146" id="lnk23"><path d="M730.35,289.92 C741.93,289.92 753.51,289.92 765.08,289.92" fill="none" id="GeneratedUser-GMN21" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link IBeerSelectionStrategy to GMN33--><g class="link" data-entity-1="ent0032" data-entity-2="ent0034" data-link-type="association" data-source-line="202" id="lnk35"><path d="M6625.27,1596.67 C6636.71,1596.67 6648.16,1596.67 6659.6,1596.67" fill="none" id="IBeerSelectionStrategy-GMN33" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link RandomBeerSelectionStrategy to GMN37--><g class="link" data-entity-1="ent0036" data-entity-2="ent0038" data-link-type="association" data-source-line="216" id="lnk39"><path d="M7010.27,1830.26 C7021.82,1830.26 7033.37,1830.26 7044.91,1830.26" fill="none" id="RandomBeerSelectionStrategy-GMN37" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link ICheckinDistributionStrategy to GMN41--><g class="link" data-entity-1="ent0040" data-entity-2="ent0042" data-link-type="association" data-source-line="228" id="lnk43"><path d="M7479.54,1596.67 C7490.98,1596.67 7502.42,1596.67 7513.86,1596.67" fill="none" id="ICheckinDistributionStrategy-GMN41" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link WikipediaService to GMN48--><g class="link" data-entity-1="ent0047" data-entity-2="ent0049" data-link-type="association" data-source-line="259" id="lnk50"><path d="M5342.7,1194.25 C5353.96,1194.25 5365.23,1194.25 5376.49,1194.25" fill="none" id="WikipediaService-GMN48" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link DataGenerator to GMN55--><g class="link" data-entity-1="ent0054" data-entity-2="ent0056" data-link-type="association" data-source-line="290" id="lnk57"><path d="M3622.93,741.91 C3634.22,741.91 3645.5,741.91 3656.79,741.91" fill="none" id="DataGenerator-GMN55" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link BoundedChannel to GMN65--><g class="link" data-entity-1="ent0064" data-entity-2="ent0066" data-link-type="association" data-source-line="359" id="lnk67"><path d="M5795.69,289.92 C5807.18,289.92 5818.67,289.92 5830.15,289.92" fill="none" id="BoundedChannel-GMN65" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link SqliteExportService to GMN71--><g class="link" data-entity-1="ent0070" data-entity-2="ent0072" data-link-type="association" data-source-line="409" id="lnk73"><path d="M4586.79,1194.25 C4598.38,1194.25 4609.97,1194.25 4621.57,1194.25" fill="none" id="SqliteExportService-GMN71" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link BiergartenPipelineOrchestrator to GMN78--><g class="link" data-entity-1="ent0077" data-entity-2="ent0079" data-link-type="association" data-source-line="455" id="lnk80"><path d="M2885.51,289.92 C2896.83,289.92 2908.15,289.92 2919.48,289.92" fill="none" id="BiergartenPipelineOrchestrator-GMN78" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link JsonLoader to GMN82--><g class="link" data-entity-1="ent0081" data-entity-2="ent0083" data-link-type="association" data-source-line="469" id="lnk84"><path d="M2948.7,741.91 C2960.06,741.91 2971.41,741.91 2982.76,741.91" fill="none" id="JsonLoader-GMN82" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/></g><!--reverse link BiergartenPipelineOrchestrator to IEnrichmentService--><g class="link" data-entity-1="ent0077" data-entity-2="ent0046" data-link-type="composition" data-source-line="482" id="lnk85"><path codeLine="482" d="M2896.6354,487.4502 C2902.0754,489.7602 2896.5,487.22 2902,489.2 C2963.11,511.25 4006.06,517.25 4071,519.2 C4250.8,524.62 4711.38,484.54 4880,547.2 C4960.51,577.12 5034.52,645.31 5078.71,692.25" fill="none" id="BiergartenPipelineOrchestrator-backto-IEnrichmentService" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2885.59,482.76,2889.5493,488.7869,2896.6354,487.4502,2892.6761,481.4233,2885.59,482.76" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="4847.62" y="534.088">owns</text></g><!--reverse link BiergartenPipelineOrchestrator to DataGenerator--><g class="link" data-entity-1="ent0077" data-entity-2="ent0054" data-link-type="composition" data-source-line="483" id="lnk86"><path codeLine="483" d="M2896.032,486.5983 C2901.572,489.4083 2896.43,486.67 2902,489.2 C3027.99,546.53 3083.17,487.38 3208,547.2 C3233.11,559.24 3257.69,574.76 3280.84,591.77" fill="none" id="BiergartenPipelineOrchestrator-backto-DataGenerator" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2885.33,481.17,2888.8716,487.4515,2896.032,486.5983,2892.4905,480.3168,2885.33,481.17" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="3187.25" y="534.088">owns</text></g><!--reverse link BiergartenPipelineOrchestrator to IExportService--><g class="link" data-entity-1="ent0077" data-entity-2="ent0069" data-link-type="composition" data-source-line="484" id="lnk87"><path codeLine="484" d="M2896.2625,487.2229 C2901.8125,489.6529 2896.4,487.11 2902,489.2 C3023.8,534.79 3947.93,505.18 4071,547.2 C4133.49,568.54 4194.63,608.41 4243.58,646.46" fill="none" id="BiergartenPipelineOrchestrator-backto-IExportService" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2885.27,482.41,2889.1619,488.4806,2896.2625,487.2229,2892.3706,481.1523,2885.27,482.41" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="4027.9" y="534.088">owns</text></g><!--reverse link BiergartenPipelineOrchestrator to ICheckinDistributionStrategy--><g class="link" data-entity-1="ent0077" data-entity-2="ent0040" data-link-type="composition" data-source-line="485" id="lnk88"><path codeLine="485" d="M2896.6275,487.4839 C2902.0775,489.7539 2896.49,487.26 2902,489.2 C2970.95,513.52 5460.96,515.84 5534,519.2 C5688.12,526.31 5735.99,491.85 5880,547.2 C6458.7,769.65 6997.27,1317.87 7182.24,1519.58" fill="none" id="BiergartenPipelineOrchestrator-backto-ICheckinDistributionStrategy" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2885.55,482.87,2889.5508,488.8695,2896.6275,487.4839,2892.6267,481.4845,2885.55,482.87" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="6549.58" y="936.508">owns</text></g><!--reverse link BiergartenPipelineOrchestrator to ISamplingStrategy--><g class="link" data-entity-1="ent0077" data-entity-2="ent0030" data-link-type="composition" data-source-line="486" id="lnk89"><path codeLine="486" d="M2896.6203,487.5012 C2902.0703,489.7812 2896.49,487.26 2902,489.2 C2975.89,515.23 5643.71,516.52 5722,519.2 C5936.9,526.57 5998.85,486.07 6205,547.2 C6984.37,778.31 7789.51,1393.75 7993.05,1556" fill="none" id="BiergartenPipelineOrchestrator-backto-ISamplingStrategy" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2885.55,482.87,2889.5414,488.8757,2896.6203,487.5012,2892.6289,481.4955,2885.55,482.87" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="7076.54" y="936.508">owns</text></g><!--reverse link BiergartenPipelineOrchestrator to IBeerSelectionStrategy--><g class="link" data-entity-1="ent0077" data-entity-2="ent0032" data-link-type="composition" data-source-line="487" id="lnk90"><path codeLine="487" d="M2896.6303,487.4712 C2902.0803,489.7512 2896.49,487.25 2902,489.2 C3046.8,540.57 5531.79,474.24 5667,547.2 C6093.97,777.62 6332.27,1372.68 6394.46,1547" fill="none" id="BiergartenPipelineOrchestrator-backto-IBeerSelectionStrategy" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2885.56,482.84,2889.5514,488.8457,2896.6303,487.4712,2892.6389,481.4655,2885.56,482.84" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="6081.82" y="936.508">owns</text></g><!--link BiergartenPipelineOrchestrator to JsonLoader--><g class="link" data-entity-1="ent0077" data-entity-2="ent0081" data-link-type="dependency" data-source-line="488" id="lnk91"><path codeLine="488" d="M2664.13,489.61 C2669.79,569.19 2675.3341,647.2351 2678.7441,695.1551" fill="none" id="BiergartenPipelineOrchestrator-to-JsonLoader" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#628A5B" points="2679.17,701.14,2682.5211,691.8788,2678.8151,696.1526,2674.5413,692.4466,2679.17,701.14" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="30.044" x="2667.96" y="534.088">uses</text></g><!--reverse link IContextStrategy to BreweryContextStrategy--><g class="link" data-entity-1="ent0027" data-entity-2="ent0028" data-link-type="extension" data-source-line="491" id="lnk92"><path codeLine="491" d="M6016.2628,1654.9133 C6096.7028,1697.4433 6195.97,1749.93 6270.87,1789.54" fill="none" id="IContextStrategy-backto-BreweryContextStrategy" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="6000.35,1646.5,6013.4583,1660.2176,6019.0672,1649.6091,6000.35,1646.5" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="6141.13" y="1718.348">implements</text></g><!--reverse link IContextStrategy to BeerContextStrategy--><g class="link" data-entity-1="ent0027" data-entity-2="ent0029" data-link-type="extension" data-source-line="492" id="lnk93"><path codeLine="492" d="M5908,1664.5 C5908,1707.1 5908,1750.12 5908,1789.72" fill="none" id="IContextStrategy-backto-BeerContextStrategy" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="5908,1646.5,5902,1664.5,5914,1664.5,5908,1646.5" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="5909" y="1718.348">implements</text></g><!--reverse link ISamplingStrategy to UniformSamplingStrategy--><g class="link" data-entity-1="ent0030" data-entity-2="ent0031" data-link-type="extension" data-source-line="493" id="lnk94"><path codeLine="493" d="M8050.9531,1655.2667 C8057.5631,1697.8167 8065.23,1747.08 8071.83,1789.58" fill="none" id="ISamplingStrategy-backto-UniformSamplingStrategy" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="8048.19,1637.48,8045.0242,1656.1877,8056.882,1654.3456,8048.19,1637.48" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="8062.08" y="1718.348">implements</text></g><!--reverse link IBeerSelectionStrategy to RandomBeerSelectionStrategy--><g class="link" data-entity-1="ent0032" data-entity-2="ent0036" data-link-type="extension" data-source-line="494" id="lnk95"><path codeLine="494" d="M6507.6042,1655.7788 C6563.5242,1689.4188 6623.13,1725.27 6684.63,1762.27" fill="none" id="IBeerSelectionStrategy-backto-RandomBeerSelectionStrategy" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="6492.18,1646.5,6504.5112,1660.9201,6510.6971,1650.6374,6492.18,1646.5" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="6616.04" y="1718.348">implements</text></g><!--reverse link ICheckinDistributionStrategy to JCurveCheckinStrategy--><g class="link" data-entity-1="ent0040" data-entity-2="ent0044" data-link-type="extension" data-source-line="495" id="lnk96"><path codeLine="495" d="M7368.0834,1684.4807 C7402.6934,1709.9207 7426.75,1727.61 7461.36,1753.06" fill="none" id="ICheckinDistributionStrategy-backto-JCurveCheckinStrategy" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="7353.58,1673.82,7364.5299,1689.3152,7371.637,1679.6462,7353.58,1673.82" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="7417.94" y="1718.348">implements</text></g><!--reverse link IEnrichmentService to WikipediaService--><g class="link" data-entity-1="ent0046" data-entity-2="ent0047" data-link-type="extension" data-source-line="498" id="lnk97"><path codeLine="498" d="M5122.4806,809.5355 C5124.2806,890.3855 5127.48,1034.63 5129.51,1126.26" fill="none" id="IEnrichmentService-backto-WikipediaService" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="5122.08,791.54,5116.4821,809.6691,5128.4792,809.402,5122.08,791.54" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="5126.4" y="936.508">implements</text></g><!--reverse link WikipediaService to WebClient--><g class="link" data-entity-1="ent0047" data-entity-2="ent0051" data-link-type="composition" data-source-line="499" id="lnk98"><path codeLine="499" d="M5131,1274.27 C5131,1354.64 5131,1475.42 5131,1546.75" fill="none" id="WikipediaService-backto-WebClient" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="5131,1262.27,5127,1268.27,5131,1274.27,5135,1268.27,5131,1262.27" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="5132" y="1461.758">owns</text></g><!--link WikipediaService to IContextStrategy--><g class="link" data-entity-1="ent0047" data-entity-2="ent0027" data-link-type="dependency" data-source-line="500" id="lnk99"><path codeLine="500" d="M5181.49,1262.28 C5223.36,1312.88 5287.46,1379.75 5359,1416.87 C5482.64,1481.03 5535.01,1430.34 5667,1474.87 C5721.66,1493.31 5774.2855,1519.1116 5819.6255,1543.9016" fill="none" id="WikipediaService-to-IContextStrategy" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#628A5B" points="5824.89,1546.78,5818.9122,1538.9527,5820.5029,1544.3813,5815.0743,1545.9721,5824.89,1546.78" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="112.4307" x="5637.77" y="1461.758">uses (parameter)</text></g><!--reverse link WebClient to CURLWebClient--><g class="link" data-entity-1="ent0051" data-entity-2="ent0052" data-link-type="extension" data-source-line="501" id="lnk100"><path codeLine="501" d="M5131,1664.5 C5131,1707.1 5131,1750.12 5131,1789.72" fill="none" id="WebClient-backto-CURLWebClient" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="5131,1646.5,5125,1664.5,5137,1664.5,5131,1646.5" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="5132" y="1718.348">implements</text></g><!--reverse link DataGenerator to MockGenerator--><g class="link" data-entity-1="ent0054" data-entity-2="ent0058" data-link-type="extension" data-source-line="504" id="lnk101"><path codeLine="504" d="M3435,909.93 C3435,985.36 3435,1055.7 3435,1117.15" fill="none" id="DataGenerator-backto-MockGenerator" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="3435,891.93,3429,909.93,3441,909.93,3435,891.93" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="3436" y="936.508">implements</text></g><!--reverse link DataGenerator to LlamaGenerator--><g class="link" data-entity-1="ent0054" data-entity-2="ent0059" data-link-type="extension" data-source-line="505" id="lnk102"><path codeLine="505" d="M3586.602,905.0794 C3632.332,953.9994 3670.85,995.2 3716.59,1044.13" fill="none" id="DataGenerator-backto-LlamaGenerator" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="3574.31,891.93,3582.2188,909.1768,3590.9851,900.9821,3574.31,891.93" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="3621.29" y="936.508">implements</text></g><!--reverse link LlamaGenerator to IPromptFormatter--><g class="link" data-entity-1="ent0059" data-entity-2="ent0060" data-link-type="composition" data-source-line="506" id="lnk103"><path codeLine="506" d="M3776.9508,1355.1067 C3743.6908,1422.3667 3711.67,1487.12 3686.69,1537.65" fill="none" id="LlamaGenerator-backto-IPromptFormatter" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="3782.27,1344.35,3776.0249,1347.9553,3776.9508,1355.1067,3783.196,1351.5014,3782.27,1344.35" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="3731.56" y="1461.758">owns</text></g><!--link LlamaGenerator to LlamaConfig--><g class="link" data-entity-1="ent0059" data-entity-2="ent0062" data-link-type="dependency" data-source-line="507" id="lnk104"><path codeLine="507" d="M3886.53,1344.35 C3898.74,1403.94 3911.0668,1464.1219 3921.1868,1513.5619" fill="none" id="LlamaGenerator-to-LlamaConfig" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#628A5B" points="3922.39,1519.44,3924.5039,1509.8207,3921.3873,1514.5416,3916.6664,1511.425,3922.39,1519.44" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.5593" x="3912.48" y="1461.758">constructed with</text></g><!--reverse link IPromptFormatter to Gemma4JinjaPromptFormatter--><g class="link" data-entity-1="ent0060" data-entity-2="ent0061" data-link-type="extension" data-source-line="508" id="lnk105"><path codeLine="508" d="M3658,1673.51 C3658,1715.31 3658,1752.69 3658,1789.57" fill="none" id="IPromptFormatter-backto-Gemma4JinjaPromptFormatter" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="3658,1655.51,3652,1673.51,3664,1673.51,3658,1655.51" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="3659" y="1718.348">implements</text></g><!--reverse link IExportService to SqliteExportService--><g class="link" data-entity-1="ent0069" data-entity-2="ent0070" data-link-type="extension" data-source-line="511" id="lnk106"><path codeLine="511" d="M4349,855.32 C4349,894.65 4349,924.13 4349,971.41" fill="none" id="IExportService-backto-SqliteExportService" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="4349,837.32,4343,855.32,4355,855.32,4349,837.32" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="4350" y="936.508">implements</text></g><!--reverse link SqliteExportService to IDateTimeProvider--><g class="link" data-entity-1="ent0070" data-entity-2="ent0074" data-link-type="composition" data-source-line="512" id="lnk107"><path codeLine="512" d="M4349,1429.12 C4349,1482.71 4349,1522.21 4349,1556.01" fill="none" id="SqliteExportService-backto-IDateTimeProvider" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="4349,1417.12,4345,1423.12,4349,1429.12,4353,1423.12,4349,1417.12" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="34.0411" x="4350" y="1461.758">owns</text></g><!--reverse link IDateTimeProvider to SystemDateTimeProvider--><g class="link" data-entity-1="ent0074" data-entity-2="ent0075" data-link-type="extension" data-source-line="513" id="lnk108"><path codeLine="513" d="M4349,1655.48 C4349,1701.26 4349,1757.42 4349,1798.82" fill="none" id="IDateTimeProvider-backto-SystemDateTimeProvider" style="stroke:#628A5B;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="4349,1637.48,4343,1655.48,4355,1655.48,4349,1637.48" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="76.65" x="4350" y="1718.348">implements</text></g><!--reverse link EnrichedCity to Location--><g class="link" data-entity-1="ent0005" data-entity-2="ent0003" data-link-type="composition" data-source-line="516" id="lnk109"><path codeLine="516" d="M1539.4136,341.1106 C1516.9536,381.5506 1486.28,435.31 1452,489.2 C1418.29,542.19 1378.48,599.81 1345.35,646.54" fill="none" id="EnrichedCity-backto-Location" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1545.24,330.62,1538.8299,333.9232,1539.4136,341.1106,1545.8237,337.8074,1545.24,330.62" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1430.33" y="534.088">contains</text></g><!--reverse link EnrichedCity to LocationContext--><g class="link" data-entity-1="ent0005" data-entity-2="ent0004" data-link-type="composition" data-source-line="517" id="lnk110"><path codeLine="517" d="M1567,342.46 C1567,414.84 1567,558.15 1567,655.6" fill="none" id="EnrichedCity-backto-LocationContext" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1567,330.46,1563,336.46,1567,342.46,1571,336.46,1567,330.46" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1568" y="534.088">contains</text></g><!--reverse link GeneratedBrewery to Location--><g class="link" data-entity-1="ent0018" data-entity-2="ent0003" data-link-type="composition" data-source-line="518" id="lnk111"><path codeLine="518" d="M1244.0123,369.7629 C1250.8123,446.2729 1260.93,560.15 1268.62,646.59" fill="none" id="GeneratedBrewery-backto-Location" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1242.95,357.81,1239.4969,364.1406,1244.0123,369.7629,1247.4655,363.4323,1242.95,357.81" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1259.2" y="534.088">contains</text></g><!--reverse link GeneratedBrewery to BreweryResult--><g class="link" data-entity-1="ent0018" data-entity-2="ent0010" data-link-type="composition" data-source-line="519" id="lnk112"><path codeLine="519" d="M1194.8517,368.3491 C1146.8617,456.4891 1068.97,599.54 1023.55,682.97" fill="none" id="GeneratedBrewery-backto-BreweryResult" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1200.59,357.81,1194.2078,361.1668,1194.8517,368.3491,1201.2339,364.9923,1200.59,357.81" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1108.15" y="534.088">contains</text></g><!--reverse link GeneratedBeer to Location--><g class="link" data-entity-1="ent0019" data-entity-2="ent0003" data-link-type="composition" data-source-line="520" id="lnk113"><path codeLine="520" d="M1758.7175,368.49 C1737.4375,408.25 1713.68,448.16 1682,489.2 C1662.8,514.08 1660.78,526.58 1632,539.2 C1592.69,556.45 1477.5,528.23 1439,547.2 C1394.96,568.91 1358.44,608.7 1331.3,646.6" fill="none" id="GeneratedBeer-backto-Location" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1764.38,357.91,1758.0221,361.3125,1758.7175,368.49,1765.0754,365.0875,1764.38,357.91" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1660.8" y="534.088">contains</text></g><!--reverse link GeneratedBeer to BeerResult--><g class="link" data-entity-1="ent0019" data-entity-2="ent0011" data-link-type="composition" data-source-line="521" id="lnk114"><path codeLine="521" d="M1801.68,369.7969 C1805.38,448.9969 1810.98,569.07 1815.02,655.57" fill="none" id="GeneratedBeer-backto-BeerResult" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="1801.12,357.81,1797.4044,363.9901,1801.68,369.7969,1805.3956,363.6168,1801.12,357.81" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1810.13" y="534.088">contains</text></g><!--reverse link GeneratedUser to Location--><g class="link" data-entity-1="ent0020" data-entity-2="ent0003" data-link-type="composition" data-source-line="522" id="lnk115"><path codeLine="522" d="M657.3851,359.855 C674.1051,405.405 699.96,455.45 748,489.2 C856.45,565.41 910.72,520.96 1042,539.2 C1058.38,541.48 1101.43,539.38 1116,547.2 C1158.58,570.05 1194.4,609.27 1221.36,646.46" fill="none" id="GeneratedUser-backto-Location" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="653.25,348.59,651.5625,355.6009,657.3851,359.855,659.0725,352.8442,653.25,348.59" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="1043" y="534.088">contains</text></g><!--reverse link GeneratedUser to UserResult--><g class="link" data-entity-1="ent0020" data-entity-2="ent0012" data-link-type="composition" data-source-line="523" id="lnk116"><path codeLine="523" d="M618.8454,360.4806 C596.7654,449.9706 557.64,608.6 537.02,692.18" fill="none" id="GeneratedUser-backto-UserResult" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="621.72,348.83,616.3992,353.6971,618.8454,360.4806,624.1663,355.6135,621.72,348.83" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="578.17" y="534.088">contains</text></g><!--reverse link GeneratedCheckin to CheckinResult--><g class="link" data-entity-1="ent0024" data-entity-2="ent0016" data-link-type="composition" data-source-line="524" id="lnk117"><path codeLine="524" d="M2035.9052,369.7868 C2041.8152,464.7768 2051.71,623.83 2056.52,701.1" fill="none" id="GeneratedCheckin-backto-CheckinResult" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2035.16,357.81,2031.5403,364.0468,2035.9052,369.7868,2039.5249,363.55,2035.16,357.81" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="2046.84" y="534.088">contains</text></g><!--reverse link GeneratedRating to RatingResult--><g class="link" data-entity-1="ent0025" data-entity-2="ent0017" data-link-type="composition" data-source-line="525" id="lnk118"><path codeLine="525" d="M2262,369.81 C2262,464.8 2262,623.83 2262,701.1" fill="none" id="GeneratedRating-backto-RatingResult" style="stroke:#628A5B;stroke-width:1;"/><polygon fill="#628A5B" points="2262,357.81,2258,363.81,2262,369.81,2266,363.81,2262,357.81" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="55.8566" x="2263" y="534.088">contains</text></g><?plantuml-src xHjhS-EsyRj_1UOwlSgDvTuhbqIzyOnFbdAw-6n7jfDssWu74c69Pufa258-DxsP_8ZymloIxYu0Fa1GjEyoFQNjJ1uMiRjOO1_ONIpaTH0bFEKh9hFRKC1_qs2UvQjmHnOZlhZYUPYDuoWxuIl17XozOUSyaW_SCEV1FmLx_Amoc0LPA4hqx-BmUXcl7xWW2Fd9eyhGZC-l5scSH_um3kEK_MvyE1wEltBFhK6UVFdqsPD35_qsWCCqZM_quFCdNnv-_dAdCZeFkPJinnt6NhPmmzWhmNsHDiP7X-D7eoyHCqvXN7_z_DaNpvu_Xg-EUHbhClg-oaqKPyBDJCTa7NGJ8CSNBQJ7JyRFnu_kHvfsdLqi1NiPY7J1qqn4x8Xdd9q5YGY3IB1VVlePzc2-3381QfUAdPq_i5z-_caR_W5EZaxV74vE1koxm-FB4Jjz-Neql3ZV8WwDn1uSnIiUHC0e3tF1JcTlOJSbUyY689QKmzyFGAeW9gN8n_6SPq4SaQGP-upDW-oM3S3u_S40FK2qq0CouvdmaZHU1z5SE4426Jzz_FovzyGvEWSLojBRZPYFdQCXC1bw8OyMEInH6fWrh2nENrJW3mm2h2dBVUJIZ_DPA0f2qQ8nyBwv6xXNubrMR0hzSAzfbOG2T5b8P6jO-MaWbZprQEb805oQbz58lq__U_52HFdguA29Eix3aFuu0sC9kFhxS2P5bDMP7aNWfvV27wBaVgni6SbrK2ogO3dIox5MMwVwKeZqdCu1Gp92Z-tQ15_8UHeaUhhc-2g8F3vRmzXL6FFCVENlN5y1DfZby3M8gf3LR-_XNt9yQR1OPYo-AfabZECOtA_FObHJdg7YfbcUiAiqNj7u3A3xTCR9_RSIc5u7dBs6FmWntTUxBYKGuL8lAE7H2zWwcPMJAMtBOZQXJo84VOGzE0SpoyJYLj7v6YGAly4Rfc8kWZMeRmPUK1Aqy0b6dRSm5MVaVa4DKdA7GSOYiHOfGQLmgYZaX8EcmFhz06Xc8Sqa8fysfIB1LDo8z7Og99o8DIbw8keIP1i8ePCzTb9mGragjcNSAKU7qd2DDDMrhfR5oYvbOsKvV6gre5aGkoS4XLg3MNitWbIzdBnf0-MSX6oZ0bl18WADdjtI-6Iu57Cuxuy2d76MLpLN4RX2BKHrkm9FHFop98v3yDKq3gvl5O0M-lliA2MzVjsVv-bQsU1SKMVhECnXqGaW8mMtfcfMh1qZ4iBtq7kulIzjm0O5cu9xYnOMMJcFKs69iOkGDcBXQvigYCtKRo_m4Vs746ANfy1mzlnPfn_Mg31GCzIwb_Qi0yPosOE1uyHP66PTs-PS5DXXkIBuqRwSZralpZAe6Fs7iekANZEh3-66r7bW6qqdDxRHrPWY4eQX94xo44Uq8Pr_Umpi4KWG0Kospux1QjZu6pRdQHe089WB6XZ1NC61OMo8Wy6afCfm1bo9LC319jsMLF2ZJQfkJ7YsjctLvetibBlXTL0tvW-LiRBSEqfviyfshbnlxQ3cBkx8-FjjJ5BOsUdnPFZNxKrEs5aS1lDRdOY0B4HwnI5OcsYtPiuXY8wBGGYHZJPycmkm5pcEqnuOE8X5nMN6mX_kTYS8R_WxFTSGudFPswq6v-yRCPJDrwVWH62c_GdPg8ZfdCEX0yWTSY8mqJDEM1QCLNanJ1uqk2n6hDWg2i0vhXeyg5dxJDAi7Z5VJxb-VOugU-9C0TesXk0eXv2zCWvGhDYnniEzlqUi2Fa76z8HczrQej8ykzmi4uj7OXv0iCoMyGraNz4jkLXCJpIp1BGGcQIpwMO9-QSAc-53MYOtAWCQKlBhL-9Cmf95lWR9MWwor4Tr62-2EGlnR5p2MRT78C0v7eyOZSOfU7IPgPmA_bcO1Cjz8avXhdZbbevHcJHQU6RlLjdZhxvw-eKUmNIKrcwfKf-IKjV8jaXtmxgLY5D-Wn9D2KuLPt2B_mPBtiFL_KD9JvcCP3T1jepp32AG90HjNWa0Bp9gmp_amdmTmqbh12gqMYWe28FqVjYogfu1xNb9YpaTKcfpg1EUxodVaJsC6UnIKIrSK_QDx6ewUcRqepZUqp6Y9JWSKb8pGL6zkhDhwyD5i09zXMr4_zn5CuXyyQvEgoC4xKpaJc_0qN58uR221q019hu9dS030j1v6wjbYYXWPNkpF0KXmgYuHf5bPZbopqYrJwkgftnkQtmzn9aqntUsm_yr4MzRM3av6KyFpo-cbyEBo-bem4OdqydmrPlHoSKsnfYJw2hbi9ivtI8CT7qKzRaPS9PZvo9T1_39xMA-5fcLUhiZBHAmD7fjXksubhHoO_Nr--0wI8GVSCEMCP5v602pXPNaKV13BhmaIrzyBsP36ZpGe40Kw_tUd8DbLZ3eqWOocXLFgf7W7dE4XV-HTIEpOv7DboF5SG-MPDyJUEj0tDp57TexH_IjhRWMjrG8OseYHKqTTrGBIL045Dv4WgVznuyU_PuHAbi6cJhB95s2b84aU0a1JXPhjBVi2XUZQxj-ZiGfSZ6n099lFm0BERQhOYzFmthegfRmSDTP9hjCmr4qZttHMzETqDqmAzeul9mUbsnz0aQst1z-FJePJGyl9gSdlmL_g8yaKDk6FyGBsVB2eat_r8cc0zXUfSRcSWhbTLDzL9i_oTjL02sc0OFijPUVQ8wFP44xBrNrjy9knPzTipJCKGpHFlkkgy9eS7KeSjSGf2E3AAAoLgDorUKCBLNvwcP5kCPnT_H6jvRQTflbjQRhhcbVzVACbA2yFwlVzjMlpVQPkhIK9kbHCE1fLGZdGsOhoMDJXXceSNSgl4Tf9oQXxc3sJJo_BgsbpJxsz_VlfEC6RgEkQQ1EfT9mTv2vXcpKFlli2FSJia5A6LvnkUpGT5VLwZZaAsxl4IJFS0Q469AymJzUWNYqCFl5nGVTfjEVjU44Kiuayx02n27ZJ5sHqEICWCO6vg0aVHLGXa5i3UbdP-hnNoDFlDtkgJqe1LXkH3rLwZCuDe11UIipiVBKjk-fGhp-WHQFLP0iXhnGxh45cE2AfwwZlu_TA84FN9B0grq-lSgqTatDacFBWQJ6wvmwWaVYjyB_dU9Bf3zwbr0rgy6rZMxVPS1kF7iTH6-vlGwBSosoNstcYb2BgPJ59JnREcU2dKjGY_B6rMWM9rxY-7ODtt8GnzCdHHOSUVFiNVEp5CAlNf9lUJ1tDZaR7KzEHcpuwl3aP7JyMmZfYXwwuP97aGXhBLuFNcBl7bu9qjYBYuC7U6ZMlnQk6PneNcQBz0imZD_EmI6NVX9_wH4u6Jti4oW6mR_u0NLQh7aQy5dXmH4Ij2sxxGQTSrXne26hnTTv64l8OE7pp5oOOjqrydjW9YluV67LVQOgTYYD9wOk41wQjNt6XaYpxeqQRKQrBIEyIsmImijQz2nx9bZRmuYZsWVn9tt9c2ovL7Ut9jN43uYCKOmCiDQgyai1MnzXtnT4jt52tK2YA5QeQsHLrIiJKunNs1MF-d6k82AmF5M5BuENRIyj_UNiTFhRA2kzI-BKLLAYxvlBIPCeGD62IlSiHOMZOYwaDC56P_2_stAfRUXGzjGUjdUWTzL8Ez1Dz58s1rX4D40N7HtQ51Vr5XKrR9Twnq7KsE7A8NbEqzM5PNmW1YeUPbIgtTLl2JCXNn5O-JtJGCPB-ZDlIJ4hOgbvCBMPWQNNObdL1-APgDgJsIehKSwntnQDtOLZ4kBxe62Nn3tWALIw1xn9_kw1eWHw9mn8oIB9AJtpuaH4DT_VBoe0zoXsLjNDIAuezty4bVzRzwUoRfMrcBq_1xvMt1u_IqN2qrB9f0qmZSCGtvaSHZv512VnnJADRsmmCx-RK3DqSBWRTRbMrxXKICYJpStvDwPENIJUIkymu220udlj2hsCFW3Lw1WuA0WdibiALb1dL9FvDpXb7Afh-VAEjq-LSLqLRxcejTrVUxtwCfiNDsIzZPNcSqhY6fJlHMlB8fpJwV3L22AShQqFdnOD5ML9MFSS5KzrJ89nMcs-CCTb6PTwKgcsyxXitBKPhrjqSBZGQaN1yceBxQZbMAuPMSEpw_AIkQjoKh2khGeQU89-306fUvOs8zkTJRNfYxhcPXhEUcPH1ojEwarBQEygg3E4vLPFDu1uctfKYZSlVLs6WUFRstXxRybk8u8-CckyRKOGbSgWtf6D27f7Qak1p3AFo0rLWX7uXEoVOMfthrwpwZ6KHtf57qr665QQOtf9RSFgw6sCEXBZZOwYU7HZAqjOFjHHPVhwOvt6GvrVwsMEtOd4x7qAA1jlfk2w5mqVTM45e9PnxrSQ3Kn-NkRcVsR7ns_m4xMmHU4jI55cBKqonLEauk3xaNftvk-fY6kaBNjNGIXqJQ-Y5FXLLKC70npTsCVOe5viuWUJx-XCAvTNlDQgpBdBkE-R06XAJvuQxxLS2WEXHrnz74NZIn5I_6Jt3MvrIMGwEgPOuVpLv6oRNfXYB5CD5NOwmeC_zlkk1fi1YsyYUHVa-ctqtV6i4imz43Vr7jw3JACt-HwuReTrDmBx-mTLvp6WkYBAJVNRCoeleYoK-zXfzjl_Qt-_hUTzKAAtOZfwrEjepSvnn6jhwQxZjdHO8u5DJRuMtvkwIv6KkqEnHWGsjEBgNJraIAZHmbMZqHX5uPSzDbhU3IYKyAIvnLG_xXMNuBixbIOYvANUm6Clfcm8sR4QG12tVijTmtL0MnU-DN1hZDJTlXhJ2xT0STdLMorz7c4j5Y81J5jtcfU5oCw6IxY6ICbfxDZrMwJYgXNMq5q0jBn69glNvqYUQI9t-ckpgb_HO2e2_oSjh3q2nwcFQtVr22VRWORL3Xa5stZos4RK2LX_U-o4nh9LDqq3LNahx8AZDu6Tr0geoljS5vnvF8UWzRUfBcZzLWs1QmzEAx3_1W00?></g></svg>