[{"data":1,"prerenderedAt":293},["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\u002Fiot-wash-stations":24,"project-more:\u002Fprojects\u002Fiot-wash-stations":253,"i-lucide:briefcase-business":275,"i-lucide:calendar":277,"i-simple-icons:raspberrypi":279,"i-lucide:scan-qr-code":281,"i-lucide:fuel":283,"i-lucide:timer":285,"i-lucide:circle-pause":287,"i-lucide:layout-dashboard":289,"i-lucide:sliders-horizontal":291},{"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":236},{"id":26,"title":27,"body":28,"description":227,"extension":228,"meta":229,"navigation":230,"path":231,"seo":232,"sitemap":233,"stem":234,"__hash__":235},"projectPages\u002Fprojects\u002Fiot-wash-stations.md","Iot Wash Stations",{"type":29,"value":30,"toc":211},"minimark",[31,36,40,44,47,70,74,82,88,94,100,104,107,124,128,135,139,143,150,153,158,165,168,172,179,182,186,193,196,200],[32,33,35],"h2",{"id":34},"overview","Overview",[37,38,39],"p",{},"Faris Petrol runs fuel stations in Palestine, and some have car-wash bays. Customers who fuel with a Faris card scan it at the bay, and the pump runs for the wash time they have left that day. As a full-stack developer there since 2019, I designed and built the system behind it, from the circuit at each bay to the server, and it ran at several stations.",[32,41,43],{"id":42},"the-problem","The problem",[37,45,46],{},"Every bay had to know whose card was in front of it and how much time that card had left.",[48,49,50,58,64],"ul",{},[51,52,53,57],"li",{},[54,55,56],"strong",{},"Only for recent customers."," A wash needs a card that fuelled recently, and its daily time is used in turns.",[51,59,60,63],{},[54,61,62],{},"A pump to switch."," A small computer at each bay drives the pump and the lights the customer sees.",[51,65,66,69],{},[54,67,68],{},"A copy on every Pi."," The first version ran the whole system on each Raspberry Pi, with its own data and code.",[32,71,73],{"id":72},"the-solution","The solution",[75,76,79],"sketch-figure",{"alt":77,"name":78},"Before: each bay’s Raspberry Pi ran its own web server, database, logic and GPIO, with its own copy of the data and code. Now: one server holds the data, rules and dashboard and sends commands to a Pi at every bay, which only switches its pump and lights.","iot-wash-stations\u002Fbefore-after",[37,80,81],{},"The Pis no longer run the system: one server decides, and each Pi switches what it is told to.",[37,83,84,87],{},[54,85,86],{},"Checks before every start."," The server asks the company’s card system when the card last fuelled, and keeps the answer for next time. Every run of the pump is logged, so it always knows how much of the day’s time is left.",[37,89,90,93],{},[54,91,92],{},"A circuit at every bay."," A Raspberry Pi drives a relay that switches the pump, and three status lights.",[37,95,96,99],{},[54,97,98],{},"One server for all stations."," I moved the system to one server that sends each bay’s Pi its commands over the network, so the data, the settings and every update live in one place.",[32,101,103],{"id":102},"what-i-did","What I did",[37,105,106],{},"I built this project on my own.",[48,108,109,112,115,118,121],{},[51,110,111],{},"Designed and built it end to end: the bay screen, the server, the staff dashboard and the circuit at each bay.",[51,113,114],{},"Wrote the first version on each Raspberry Pi, then moved it to one server that drives every bay.",[51,116,117],{},"Connected it to the company’s card system, and kept its answers so repeat customers aren’t slowed down.",[51,119,120],{},"Built the wash sessions: daily time, pause and carry on, extra time from staff, and a queued stop job.",[51,122,123],{},"Built the dashboard for every wash, the stations, the bays and their pins, and the settings behind the rules.",[32,125,127],{"id":126},"what-it-offers","What it offers",[75,129,132],{"alt":130,"name":131},"Everything the system does. At the bay: scan or type the card, pause and carry on, status lights, a relay for the pump, one card at a time. On the server: registered bays only, a fuelling check with the Faris card system, cards remembered, a daily wash time, stop on time. In the dashboard: every wash on record, extra time, a bay on or off, stations and bays with their pins, settings.","iot-wash-stations\u002Ffeature-map",[37,133,134],{},"What the customer touches at the bay, the rules the server applies, and what staff control from the dashboard.",[136,137],"feature-grid",{":items":138},"[{\"icon\":\"lucide:scan-qr-code\",\"title\":\"Scan to start\",\"text\":\"Customers scan their Faris card at the bay, or type its number.\"},{\"icon\":\"lucide:fuel\",\"title\":\"For customers who fuel\",\"text\":\"Only a card that fuelled recently starts the pump.\"},{\"icon\":\"lucide:timer\",\"title\":\"A wash time for the day\",\"text\":\"Each card’s daily time is used in turns, then the pump stops.\"},{\"icon\":\"lucide:circle-pause\",\"title\":\"Pause and carry on\",\"text\":\"Scanning again pauses the wash, and the next scan carries on.\"},{\"icon\":\"lucide:layout-dashboard\",\"title\":\"Every wash on record\",\"text\":\"Staff see each wash by station, bay, card and customer.\"},{\"icon\":\"lucide:sliders-horizontal\",\"title\":\"Control from the dashboard\",\"text\":\"Staff add extra time, switch a bay on or off and change the rules.\"}]",[32,140,142],{"id":141},"system-design","System design",[75,144,147],{"alt":145,"name":146},"Architecture: the bay screen sends the scanned card number to one server for all stations. The server checks the bay, asks the Faris card system about recent fuelling when its own record is too old, opens a session and queues a stop job, then sends GPIO commands to the bay’s Raspberry Pi, which switches the pump’s relay and three lights. Staff use a dashboard on the same server, with a database and a queue behind it.","iot-wash-stations\u002Farchitecture",[37,148,149],{},"The bays hold no data: the server decides, and the Pi at the bay switches.",[37,151,152],{},"One server runs every station. A bay’s screen sends it the card number, and the server checks the bay, the card and the time left before it tells that bay’s Pi to start the pump.",[154,155,157],"h3",{"id":156},"from-a-scan-to-a-running-pump","From a scan to a running pump",[75,159,162],{"alt":160,"name":161},"Flow: scan the Faris card, then three checks in order: a registered bay, recent fuelling (local record first, then the card system) and time left today; each failed check refuses the wash. Then the pump starts and a stop job is queued. While it runs, scanning again pauses it, scanning later carries on, and the queued job stops the pump at the end of a turn.","iot-wash-stations\u002Fscan-flow",[37,163,164],{},"Every refusal happens before the pump starts, and every start has a job waiting to stop it.",[37,166,167],{},"The checks run in a fixed order: the bay, the card, then the time left. Every start queues a job that switches the pump off at the end of the turn, even if nobody scans again.",[154,169,171],{"id":170},"the-circuit-at-every-bay","The circuit at every bay",[75,173,176],{"alt":174,"name":175},"A Raspberry Pi with its 40-pin header takes commands from the server over the network; the bay screen and scanner are plugged into it. Pin 2 gives 5V and pin 6 ground. Pins 8, 10 and 12 drive red (stopped), yellow (warning) and green (running) lights through resistors. Pin 18, highlighted, drives the relay that switches the pump. Pin 32 reads a push button.","iot-wash-stations\u002Fhardware",[37,177,178],{},"The highlighted path is the one that matters: pin 18 drives the relay that switches the pump.",[37,180,181],{},"The relay switches the pump’s power, and the lights tell the customer whether it is running. The pins are set per bay in the dashboard, so a bay wired differently needs no change to the code.",[154,183,185],{"id":184},"one-server-for-all-stations","One server for all stations",[75,187,190],{"alt":188,"name":189},"Stations and their bays are registered in the dashboard, each bay with its address and pins. For every change the server connects to that bay’s Pi, sets the pump and lights, and closes the connection. The Pis hold no data and no rules.","iot-wash-stations\u002Fone-server",[37,191,192],{},"Every Pi is the same; the dashboard says where it is and which pins it uses.",[37,194,195],{},"Each bay’s Pi is recognised by its network address, so the server knows which pump to switch. The result: one copy of the data, one place to update, and every wash in one dashboard.",[32,197,199],{"id":198},"in-the-product","In the product",[201,202,208],"project-shot",{":single":203,"alt":204,"height":205,"src":206,"width":207},"true","A breadboard wiring drawing: a Raspberry Pi 3 with pins 2 and 6 for 5V and ground, pins 8, 10 and 12 to three lights through resistors, pin 32 to a push button, and pin 18 to a relay module labelled in Arabic “the load or machine”, beside the Pi’s pin map.",737,"\u002Fprojects\u002Fiot-wash-stations\u002Fcircuit.webp",1280,[37,209,210],{},"My original wiring drawing for a bay, with the Raspberry Pi’s pin map beside it.",{"title":212,"searchDepth":213,"depth":213,"links":214},"",2,[215,216,217,218,219,220,226],{"id":34,"depth":213,"text":35},{"id":42,"depth":213,"text":43},{"id":72,"depth":213,"text":73},{"id":102,"depth":213,"text":103},{"id":126,"depth":213,"text":127},{"id":141,"depth":213,"text":142,"children":221},[222,224,225],{"id":156,"depth":223,"text":157},3,{"id":170,"depth":223,"text":171},{"id":184,"depth":223,"text":185},{"id":198,"depth":213,"text":199},"How I linked Faris Petrol’s wash bays to its card system: a customer scans their Faris card, the server checks they fuelled recently, and a Raspberry Pi at the bay runs the pump for their wash time.","md",{},true,"\u002Fprojects\u002Fiot-wash-stations",{"description":227},{"loc":231},"projects\u002Fiot-wash-stations","da8kXcfo3s7KWgXF59vLKRBnZOiVtjIkCZ1v0HYNaW4",{"id":237,"title":238,"context":239,"description":240,"extension":241,"highlight":242,"links":246,"mark":247,"meta":249,"order":250,"stem":234,"year":251,"__hash__":252},"projects\u002Fprojects\u002Fiot-wash-stations.yml","IoT car-wash stations","Faris Petrol · Dec 2022 – Jan 2023","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.","yml",{"title":238,"description":243,"period":244,"order":245},"A Raspberry Pi at every wash bay, driven by one server that checks the Faris card and runs the pump for the time left.","2022",5,[],{"icon":248},"simple-icons:raspberrypi",{},1,2022,"iuJiRqSp7UB1c9FbymVVgt6vJRK9CdwZ0YySggf4nDc",[254,261,268],{"path":255,"title":256,"description":257,"mark":258,"year":260},"\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":259},"runarks",2026,{"path":262,"title":263,"description":264,"mark":265,"year":267},"\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":266},"sanad",2024,{"path":269,"title":270,"description":271,"mark":272,"year":274},"\u002Fprojects\u002Fwinch","WINCH · Saudi logistics platform","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.",{"logo":273},"winch",2023,{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":276},"\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":278},"\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":280},"\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":282},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M17 12v4a1 1 0 0 1-1 1h-4m5-14h2a2 2 0 0 1 2 2v2m-4 1V7m4 10v2a2 2 0 0 1-2 2h-2M3 7V5a2 2 0 0 1 2-2h2m0 14h.01M7 21H5a2 2 0 0 1-2-2v-2\"\u002F>\u003Crect width=\"5\" height=\"5\" x=\"7\" y=\"7\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":284},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M14 13h2a2 2 0 0 1 2 2v2a2 2 0 0 0 4 0v-6.998a2 2 0 0 0-.59-1.42L18 5m-4 16V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v16m-1 0h13M3 9h11\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":286},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 2h4m-2 12l3-3\"\u002F>\u003Ccircle cx=\"12\" cy=\"14\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":288},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M10 15V9m4 6V9\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":290},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"7\" height=\"9\" x=\"3\" y=\"3\" rx=\"1\"\u002F>\u003Crect width=\"7\" height=\"5\" x=\"14\" y=\"3\" rx=\"1\"\u002F>\u003Crect width=\"7\" height=\"9\" x=\"14\" y=\"12\" rx=\"1\"\u002F>\u003Crect width=\"7\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":292},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 5H3m9 14H3M14 3v4m2 10v4m5-9h-9m9 7h-5m5-14h-7m-6 5v4m0-2H3\"\u002F>",1791781461067]