From 9bd7dfe9245e64b2fb5e7c40e8183631fb57b842 Mon Sep 17 00:00:00 2001 From: StaRainorigin <1343026891@qq.com> Date: Wed, 15 Nov 2023 16:24:13 +0800 Subject: [PATCH] official website complete --- README.md | 2 +- source/embassy.dev/Embassy.html | 295 +++++++++++++++++++ source/embassy.dev/Embassy_files/abridge.css | 1 + 3 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 source/embassy.dev/Embassy.html create mode 100644 source/embassy.dev/Embassy_files/abridge.css diff --git a/README.md b/README.md index 6e3eba4..b73b4a9 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ | 原章节 | 译者 | 状态 | 校对 | | --- | --- | --- | --- | -| [主页](https://embassy.dev/) | | | | +| [主页](https://embassy.dev/) | [StaRainorigin](https://github.com/StaRainorigin) | 已完成 | | | [Embassy](https://embassy.dev/book/dev/index.html) | [ziyouwa](https://github.com/ziyouwa/) | 已完成 | | | [Getting started](https://embassy.dev/book/dev/getting_started.html) | [ziyouwa](https://github.com/ziyouwa/) | 已完成 | | | [Basic application](https://embassy.dev/book/dev/basic_application.html) | [ziyouwa](https://github.com/ziyouwa/) | 已完成 | | diff --git a/source/embassy.dev/Embassy.html b/source/embassy.dev/Embassy.html new file mode 100644 index 0000000..a09d8c4 --- /dev/null +++ b/source/embassy.dev/Embassy.html @@ -0,0 +1,295 @@ + + + + + + + + Embassy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+

下一代嵌入式应用框架

+

通过使用Rust编程语言、其异步功能以及Embassy库,更快地编写安全、正确且节能的嵌入式代码。

+
+ 马上开始 +
+
+
+
+

Rust + async ❤️ 嵌入式

+

+ Rust编程语言具有极快的执行速度和高效的内存利用,且不依赖运行时、垃圾回收器或操作系统。得益于其完善的内存与线程安全性以及表达性强大的类型系统,它在编译时就能够捕捉到多种类型的错误。 +

+

+ Rust 的异步/等待(async/await)机制在嵌入式系统中提供了前所未有的轻松且高效的多任务处理方式。任务会在编译时被转换成能够协作运行的状态机。同时,它不需要动态内存分配,且能在单一堆栈上运行,因此不需要对每个任务的堆栈大小进行调整。它淘汰了传统实时操作系统(RTOS)对内核上下文切换的的需求,并且在速度和占用空间上都更快更小。 +

+ +
+
+
use defmt::info;
+use embassy::executor::Spawner;
+use embassy::time::{Duration, Timer};
+use embassy_nrf::gpio::{AnyPin, Input, Level, Output, OutputDrive, Pin, Pull};
+use embassy_nrf::Peripherals;
+
+// Declare async tasks
+#[embassy::task]
+async fn blink(pin: AnyPin) {
+    let mut led = Output::new(pin, Level::Low, OutputDrive::Standard);
+
+    loop {
+        // Timekeeping is globally available, no need to mess with hardware timers.
+        led.set_high();
+        Timer::after(Duration::from_millis(150)).await;
+        led.set_low();
+        Timer::after(Duration::from_millis(150)).await;
+    }
+}
+
+// Main is itself an async task as well.
+#[embassy::main]
+async fn main(spawner: Spawner, p: Peripherals) {
+    // Spawned tasks run in the background, concurrently.
+    spawner.spawn(blink(p.P0_13.degrade())).unwrap();
+
+    let mut button = Input::new(p.P0_11, Pull::Up);
+    loop {
+        // Asynchronously wait for GPIO events, allowing other tasks
+        // to run, or the core to sleep.
+        button.wait_for_low().await;
+        info!("Button pressed!");
+        button.wait_for_high().await;
+        info!("Button released!");
+    }
+}
+
+ +
+
+ +
+

包含的组件

+
+ + +
+
+

硬件抽象层

+

+ HAL提供了安全易用的接口来操作硬件,无需再对原始寄存器进行操作。 +

+

+ Embassy维护了下列硬件的HAL,但它并不局限于此,您可以在任何使用Embassy的项目中使用HAL。 +

    +
  • embassy-stm32, 支持STM32微控制器系列
  • +
  • embassy-nrf, 支持北欧半导体公司(the Nordic Semiconducotr)的nRF52、nRF53、nRF91系列
  • +
+
+
+

简单易用的时间处理

+

+ 不再为硬件定时器所烦恼embassy::time + 提供了全局可用且不会溢出的 Instant、Duration 和 Timer 类型。 +

+
+
+

可靠的实时性

+

+ 相同的异步执行器上的任务以相互协调的方式运行。但您可以创建多个具有不同优先级的执行器,使更高优先级的任务可以抢占较低优先级任务的运行。具体请参见示例。 +

+
+

低能耗

+

轻松构建电池寿命更长的设备。. +

+ 异步执行器闲置时自动将核心置于睡眠状态。任务可通过中断将其唤醒,无需在等待时进行忙等轮询(busy-loop polling)。 +

+
+

网络

+

embassy-net 实现了常用的网络功能,包括以太网、IP、TCP、UDP、ICMP和DHCP。在管理超时和同时为多个连接提供服务方面,Async做了高度简化,提供了很大的便利。 +

+
+

蓝牙

+

nrf-softdevice 为nRF52微控制器提供蓝牙低能耗4.x和5.x支持 +

+
+

LoRa

+

embassy-lora 支持STM32WL无线微控制器和Semtech SX127x收发器上的LoRa网络。 +

+
+

USB

+

embassy-usb i实现了设备侧的USB堆栈。实现了通用类(如USB串行(CDC ACM),支持USB HID,并且提供丰富的构建器API方便构建您自己的实现。 +

+
+

Bootloader and DFU

+

embassy-boot 是一个轻量级的启动器,它支持固件加载,支持以电源故障安全的方式升级固件,支持试用引导和回滚。 +

+
+ + + + +
+ + + + \ No newline at end of file diff --git a/source/embassy.dev/Embassy_files/abridge.css b/source/embassy.dev/Embassy_files/abridge.css new file mode 100644 index 0000000..51bf659 --- /dev/null +++ b/source/embassy.dev/Embassy_files/abridge.css @@ -0,0 +1 @@ +:root{--ff: system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif;--fm: Menlo, Consolas, "Roboto Mono", "Ubuntu Monospace", "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace;--lh: 1.5;--lhh: 1.2;--fs: 1rem;--fw: 400;--fh: 700;--f1: #555;--f2: #333;--c1: #fff;--c2: #eee;--c3: #ddd;--c4: #777;--af: rgb(255, 255, 255);--ab: rgb(0, 165, 52);--a1: rgb(0, 169, 53);--a2: rgb(11, 115, 44);--a3: rgb(16, 145, 57);--cg: #483;--cr: #d33;--s1: 1rem;--s2: 2rem;--rc: .5rem;--br: 0.25rem;--bw: 0.0625rem;--ow: 0.1875rem}@media (min-width: 576px){:root{--fs: 1rem}}@media (min-width: 768px){:root{--fs: 1.04rem}}@media (min-width: 992px){:root{--fs: 1.08rem}}@media (min-width: 1200px){:root{--fs: 1.12rem}}@media (prefers-color-scheme: dark){:root{--a1: rgb(0, 206, 65);--a2: rgb(83, 255, 137);--a3: rgb(83, 255, 137);--f1: #ccc;--f2: #ddd;--c1: #111;--c2: #222;--c3: #333;--c4: #888}}*,*::before,*::after{box-sizing:border-box}html{text-rendering:optimizeLegibility;background-color:var(--c1);color:var(--f1);font-family:var(--ff);font-weight:var(--fw);font-size:var(--fs);line-height:var(--lh)}h1,h2,h3,h4,h5,h6{padding-left:0;color:var(--f2);margin-bottom:var(--s1);margin-top:var(--s2);font-weight:var(--fh);font-size:var(--fs);line-height:var(--lhh)}h1{font-size:2rem}h2{font-size:1.75rem}h3{font-size:1.5rem}h4{font-size:1.25rem}h5{font-size:1.125rem}header h1{margin-top:0}a{color:var(--a1);text-decoration:none}a:hover{color:var(--a2);text-decoration:underline}h1 a,h2 a,main nav a{color:var(--f2);text-decoration:none}h1 a:hover,h2 a:hover,main nav a:hover{color:var(--a3);text-decoration:none}article{padding-bottom:.2rem}abbr[title]{border-bottom:var(--bw) dotted;text-decoration:none;cursor:help}mark{background-color:var(--c4);color:var(--c1);vertical-align:baseline;padding:.1rem .4rem}blockquote{margin-left:0;padding:.5rem 0 .5rem 1.5rem;border-left:0.25rem solid var(--c3)}blockquote>:last-child{margin-bottom:0}small{font-size:.875rem}sub,sup{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,figure,form,ol,p,pre,table,ul{margin:var(--s1) 0;color:var(--f1);font-style:normal;font-weight:var(--fw);font-size:var(--fs)}ul,ol{padding-right:0;padding-left:var(--s2)}ul li,ol li{margin-bottom:var(--s1)}ul li{list-style:square}ins{color:var(--cg);text-decoration:none}del{color:var(--cr)}body{width:100%;margin:0}body>header,body>main,body>footer{width:100%;margin-right:auto;margin-left:auto;padding:var(--s1)}@media (min-width: 1200px){body>header,body>main,body>footer{min-width:1200px;max-width:60%}}body header,body main{padding-top:0;margin-top:0;padding-bottom:0;margin-bottom:0}body header hr,body main hr{margin:0.1rem 0}body footer hr{margin:0.5rem 0}main nav a,main nav a:visited{font-weight:var(--fh);border:0.1rem solid var(--f2);border-radius:var(--br);padding:0.3rem var(--s1);margin:var(--s1)}main nav a:hover{border-color:var(--a3)}nav{align-items:center;display:flex;justify-content:space-between}nav div{display:block;margin-left:auto}nav div ul{line-height:0;margin-top:0;padding-bottom:var(--s1)}nav div h2{font-size:1rem}nav div h2:hover{color:var(--a3)}nav header{display:inline}nav header h1,nav div ul{margin-bottom:0}nav ul li{display:inline-block;margin:0 0.8rem;position:relative;text-align:left}@media (max-width: 768px){header nav{display:flex;flex-direction:column}header nav header{text-align:center}header nav div{margin:auto}}img,video,svg{max-width:100%;height:auto}embed,iframe,object{max-width:100%}iframe{border-style:none;width:100%;height:100%;border:0;overflow:hidden}table{border-collapse:collapse;width:100%;text-indent:0}table caption{margin-bottom:.5rem}tr{border-bottom:var(--bw) solid var(--c3)}td,th{padding:var(--s1)}th{text-align:left}table tbody tr:nth-child(even){background-color:var(--c2)}table thead tr{border-top:var(--bw) solid var(--c3);background-color:var(--c2)}pre,code,kbd,samp,tt,var{border-radius:var(--br);background:var(--c2);font-family:var(--fm);line-height:initial;font-size:.8rem;padding:.3rem .2rem}pre{display:block;overflow-x:auto;-ms-overflow-style:scrollbar;white-space:pre}pre>code{display:block;background:transparent}kbd{background-color:var(--f2);color:var(--c1);vertical-align:baseline;font-size:1rem;padding:.2rem}hr{box-sizing:content-box;height:0;overflow:visible;border:none;border-top:1px solid var(--f1)}header hr,footer hr{border-top:1px solid var(--c4)}main .toc{max-width:260px;min-width:240px;margin-left:var(--s1)}main .toc-item{padding:.4rem 0;color:var(--f1)}main .toc-item a,main .toc-item-child a{color:var(--f1)}main .toc-item a:hover,main .toc-item-child a:hover{cursor:pointer;color:var(--a2);text-decoration:underline}main .toc-item a.active,main .toc-item-child a.active{color:var(--a2)}main .toc-item-child{padding:0 var(--s1);color:var(--f1)}.toc-sticky{border-radius:var(--br);border-top:5px solid var(--a1);background-color:var(--c2);position:sticky;top:var(--s2);margin-top:var(--s2);padding:0 var(--s2) var(--s2);max-height:100vh;overflow:auto}@media (max-width: 768px){.toc{display:none}}a.button,button,[type="button" i],[type="submit" i],[type="reset" i]{display:inline-block;text-align:center;white-space:nowrap;margin:0;padding:.5rem .75rem;max-width:100%;border:0;border-radius:.25rem;font-weight:bold;background:var(--ab);color:var(--af);border:0;transition:background-color .25s}a.button:hover,button:hover,[type="button" i]:hover,[type="submit" i]:hover,[type="reset" i]:hover{background:var(--a1)}a.button.disabled,button[disabled],[type="button" i][disabled],[type="submit" i][disabled],[type="reset" i][disabled]{opacity:.5}.bitbucket{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%232684ff' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M3.648 4a.64.64 0 0 0-.64.744l3.14 14.528c.07.417.43.724.852.728h10a.644.644 0 0 0 .642-.539l3.35-14.71a.641.641 0 0 0-.64-.744L3.648 4z'/%3E%3Cpath d='M14 15h-4L9 9h6z'/%3E%3C/svg%3E")}.docker{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%232391e5' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M22 12.54c-1.804-.345-2.701-1.08-3.523-2.94-.487.696-1.102 1.568-.92 2.4.028.238-.32 1.002-.557 1H3c0 5.208 3.164 7 6.196 7 4.124.022 7.828-1.376 9.854-5 1.146-.101 2.296-1.505 2.95-2.46z'/%3E%3Cpath d='M5 10h3v3H5zM8 10h3v3H8zM11 10h3v3h-3zM8 7h3v3H8zM11 7h3v3h-3zM11 4h3v3h-3zM4.571 18c1.5 0 2.047-.074 2.958-.78M10 16v.01'/%3E%3C/svg%3E%0A")}.element{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%230dbd8b' viewBox='0 0 24 24'%3E%3Cpath d='M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm-1.314 4.715c3.289 0 5.956 2.66 5.956 5.943a.879.879 0 0 1-1.758 0 4.194 4.194 0 0 0-4.198-4.189.878.878 0 1 1 0-1.754zm-5.092 9.504a.879.879 0 0 1-.879-.877 5.95 5.95 0 0 1 5.956-5.945.878.878 0 1 1 0 1.753 4.195 4.195 0 0 0-4.198 4.191.88.88 0 0 1-.879.878zm7.735 5.067c-3.29 0-5.957-2.662-5.957-5.944a.88.88 0 0 1 1.758 0 4.194 4.194 0 0 0 4.199 4.189.879.879 0 1 1 0 1.755zm0-2.683a.88.88 0 0 1-.88-.876.88.88 0 0 1 .88-.878 4.195 4.195 0 0 0 4.199-4.19.878.878 0 0 1 1.758 0c0 3.282-2.667 5.944-5.957 5.944z'/%3E%3C/svg%3E")}.facebook{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23395498' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z'/%3E%3C/svg%3E")}.github{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23888' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22'/%3E%3C/svg%3E")}.gitlab{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23ef6824' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M22.65 14.39 12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z'/%3E%3C/svg%3E")}.instagram{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23e90077' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Crect x='2' y='2' width='20' height='20' rx='5' ry='5'/%3E%3Cpath d='M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37zM17.5 6.5h.01'/%3E%3C/svg%3E")}.linkedin{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%232362aa' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6zM2 9h4v12H2z'/%3E%3Ccircle cx='4' cy='4' r='2'/%3E%3C/svg%3E")}.mail{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23888' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z'/%3E%3Cpath d='m22 6-10 7L2 6'/%3E%3C/svg%3E")}.mastodon{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%232989ce' viewBox='0 0 24 24'%3E%3Cpath d='M1.004 7.879c0 6.197-.347 13.894 5.559 15.486 2.132.574 3.964.696 5.438.61 2.674-.15 4.175-.969 4.175-.969l-.09-1.977s-1.911.61-4.059.54c-2.127-.075-4.37-.235-4.717-2.892a5.514 5.514 0 0 1-.047-.745c4.507 1.12 8.349.488 9.408.359 2.954-.359 5.528-2.212 5.855-3.905.515-2.667.474-6.508.474-6.508 0-5.206-3.353-6.733-3.353-6.733-3.291-1.537-12.029-1.521-15.288 0-.002.002-3.355 1.528-3.355 6.734zm4.923-2.667c1.363-1.548 4.201-1.65 5.465.327l.611 1.044.611-1.044c1.269-1.987 4.112-1.864 5.465-.327 1.248 1.463.969 2.838.969 9.373h-2.455V8.469c0-2.662-3.369-2.764-3.369.369v3.348h-2.437V8.838c0-3.133-3.369-3.031-3.369-.369v6.117H4.959c0-6.54-.274-7.922.968-9.374z'/%3E%3C/svg%3E")}.pinterest{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23b7081c' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='m8 20 4-9m-1.3 3c.437 1.263 1.43 2 2.55 2 2.071 0 3.75-1.554 3.75-4a5 5 0 1 0-9.7 1.7'/%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3C/svg%3E")}.python{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23f2ca45' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M12 9H5a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h3M12 15h7a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3'/%3E%3Cpath d='M8 9V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2v-4M11 6v.01M13 18v.01'/%3E%3C/svg%3E")}.rss{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23eb9036' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16'/%3E%3Ccircle cx='5' cy='19' r='1'/%3E%3C/svg%3E")}.stack{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23e77923' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M4 17v1a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-1M8 16h8M8.322 12.582l7.956.836M8.787 9.168l7.826 1.664M10.096 5.764l7.608 2.472'/%3E%3C/svg%3E")}.twitch{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23a970ff' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7'/%3E%3C/svg%3E")}.twitter{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%232ba5da' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z'/%3E%3C/svg%3E")}.youtube{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='%23f00' stroke-width='2' fill='none' viewBox='0 0 24 24'%3E%3Cpath d='M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z'/%3E%3Cpath d='m9.75 15.02 5.75-3.27-5.75-3.27v6.54z'/%3E%3C/svg%3E")}.svg{width:1.5rem;height:1.5rem;display:inline-block;overflow:hidden;vertical-align:middle}div.row{display:flex;flex-flow:row wrap;column-gap:30px}div.row>div{flex:1}div.grid{display:grid;grid-template-columns:33% 33% 33%;column-gap:30px;row-gap:30px}