[{"data":1,"prerenderedAt":325},["ShallowReactive",2],{"i-lucide:chevron-down":3,"i-lucide:arrow-up-right":8,"i-simple-icons:github":10,"i-simple-icons:x":12,"i-brand:linkedin":14,"i-simple-icons:medium":18,"i-lucide:mail":20,"i-lucide:sun":22,"project:\u002Fprojects\u002Fwinch":24,"project-more:\u002Fprojects\u002Fwinch":283,"i-lucide:briefcase-business":305,"i-lucide:calendar":307,"i-lucide:globe":309,"i-simple-icons:raspberrypi":311,"i-lucide:wallet":313,"i-lucide:package":315,"i-lucide:receipt":317,"i-lucide:landmark":319,"i-lucide:truck":321,"i-lucide:plug":323},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"currentColor\" d=\"M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z\"\u002F>",{"left":4,"top":15,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":17},32,448,"\u003Cpath fill=\"currentColor\" d=\"M416 32L31.9 32C14.3 32 0 46.5 0 64.3L0 447.7C0 465.5 14.3 480 31.9 480L416 480c17.6 0 32-14.5 32-32.3l0-383.4C448 46.5 433.6 32 416 32zM135.4 416l-66.4 0 0-213.8 66.5 0 0 213.8-.1 0zM102.2 96a38.5 38.5 0 1 1 0 77 38.5 38.5 0 1 1 0-77zM384.3 416l-66.4 0 0-104c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9l0 105.8-66.4 0 0-213.8 63.7 0 0 29.2 .9 0c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9l0 117.2z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cpath fill=\"currentColor\" d=\"M4.21 0A4.2 4.2 0 0 0 0 4.21v15.58A4.2 4.2 0 0 0 4.21 24h15.58A4.2 4.2 0 0 0 24 19.79v-1.093a5 5 0 0 1-.422.02c-2.577 0-4.027-2.146-4.09-4.832a8 8 0 0 1 .022-.708c.093-1.186.475-2.241 1.105-3.022a3.9 3.9 0 0 1 1.395-1.1c.468-.237 1.127-.367 1.664-.367h.023q.151 0 .303.01V4.211A4.2 4.2 0 0 0 19.79 0Zm.198 5.583h4.165l3.588 8.435l3.59-8.435h3.864v.146l-.019.004c-.705.16-1.063.397-1.063 1.254h-.003l.003 10.274c.06.676.424.885 1.063 1.03l.02.004v.145h-4.923v-.145l.019-.005c.639-.144.994-.353 1.054-1.03V7.267l-4.745 11.15h-.261L6.15 7.569v9.445c0 .857.358 1.094 1.063 1.253l.02.004v.147H4.405v-.147l.019-.004c.705-.16 1.065-.397 1.065-1.253V6.987c0-.857-.358-1.094-1.064-1.254l-.018-.004zm19.25 3.668c-1.086.023-1.733 1.323-1.813 3.124H24V9.298a1.4 1.4 0 0 0-.342-.047m-1.862 3.632c-.1 1.756.86 3.239 2.204 3.634v-3.634z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":23},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"page":25,"project":264},{"id":26,"title":27,"body":28,"description":255,"extension":256,"meta":257,"navigation":258,"path":259,"seo":260,"sitemap":261,"stem":262,"__hash__":263},"projectPages\u002Fprojects\u002Fwinch.md","Winch",{"type":29,"value":30,"toc":238},"minimark",[31,36,40,44,47,76,80,88,94,100,106,112,116,136,140,144,148,155,158,163,170,173,177,184,187,191,194,198,205,208,212,219,222,227],[32,33,35],"h2",{"id":34},"overview","Overview",[37,38,39],"p",{},"WINCH is a Saudi logistics platform for moving goods and vehicles, renting trucks and storing goods. Businesses, carriers, drivers and WINCH's own teams each have an app or dashboard, all served by one back end. I joined in 2023 as a senior software engineer.",[32,41,43],{"id":42},"the-problem","The problem",[37,45,46],{},"When I joined, the back end ran WINCH's own operations, but four things were missing.",[48,49,50,58,64,70],"ul",{},[51,52,53,57],"li",{},[54,55,56],"strong",{},"No business or carrier platform."," Neither had apps, dashboards or APIs of their own.",[51,59,60,63],{},[54,61,62],{},"No structure that could grow."," Most code lived in one folder, so every change touched too much.",[51,65,66,69],{},[54,67,68],{},"Core features solved again and again."," Each feature handled notifications, exports and security its own way.",[51,71,72,75],{},[54,73,74],{},"No common way to integrate."," Each outside platform was wired in differently, with no record of the calls.",[32,77,79],{"id":78},"the-solution","The solution",[81,82,85],"sketch-figure",{"alt":83,"name":84},"Before: features such as orders, invoices, waybills and drivers wired directly to vendors in a tangle of lines. After: more than fifty domains behind contracts sit on four shared components (security, notifications, exports and integrations), and only those components reach the outside platforms.","winch\u002Fbefore-after",[37,86,87],{},"Features stopped talking to vendors directly; shared components do it for them.",[37,89,90,93],{},[54,91,92],{},"The business and carrier platforms."," Businesses and carriers now have their own APIs, apps and dashboards on the same back end.",[37,95,96,99],{},[54,97,98],{},"Domains that stay clean."," The team and I moved the back end into more than 50 domains, each behind a contract.",[37,101,102,105],{},[54,103,104],{},"Core features as generic engines."," Notifications, exports and security are each one engine that every feature uses.",[37,107,108,111],{},[54,109,110],{},"One engine for every integration."," Every outside platform is an app, configured in one place and recorded call by call.",[32,113,115],{"id":114},"what-i-did","What I did",[48,117,118,121,124,127,130,133],{},[51,119,120],{},"Set up the business and carrier platforms and their APIs, and have written most of the business dashboard.",[51,122,123],{},"Designed and built the notification system, the security domain, the integration engine and the foundation of the export system.",[51,125,126],{},"Evolved the Domain-Driven Design structure and led the move of the legacy code into it, mentoring the team along the way.",[51,128,129],{},"Proposed the shared UI package both dashboards use, led its extraction and maintain it.",[51,131,132],{},"Set up the team's AI-assisted workflow: the rules, agents and skills that AI coding agents follow.",[51,134,135],{},"Lead small teams that take features to production, and review the pull requests that keep the structure consistent.",[32,137,139],{"id":138},"what-it-offers","What it offers",[141,142],"feature-grid",{":items":143},"[{\"icon\":\"lucide:package\",\"title\":\"Orders from request to delivery\",\"text\":\"Create orders one by one or from a spreadsheet, and follow each in real time.\"},{\"icon\":\"lucide:receipt\",\"title\":\"Clear pricing\",\"text\":\"Quotations or fixed prices, with every trip's cost broken down.\"},{\"icon\":\"lucide:landmark\",\"title\":\"Government paperwork built in\",\"text\":\"Electronic waybills, driving authorisations and e-invoices to ZATCA's standard.\"},{\"icon\":\"lucide:truck\",\"title\":\"Carrier operations\",\"text\":\"Carriers assign drivers and vehicles and follow every trip.\"},{\"icon\":\"lucide:wallet\",\"title\":\"Earnings and finance\",\"text\":\"Statements, compensation requests, and wallet top-ups and withdrawals.\"},{\"icon\":\"lucide:plug\",\"title\":\"An API for businesses\",\"text\":\"Companies connect their ERP and other systems to WINCH.\"}]",[32,145,147],{"id":146},"system-design","System design",[81,149,152],{"alt":150,"name":151},"Architecture: the business, carrier and driver apps and the control panel call one back end. It has an API for each app, domains behind contracts, and four shared components: security, notifications, exports and the integration engine. The engine connects to government services, payments, AI models and messaging through one pipeline. Behind it sit the database, queues and a scheduler, and a live tracking server.","winch\u002Farchitecture",[37,153,154],{},"Every app talks to one back end, and only the integration engine talks to the outside world.",[37,156,157],{},"One back end serves every app through its own API, on top of the domains and four shared components. Queues and a scheduler run the heavy and recurring work.",[159,160,162],"h3",{"id":161},"the-business-and-carrier-platforms","The business and carrier platforms",[81,164,167],{"alt":165,"name":166},"One front-end codebase with business, carrier and shared pages is built twice, into the business dashboard and the carrier dashboard, both served from a CDN. A shared UI package of inputs, tables, forms and cards feeds the codebase, and permissions decide every route, menu item and button.","winch\u002Ffrontend",[37,168,169],{},"One codebase, two products, and a shared component library underneath.",[37,171,172],{},"Both dashboards share one codebase and UI package, so a fix or a new component reaches both products at once.",[159,174,176],{"id":175},"moving-to-domain-driven-design","Moving to Domain-Driven Design",[81,178,181],{"alt":179,"name":180},"Inside every domain: presentation, then a contract that is the only public door, a service that delegates, actions that do one job each, and models. Another domain calls the contract but never the models. Two charts show the legacy folder emptying over time while the number of domains grows.","winch\u002Fddd",[37,182,183],{},"The legacy folder emptied while the product kept shipping.",[37,185,186],{},"Every domain has the same layers and a contract as its only public door, so one team can change a domain without breaking another. The team moved the legacy code domain by domain without pausing the product.",[159,188,190],{"id":189},"notifications-exports-and-security","Notifications, exports and security",[37,192,193],{},"Each is one engine that every feature uses: a new message is a template, a new export only describes its columns, and every kind of user signs in through the same security domain.",[159,195,197],{"id":196},"the-integration-engine","The integration engine",[81,199,202],{"alt":200,"name":201},"The integration engine: domains and the payment and AI gateways call it. An app registry holds each app's switch, development mode, logging, encrypted settings and rate limits. Every call goes through one pipeline (app active, within limits, run and time it, record it) into a transaction ledger, over a shared HTTP transport. On top sit the apps for government services, payments, AI models, messaging, and maps and tracking.","winch\u002Fintegration-engine",[37,203,204],{},"Every platform WINCH talks to is an app in one engine, and every call it makes is recorded.",[37,206,207],{},"The team writes each integration, such as ZATCA, as a small app with its own settings and limits. Every call is recorded, and an app can be switched off without changing code.",[32,209,211],{"id":210},"ai-in-the-engineering-workflow","AI in the engineering workflow",[81,213,216],{"alt":214,"name":215},"An engineer asks a coding agent for a feature, a fix or a review. The agent loads a project guide first, then only the topic rules in play, then the guide for a layer when a file in it opens. Agents with one job each scaffold, review, audit, build UI and integrations, simplify and rename. The result is a change in the domain structure, formatted after every edit and reviewed against the rules. The engineering handbook teaches the same rules to people.","winch\u002Fai-workflow",[37,217,218],{},"Agents follow the same rules as the engineers, and load only the ones a task needs.",[37,220,221],{},"I set up the rules, agents and skills so the whole team can work with AI coding agents without losing the structure we built.",[37,223,224],{},[54,225,226],{},"What it changed",[48,228,229,232,235],{},[51,230,231],{},"New features start in the right shape, because the scaffold follows the structure the team reviews against.",[51,233,234],{},"Reviews focus on design and behaviour, because structure and formatting are checked first.",[51,236,237],{},"New engineers learn the codebase from the same rules the agents follow.",{"title":239,"searchDepth":240,"depth":240,"links":241},"",2,[242,243,244,245,246,247,254],{"id":34,"depth":240,"text":35},{"id":42,"depth":240,"text":43},{"id":78,"depth":240,"text":79},{"id":114,"depth":240,"text":115},{"id":138,"depth":240,"text":139},{"id":146,"depth":240,"text":147,"children":248},[249,251,252,253],{"id":161,"depth":250,"text":162},3,{"id":175,"depth":250,"text":176},{"id":189,"depth":250,"text":190},{"id":196,"depth":250,"text":197},{"id":210,"depth":240,"text":211},"How I set up WINCH’s business and carrier platforms, moved its back end into more than fifty domains, built generic engines for notifications, exports and security, and an integration engine for every outside platform.","md",{},true,"\u002Fprojects\u002Fwinch",{"description":255},{"loc":259},"projects\u002Fwinch","LRao3X-yvcDr1cHMfOoG0eLCFrxrVmND5IBc20mnthw",{"id":265,"title":266,"context":267,"description":268,"extension":269,"highlight":270,"links":274,"mark":278,"meta":280,"order":273,"stem":262,"year":281,"__hash__":282},"projects\u002Fprojects\u002Fwinch.yml","WINCH · Saudi logistics platform","Senior Software Engineer · Feb 2023 – now","The back end of a Saudi logistics platform for businesses and carriers: more than 50 domains, and the integration engine I built for government services, payments and AI.","yml",{"title":266,"description":271,"period":272,"order":273},"The back end behind every app, and the integration engine I built to connect it to government services, payment gateways and AI models.","2023 – now",1,[275],{"label":276,"to":277},"winch.sa","https:\u002F\u002Fwinch.sa\u002F",{"logo":279},"winch",{},2023,"GqWLC8cevNS0gNwxDytuLM0x9kqXkydlSGth-iZT4aU",[284,291,298],{"path":285,"title":286,"description":287,"mark":288,"year":290},"\u002Fprojects\u002Frunarks","Runarks · Governed access to production databases","My own product: every query against a production database is reviewed, approved, run once and logged, and nobody sees a password.",{"logo":289},"runarks",2026,{"path":292,"title":293,"description":294,"mark":295,"year":297},"\u002Fprojects\u002Fsanad","Sanad · Real-estate investment platform","The API and admin dashboard I built for a Saudi real-estate investment platform: verified investors, a wallet, investments and returns paid on a schedule.",{"logo":296},"sanad",2024,{"path":299,"title":300,"description":301,"mark":302,"year":304},"\u002Fprojects\u002Fiot-wash-stations","IoT car-wash stations","Car-wash bays that start when a Faris card holder scans their card: a Raspberry Pi at every bay, driven by one server I built.",{"icon":303},"simple-icons:raspberrypi",2022,{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":306},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 12h.01M16 6V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v2m14 7a18.15 18.15 0 0 1-20 0\"\u002F>\u003Crect width=\"20\" height=\"14\" x=\"2\" y=\"6\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":308},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 2v3m8-3v3\"\u002F>\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M3 9h18\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":310},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 2a14.5 14.5 0 0 0 0 20a14.5 14.5 0 0 0 0-20M2 12h20\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":312},"\u003Cpath fill=\"currentColor\" d=\"m19.896 10.896l-.173-.303c.007-2.174-1.002-3.06-2.179-3.734c.356-.094.724-.172.825-.619c.611-.156.74-.44.8-.74c.16-.106.696-.406.64-.92c.3-.207.467-.473.382-.85c.322-.35.407-.641.27-.909c.387-.48.215-.73.05-.982c.29-.525.034-1.088-.776-.994c-.322-.473-1.024-.366-1.133-.364c-.121-.152-.281-.282-.775-.219c-.32-.285-.677-.236-1.046-.096c-.438-.34-.727-.068-1.058.036c-.53-.171-.652.063-.912.158c-.578-.12-.754.141-1.03.418l-.323-.006c-.872.506-1.305 1.536-1.459 2.066c-.153-.53-.586-1.56-1.457-2.066l-.323.006C9.942.501 9.766.239 9.19.36C8.927.265 8.806.03 8.276.202C8.059.134 7.86-.007 7.624 0a.7.7 0 0 0-.405.166c-.37-.14-.727-.189-1.046.096c-.494-.063-.654.068-.776.22c-.108-.003-.81-.11-1.133.363c-.81-.094-1.065.47-.776.994c-.165.252-.336.502.05.982c-.136.268-.051.558.27.91c-.084.376.083.642.383.849c-.056.515.48.814.639.92c.061.3.19.584.801.74c.1.448.469.525.825.619c-1.177.673-2.186 1.56-2.18 3.735l-.172.302c-1.349.809-2.562 3.406-.664 5.517c.124.661.332 1.136.517 1.661c.277 2.117 2.084 3.108 2.56 3.226c.699.524 1.443 1.02 2.45 1.37c.948.963 1.976 1.33 3.01 1.33h.046c1.034 0 2.062-.367 3.01-1.33c1.007-.35 1.751-.847 2.45-1.37c.476-.118 2.284-1.109 2.56-3.226c.186-.525.394-1 .517-1.66c1.899-2.112.685-4.71-.664-5.518m-1.04-.371c-.07.876-4.635-3.05-3.846-3.181c2.139-.356 3.919.896 3.847 3.18m-2.015 4.365c-1.148.74-2.802.262-3.695-1.069s-.686-3.01.462-3.75s2.803-.263 3.696 1.068c.892 1.33.686 3.01-.463 3.75M13.66 1.372c.04.197.084.321.135.358c.254-.272.462-.55.788-.813c.001.154-.077.321.117.443a2.3 2.3 0 0 1 .727-.624c-.152.26-.026.34.055.448c.24-.206.468-.414.91-.576c-.12.148-.29.292-.11.461c.247-.154.496-.309 1.083-.418c-.132.147-.406.295-.24.442Q17.59.915 18.158.84c-.182.15-.334.296-.184.412c.332-.102.79-.24 1.237-.121l-.283.285c-.032.038.662.03 1.12.036c-.167.232-.338.456-.437.855c.045.046.272.02.486 0c-.22.462-.6.578-.69.776c.135.101.32.075.524.006c-.158.325-.49.548-.751.812c.066.047.182.075.456.043a4.2 4.2 0 0 1-.88.703c.06.07.272.068.467.072c-.313.307-.717.466-1.095.667c.188.13.323.1.467.097c-.267.22-.722.335-1.144.467c.08.125.16.159.332.194c-.447.247-1.087.134-1.268.26c.044.125.167.206.314.274c-.72.041-2.688-.027-3.065-1.516c.737-.81 2.081-1.76 4.394-2.934c-1.8.602-3.423 1.405-4.782 2.51c-1.598-.744-.496-2.62.283-3.365m-1.613 5.372c1.133-.012 2.536.832 2.53 1.629c-.005.702-.985 1.271-2.52 1.26c-1.505-.017-2.518-.715-2.514-1.395c.002-.56 1.228-1.527 2.504-1.494m-5.764-.6c.172-.036.252-.07.332-.195c-.422-.132-.877-.247-1.145-.466c.145.001.28.031.468-.097c-.378-.201-.782-.36-1.095-.667c.195-.005.406-.002.467-.073a4.2 4.2 0 0 1-.88-.703c.274.032.39.004.456-.043c-.262-.264-.593-.487-.751-.812c.203.069.389.095.523-.006c-.089-.198-.47-.314-.69-.776c.215.02.442.046.487 0c-.1-.399-.27-.623-.437-.855c.458-.007 1.152.002 1.12-.036l-.283-.285c.447-.119.905.019 1.237.121c.15-.116-.002-.263-.184-.412q.569.076 1.034.254C7.106.946 6.833.798 6.7.651c.587.11.836.264 1.083.418c.18-.17.01-.313-.111-.46c.443.161.67.37.911.575c.081-.108.207-.187.055-.448c.315.178.552.389.727.624c.194-.122.116-.289.117-.442c.326.261.534.54.788.812c.05-.037.095-.161.135-.358c.78.745 1.88 2.621.283 3.365C9.33 3.633 7.707 2.83 5.909 2.228c2.312 1.174 3.656 2.124 4.392 2.933c-.377 1.49-2.345 1.558-3.065 1.516c.147-.068.27-.149.314-.273c-.18-.126-.821-.013-1.268-.26m2.817 1.133c.788.13-3.777 4.056-3.847 3.18C5.18 8.174 6.96 6.922 9.1 7.278m-4.847 8.756c-1.109-.879-1.466-3.453.59-4.61c1.24-.327.419 5.052-.59 4.61m4.266 4.6c-.626.371-2.145.218-3.225-1.31c-.729-1.282-.635-2.587-.123-2.97c.765-.46 1.946.16 2.856 1.2c.792.94 1.153 2.592.492 3.08m-1.242-5.61c-1.148-.74-1.355-2.42-.462-3.75s2.547-1.81 3.695-1.068c1.148.74 1.355 2.42.463 3.75c-.893 1.331-2.547 1.81-3.695 1.069m4.795 8.229c-1.376.058-2.726-1.11-2.708-1.516c-.02-.594 1.676-1.058 2.782-1.03c1.113-.049 2.607.352 2.61.884c.018.517-1.355 1.684-2.684 1.662m2.759-5.858c.008 1.39-1.226 2.522-2.757 2.53c-1.53.007-2.777-1.114-2.785-2.504v-.026c-.008-1.39 1.226-2.523 2.756-2.53s2.778 1.113 2.786 2.503zm3.855 2.003c-1.186 1.62-2.792 1.684-3.39 1.232c-.625-.58-.148-2.385.71-3.374c.98-1.092 2.03-1.804 2.76-1.248c.492.483.78 2.301-.08 3.39m1.072-3.43c-1.009.44-1.83-4.938-.59-4.61c2.057 1.157 1.7 3.73.59 4.61m-.026-8.328h.299v-.53h.299c.15 0 .205.062.226.205c.015.108.011.239.048.325h.298c-.053-.076-.052-.236-.057-.321c-.01-.138-.051-.28-.198-.318v-.004c.15-.06.215-.18.215-.34c0-.206-.154-.375-.397-.375h-.732zm.299-1.126h.327c.133 0 .205.058.205.188c0 .137-.072.194-.205.194h-.327zm-1.034.464a1.27 1.27 0 1 0 2.54 0a1.27 1.27 0 0 0-2.54 0m2.328 0a1.058 1.058 0 1 1-2.116 0a1.058 1.058 0 0 1 2.116 0\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":314},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\"\u002F>\u003Cpath d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":316},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73zm1 .27V12\"\u002F>\u003Cpath d=\"M3.29 7L12 12l8.71-5M7.5 4.27l9 5.15\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":318},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 17V7m4 1h-6a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H8\"\u002F>\u003Cpath d=\"M4 3a1 1 0 0 1 1-1a1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1a1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2a1 1 0 0 1-1-1z\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":320},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 18v-7m1.119-8.795a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949zM14 18v-7m4 7v-7M3 22h18M6 18v-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":322},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2m10 0H9m10 0h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14\"\u002F>\u003Ccircle cx=\"17\" cy=\"18\" r=\"2\"\u002F>\u003Ccircle cx=\"7\" cy=\"18\" r=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":324},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 22v-5m3-9V2m2 6a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1zM9 8V2\"\u002F>",1791781460980]